>しかし、ヘルプを見ても、"正しいインポートファイルの例です"にもありませんでした
ユーザアップロード用のプログラムを修正する必要があります。
下記プログラム修正をお試しください。

修正対象プログラム: admin/uploaduser.php
修正箇所: 277行目
[修正前]
} else { // new user
insert_record('user_preferences', array( userid => $user->id,
value => 1));
value => 1));
[修正後]
} else { // new user
insert_record('user_preferences', array( userid => $user->id,
value => 1));
value => 1));
吉田様
こんにちは
毎回、ご指導ありがとうございます
phpの修正プログラムをありがとうございます
しかし、残念ながら、私には開発者権限がありません
その為、開発者に吉田様の修正プログラムを送り、変更をしてもらいます
ありがとうございます
手順は下記のとおりです。
1. ユーザアップロード用のテキストファイルを作成する。
username, firstname, lastname, email
user001, firstname001, lastname001, user001@moodleuser.com
user002, firstname002, lastname002, user002@moodleuser.com
2. Moodleサイトで「管理 > ユーザ > アカウント > ユーザのアップロード」に移動する。
3. 1.で作成したアップロード用のファイルを選択する。
4. アップロードオプションを選択する。
既存のアカウントを更新する: No
リネームを許可する: No
6. cronによる仮パスワードの自動発行
ユーザアップロード用のテキストファイルで指定されたメールアドレス宛に
ユーザIDおよび仮パスワードを記載した「パスワードの変更を促すメール」を
送信します。
吉田様
こんにちは
出来ました!
お陰さまで、出来ました
何度も、また毎回ご指導を戴きまして、ありがとうございます
これからも宜しくお願い致します

> 何度も、また毎回ご指導を戴きまして、ありがとうございます
どういたしまして。

このJapanese Moodleコースに「質問と答え」を蓄積することで、Moodleをご利用頂いています数多くの方々への有益な情報となります。
どのような内容でも、お気軽にご質問ください。
こんにちは
今更ながら、追加で質問させて下さい
吉田様の例で登録を行った時、user001の方のパスワードは何になるのでしょうか?
例)
username, firstname, lastname, email
user001, firstname001, lastname001, user001@moodleuser.com
・ユーザ名:user001
・パスワード:???
パスワードに「ユーザ名」を入れたり、「ブランク」にしたりしましたが、ログインできませんでした
やはり、大勢のユーザに"パスワードの変更を強制"して、リスト登録するのは、難しいのでしょうか
残念ですが、パスワードの推測はできないようです。
lib/wordlist.txtに登録されているデータを基に、lib/moodlelib.phpの5889行目の関数「generate_password()」で任意のパスワードが生成されます。
フォーラム等の投稿内容を定期的にメール送信する機能を持ったプログラムadmin/cron.phpが、前述の生成済みパスワードをユーザ宛にメール送信します。
この場合、ユーザに対して「パスワード変更を強制」しますが、仮パスワードの提示も含めて、そのインストラクションは各ユーザに送信されるメールに個別記載されています。ですから、そのメールを受信しない限り、どのようなパスワードが設定されたのか知ることはできません。
> やはり、大勢のユーザに"パスワードの変更を強制"して、リスト登録するのは、難しいのでしょうか
下記プログラム修正により可能だと思います。

