(現状)
はい、ログイン情報を教えて下さいボタンを押すと、ユーザIDまたはメールアドレスのうち1つだけ入力。
(改善)
ユーザIDとメールアドレス両方入力すると登録しているメールアドレスに送信される。
moodle\server\moodle\login
forgot_password.phpというファイルを修正すれば良いという所まで分かっています。だが、どこを修正をすれば良いのかわかりません。
宜しくお願いします。
> forgot_password.phpというファイルを修正すれば良いという所まで分かっています。だが、どこを修正をすれば良いのかわかりません。
いえ,多分,そちらではなく,login/forgot_password_form.phpのfunction validation()の方だと思います.フォームに入力されたデータの正当性を調べる関数です.この条件を満たすかどうか,自動チェックされます.
まず,最初のif文で,ユーザ名とEmail両方を入力した場合と,ユーザ名もEmail両方とも入力しなかった場合はエラーとしています.ここを後者のみ有効とする必要があるでしょう.次のif文の条件でEmailのみ入力された場合のチェックを行い,最後のelseでユーザ名のチェックを行っていると思います.
動作確認は全く行っていません.多分,以下のような修正でご希望の動きをする可能性があります.
function validation($data, $files) {
global $CFG;$errors = parent::validation($data, $files);
// if ((!empty($data['username']) and !empty($data['email'])) or (empty($data['username']) and empty($data['email']))) {
if ((empty($data['username']) and empty($data['email'])) {
$errors['username'] = get_string('usernameoremail');
$errors['email'] = get_string('usernameoremail');} else if (!empty($data['email'])) {
if (!validate_email($data['email'])) {
$errors['email'] = get_string('invalidemail');(省略)
if (!$user and empty($CFG->protectusernames)) {
$errors['email'] = get_string('emailnotfound');
}
}
$emailuser = $user; // 追加// } else {
if ($user = get_complete_user_data('username', $data['username'])) {
if (empty($user->confirmed)) {
$errors['email'] = get_string('confirmednot');
}
if ($user->id != $emailuser->id) $erro['email'] = get_string('confirmednot'); // 追加
}
if (!$user and empty($CFG->protectusernames)) {
$errors['username'] = get_string('usernamenotfound');
}
}return $errors;
}
赤い行が修正箇所です.1つ目の部分はif文の条件の A or B を B のみとしています.これでユーザ名とEmailを同時に入力してもエラーにならなくなります.ただし,その後の青い行で示した箇所の get_string('usernameoremail');ですが,多分,実情を表さないメッセージになると思います.いっそのこと,get_string('confirmednot'); にした方が良いかも知れません.なんにせよ,フォームのコメントから変える必要はありますね.
いまは検証する時間的余裕がありません.よくチェックして下さい.たとえば,(1)実在しないユーザ名と実在しないEmailアドレスを入力する,(2)実在しないユーザ名だけいを入力する,(3)実在しないEmailアドレスを入力する,(4)実在するユーザ名だけ入力する,(5)実在するEmailアドレスだけ入力する,(6)実在するユーザ名と,そのユーザとは別の実在するユーザのEmailアドレスを入力する.これらがすべてNGであることを確認するのは最低限,必要です.その上で,(7)実在するユーザ名とそのユーザのEmailアドレスを入力して,正しくメールが送信されることを確認しましょう.
#次にmoodle.orgで返信できるのは来週の月曜日の夕方です.頑張って下さい.
そうですね.基本的に電子メールアドレスを持っていないとパスワードの自主的な変更はできなかったはずです.井伊さん(でよろしいのでしょうか?)の仰るように,パスワードを忘れてしまったユーザに対して,システムは電子メールを送ります.それをもし他者が受信できてしまうならば乗っ取りが可能ですが,もう,そういう状態だとMoodle以前の状態です.
なぜ,ユーザ名,あるいは電子メールアドレスのいずれか一方だけを入力してくれ,とMoodleが要求しているのか.それはもし両方とも別のユーザのものでありながら正しかった場合です.Aさんのユーザ名とBさんの電子メールアドレス.さぁ,Moodleはどちらに電子メールを送れば良いのか?
ユーザ名を忘れるユーザは多いですね.また,学籍番号をユーザ名としている場合は間違えて別のユーザのユーザ名を入力してしまうかも知れません.そういう意味では電子メールアドレスを優先するべきかも知れませんね.(でも,学生は自分のつけた複雑な電子メールアドレスを覚えていない^^;)
Johnさんの心配しているのは乗っ取りではないのかも知れませんよ. > 井伊さん
退屈しのぎに,他人のユーザ名を片っ端から入力して嫌がらせをする者はいるかも知れません.なにせログイン前ですから,誰がこのイジワルを行っているのかは誰にも分かりません.もしこういうイタズラが横行しているのであれば,Johnさんの要望も納得できます.
回答ありがとうございます.
私も,それ以外の方々も皆,本業の傍らでボランティアとしてこのフォーラムに返答を行っています.ボランティアといっても天使の心ではありません.私たちの得る報酬は知的好奇心と自己満足です(笑).ですので,「なぜ,そのような要望を持つのか」をこのように回答して頂くと,グッとやる気がでます.もしそうでなければ報酬として金銭をお支払い頂けないと誰も質問には応じないでしょう.
PHPの最低限の勉強は行った方が良いでしょう.少なくとも関数のリファレンスは紙の書籍を傍らに置いておくことを勧めます.残念ながら良い参考書には私は出会えませんでしたので推薦できません.リファレンスとしては「PHPポケットリファレンス」(技術評論社,大垣靖男 著, ISBN4-7741-2502-4, 定価2380税別)を使っています.「この関数はどういう関数だろう」という関数名による索引と「こういうことをしたい場合は...」という目的に応じた索引があり,最低限の条件は満たしています.あまり大きな本では無いので,机の上に置いても邪魔ではない,という点が優れていますね.
PHPの勉強については,「そふぃのPHP入門」(http://nyx.pu1.net/)が入門向きですね.検索を掛けるとこのページに到達することが多いので,人気も高いのでしょう.
if文のカッコが正しく対応していませんでした.
function validation($data, $files) {
global $CFG;$errors = parent::validation($data, $files);
// if ((!empty($data['username']) and !empty($data['email'])) or (empty($data['username']) and empty($data['email']))) {
if (empty($data['username']) and empty($data['email'])) {
$errors['username'] = get_string('usernameoremail');
$errors['email'] = get_string('usernameoremail');} else if (!empty($data['email'])) {
赤い行のif文,こちらの頭のカッコ('(')が一つ余分でしたね.これでどうですか?
ちなみにget_string()は表示されるエラーメッセージの種類ですので,動作に影響はありません.無関係です.
繰り返しますが,すべての入力パターンに対して検証を行った訳ではありません.Johnさん,以前に挙げたパターンを試してみてご報告頂けませんか? よろしく!