http://moodle.org/mod/forum/discuss.php?d=84635&parent=374032
前々からFAQとして出ているユーザアップロード時のファイルコードの問題ですが,もしかしたらadmin/uploaduser.phpの以下の修正を行うとExcelから出力したCSVファイルをそのまま読み込めるようになりませんか?
$text = my_file_get_contents($filename);
//trim utf-8 bom
$textlib = new textlib();
$text = $textlib->trim_utf8_bom($text);
$text = mb_convert_encoding($text, 'UTF-8', 'auto'); // (ADD)
//Fix mac/dos newlines
$text = preg_replace('!\r\n?!',"\n",$text);
$fp = fopen($filename, "w");
fwrite($fp,$text);
fclose($fp);
Moodle1.8.3+のadmin/uploaduser.phpの70行目近辺です.
更に,このコードを見る限りでは,メモ帳などが出力するBOM (Byte Order Mark)を除去するコードが入っているように見えます.Moodle1.7のソースコード(2月頃)を見ると trim_utf8_bom()が入っていませんので,どこかの段階でこのコードが追加されたのでしょう.だとするとメモ帳(Notepad.exe)の出力も読み込めそうです.
ちなみに,上記コードは未確認です.
これもまた未確認(スミマセン,いまはユーザ登録の時期ではないので...)ですが,
(1) 12行目近辺
$createpassword = optional_param('createpassword', 0, PARAM_BOOL);
$updateaccounts = optional_param('updateaccounts', 0, PARAM_BOOL);
$allowrenames = optional_param('allowrenames', 0, PARAM_BOOL);
$forcechangepassword = optional_param('forcechangepassword', 0, PARAM_BOOL); // (ADD)require_login();
(2) 280行目近辺
if ($user->id = insert_record("user", $user)) {
notify("$struser: $user->id = $user->username");
$usersnew++;
// if (empty($user->password) && $createpassword) {
if ((empty($user->password) && $createpassword) || $forcechangepassword) {
// passwords will be created and sent out on cron
insert_record('user_preferences', array( userid => $user->id,
name => 'create_password',
value => 1));
insert_record('user_preferences', array( userid => $user->id,
name => 'auth_forcepasswordchange',
value => 1));
}
(3) 409行目近辺
echo '<tr><td>' . get_string('allowrenames', 'admin') . '</td><td>';
choose_from_menu($noyesoptions, 'allowrenames', $allowrenames);
echo '</td></tr>';echo '<tr><td>' . 'パスワードの変更を強制する' . '</td><td>'; // (ADD)
choose_from_menu($noyesoptions, 'forcechangepassword', $forcechangepassword); // (ADD)
echo '</td></tr>'; // (ADD)
echo '</table><br />';
echo '<input type="submit" value="'.$struploadusers.'" />';
echo '</div></form><br />';
echo '</div>';
このような感じで,フォームの入力を一つ追加するのも可能かな?(フォームが追加されること,初期値がNoになることは確認)
この場合,アップロードファイルに入力済みのパスワードはどうなるのか,は推測に過ぎませんが,多分,無視されて新しい自動生成されたパスワードが設定されるのですよね?(吉田さん,正しいですか?) 「パスワードはユーザ名と同じだからね.ログインしたら直ぐに修正して!」は運用上,楽なのですが,セキュリティ上は非常にキケンですからねぇ.「オレのパスワードは1111だ」などと勘違いして豪語する学生もたまに居るし.
前々から,私もこういうオプションはあった方が良いと感じていました.ただ,ユーザ登録は年に1回(私は過去に1回のみ)しか行わないので,喉もと過ぎたらナントヤラでした.
こんにちは
お返事が送れて申し訳ありません(風邪で休んでいました)
さて、沢山の助言を戴きまして、ありがとうございます
私なりの結論を申し上げます
将来的には、プログラム修正を行いたいと思います
修正につきましては、吉田様と白井様の内容を開発者に見せ、相談いたします
現状案と致しまして、以下の手順で回避できる事が分かりました
1)ユーザアップロード用のテキストファイルを作成する。
例)
username, firstname, lastname, email
user001, firstname001, lastname001, user001@moodleuser.com
user002, firstname002, lastname002, user002@moodleuser.com
2)”パスワードフィールドの取り扱い: 必要に応じてパスワードを作成する” を設定してアップロードする
吉田様、ご指導の内容:2007年 11月 16日(金曜日) 18:47
3)ユーザアップロード用のテキストファイルにパスワードを追加する
例)
username, password, firstname, lastname, email
user001, user001, firstname001, lastname001, user001@moodleuser.com
user002, user002, firstname002, lastname002, user002@moodleuser.com
4)”既存のアカウントを更新する:Yes” に設定して再度アップロードする
2度のアップロード作業ですが、プログラム修正なしで
・”パスワードの変更を強制”にチェックを入れ
・特定のパスワードを指定する
事が出来ました
しかし、作業的には2倍掛かるので、将来的にはプログラム修正が必要と考えます
皆様、沢山のアドバイスをお寄せくださり、ありがとうございました
あまりにも無責任なので”パスワードの強制”を試してみました.
まず,ユーザアップロードファイルのpasswordは無視されると書きましたが,これは私の間違いで,例えば,username が test1 で password が pass1 ならば,pass1は有効です.test1のユーザがpass1でログイン後に,新しいパスワードへの変更画面が出ました.ですので,”お手軽なパスワードを設定”も可能ですね.
もっとも,原因は私が,
if ((empty($user->password) && $createpassword) || $forcechangepassword) {
と甘い条件にしたせいです. || を && にし,さらに$user->passwordをemptyにし,$createpasswordをtrueにすれば,password欄は無視されます.
”必要に応じてパスワードを作成する”を選択すれば希望通りに”自動生成したパスワード”が送られるはずです.
ちなみに上記修正ですが,新しくユーザを追加する場合は”パスワード変更の強制”が可能ですが,更新の場合はダメですね.
insert_record('user_preferences', array( userid => $user->id,
name => 'create_password',
value => 1));
insert_record('user_preferences', array( userid => $user->id,
name => 'auth_forcepasswordchange',
value => 1));を
update_record('user_preferences', array( userid => $user->id,
name => 'create_password',
value => 1));
update_record('user_preferences', array( userid => $user->id,
name => 'auth_forcepasswordchange',
value => 1));
に変更して,一つ上のブロックに正しく組み込めば可能なような気もしますが...ちょっと自信が無いです.
(2) の修正箇所を拡大して,$olduserが存在した場合かつ$updateacocountsがtrueの場合にも修正を適用しました.
if ($olduser = get_record("user", "username", $username, "mnethostid", $user->mnethostid)) {
if ($updateaccounts) {
// Record is being updated
$user->id = $olduser->id;
if (update_record('user', $user)) {
notify("$user->id , $user->username ".get_string('useraccountupdated', 'admin'));
$usersupdated++;
} else {
notify(get_string('usernotupdatederror', 'error', $username));
$userserrors++;
continue;
}
if ($forcechangepassword) { // (ADD)
update_record('user_preferences', array( userid => $user->id, // (ADD)
name => 'auth_forcepasswordchange', // (ADD)
value => 1)); // (ADD
} // (ADD)
} else {
//Record not added - user is already registered
//In this case, output userid from previous registration
//This can be used to obtain a list of userids for existing users
notify("$olduser->id ".get_string('usernotaddedregistered', 'error', $username));
$userserrors++;
}} else { // new user
if ($user->id = insert_record("user", $user)) {
notify("$struser: $user->id = $user->username");
$usersnew++;
if (empty($user->password) && $createpassword) {
// passwords will be created and sent out on cron
insert_record('user_preferences', array( userid => $user->id,
name => 'create_password',
value => 1));
insert_record('user_preferences', array( userid => $user->id,
name => 'auth_forcepasswordchange',
value => 1));
}
if ($forcechangepassword) { // (ADD)
update_record('user_preferences', array( userid => $user->id, // (ADD)
name => 'auth_forcepasswordchange', // (ADD)
value => 1)); // (ADD
} // (ADD)
} else {
取り敢えずいまのところは大丈夫そうです.エラーチェックがあまり強くない(update_record()の失敗などをチェックしていないように見える)のが気になりますが.
かなり開き直って,”パスワードの変更を強制するならばドンと来い”式(?)です.その分,シンプルです.ちなみに赤いブロックは上も下も全く同一内容です.
アップロード登録を行う必要があったため、修正を参考にさせて頂いたのですが、現在のコードでは更新時に少し問題があるようです。
更新時にupdate_record()を用いているため、user_preferencesに該当行がない場合(例えばアップロード登録を行ったユーザ)は値が設定されないようです。
moodleの他のコードを調べてみたところ、set_user_preference()という専用の関数が存在しました。この関数では、既存データが存在した場合は更新、存在しない場合は挿入という処理を行ってくれるようですので、こちらを用いた方が安全ではないかと思います。
if ($forcepasswordchange) {
set_user_preference("auth_forcepasswordchange", 1, $user->id);
}
手元で試した限りでは、この関数で新規・更新ともに問題なく動きました。
(念のため修正内容全体のdiffを添付しています。)
lib/moodlelib.phpの724行にある関数set_user_preference/3ですね.
なるほど,確かに$nameで指定したレコードが存在しない場合は新しく作成していますね.自分でもコメントでupdateにはちょっと不安があるようなことを書いていますが,この関数ならば間違い無さそうです.情報提供ありがとうございました.手元のソースコードも修正を行いました.(2箇所とも)
一応,手元では確認したつもりだったのですが,チェックが甘かったようです.これで来年度のユーザ登録がグッと楽になりそうです.
#Wikiの件でもお世話になりました.オープンソースの力を改めて実感ですね.