日英のフォーラムやモジュールを探したのですが、
該当する投稿を見つけることができなかったため、
質問させていただきます。
◆質問
ゲストも小テストを受けられるように、できないでしょうか?
◆背景
1年ほど前、中学校現場でMoodleを使用しました。
具体的には、期末試験の返却の際、
期末試験と同じものをMoodle上に小テストとして作成し、
その小テストを生徒が受験するという形で利用しました。
◎ねらい
ねらいは次のとおりです。
みなさんに思い出していただきたいのですが、
中学校で定期テストを返却するときは、
『できていない生徒ほどテスト解説を聞かない』
という笑いたくなるような笑えないパラドックスな状況があります。
これを少しでも改善したいと思い、Moodleを使用しました。
◎結果
結果は良いものでした。
生徒は1問1問答えるたびに正解か不正解かわかることが
とても良いと言っていました。
さらに「不正解についてはアドバイスを付けてほしい」という
中学生にしてはとても建設的なアドバイスをしてくれました。
最初、生徒のほとんどがチャットに流れ込んで
あわてて閉鎖するなどということもありましたが・・・
(中学校ではチャットは絶対に作ってはいけません)
◎アカウント管理の必要性
ただ、以上のような利用をする場合、
はっきり言ってしまうとユーザー管理はまったく必要ありません。
そこで最初は小テスト用アカウントを作ったのですが、
1人の生徒がそのアカウントでログインすると他の生徒が使えなくなり、
実際の授業で失敗したことがあります。
そのときは、大急ぎでその場で40人分のアカウントを発行しました。
◎公立中学校という場
また、公立中学校という場所ではPCの数が少なく、
なかなか一斉授業の中で使用することができません。
サーバーはもちろんないため、自前でレンタルし運用費は自腹を切っています。
すると外部にデータを置くことになるため、
あまり生徒の個人情報を保存したくありません。
したがって現状では、授業時間外にログインせずに任意で利用する
という形を初めはとった方が、良いように思いました。
─────
長文で大変失礼しましたが、以上のような背景から、
ゲストアカウントでの小テスト受験を実現する方法を
教えていただきたいと思っております。
どうぞよろしくご教授いただけると幸いです。
ゲストでも小テストは受験できるが,同時に多数の学生がゲストアカウントでは受験できない,ということですね.私は試したことが無いのですが,学習履歴を保存するのが小テストの目玉の一つである以上は現状,仕方が無いかなぁと思います.
小テストではなく,レッスンではダメでしょうか?(こちらもゲストでは制限があるでしょうか?)
40個のアカウントを作成するのは悪い考えでは無いと思います.
学校内部のサーバでも,個人情報に関しては不安があります.
どこまで個人情報をMoodleに登録するのか,次第ではないでしょうか.顔写真や電話番号はNGですよね.電子メールアドレスも,もし不要であるならばダミーのアドレスを入力して”このメールアドレスは無効”とすれば良いでしょう.小テストの結果...同じクラス内で自由に閲覧できない限りは構わないのではないでしょうか.氏名に関してはローマ字とか,思い切ってニックネームではどうでしょう.パスワードは,Moodle専用のパスワードにしてね!と念を押す.
比較的安心して利用できるサーバと専任の技術者を各小中学校に配置できるだけの理解と予算が確保できる世の中になると良いですね.政治・官僚だけではなく,先生や保護者や地域社会全体の理解も必要です.
学内からのアクセスに限定するのであればサーバはWindowsでも良いでしょう.もちろんLinuxの方がパフォーマンスと安定性は良いですが.ムダに遊んでいるWindowsPCはありませんか?(埃をかぶっているTV会議システム専用とか^^) OSの入れ替えはできないにしても,関係者に了承をとってMoodleを動かすことはできるのではないでしょうか.LANで外部に繋がっていないならばセキュリティの上ではさらに好都合です.
まさに目からウロコです。
以下は小テストをエクスポートしてレッスンにインポートしたものです。
中学2年生の理科です。
覚えてますか?(笑)
http://www.rodan-t.com/test/course/view.php?id=8
ん、「レポートにアクセスできません」?
ちょっと設定をいじってみます。
本当にありがとうございました。
少し気になったのでソースを見てみたところ、
小テストのview.phpの137行目あたりに
// Guests can't do a quiz, so offer them a choice of logging in or going back.
if (isguestuser()) {
$loginurl = $CFG->wwwroot.'/login/index.php';
if (!empty($CFG->loginhttps)) {
$loginurl = str_replace('http:','https:', $loginurl);
}
notice_yesno('<p>' . get_string('guestsno', 'quiz') . "</p>\n\n</p>" .
get_string('liketologin') . '</p>', $loginurl, get_referer(false));
finish_page($course);
}
と記述されていました。
isguestuser()はUserのIDからguestか否かを判定しているので、
ロールのパーミッション管理だけではおそらくゲストに受験させることは難しいと思います。
ソースの修正が可能であれば、
if (isguestuser()) {
の部分を、
if (!has_capability('mod/quiz:attempt', $context)){
に修正して、「mod/quiz:attempt」を許可すれば受験できるようになります。
ffftpなりを使ってftpでmoodleサーバー/mod/quiz/view.phpにアクセスするところは変わりませんが
下の方のゲストかどうかを判別するコードが
if (isguestuser()) {現在はこのようになってます。
// Guests can't do a quiz, so offer them a choice of logging in or going back.
echo $output->view_page_guest($course, $quiz, $cm, $context, $viewobj->infomessages);
} else if (!isguestuser() && !($canattempt || $canpreview || $viewobj->canreviewmine)) {
// If they are not enrolled in this course in a good enough role, tell them to enrol.
echo $output->view_page_notenrolled($course, $quiz, $cm, $context, $viewobj->infomessages);
} else {
echo $output->view_page($course, $quiz, $cm, $context, $viewobj);
}
この場合、isguestuser()を!has_capability('mod/quiz:attempt', $context)に変更しても、ゲストユーザーは利用できないらしく詰まったので
if (!($canattempt || $canpreview || $viewobj->canreviewmine)) {このように変更しました。
if (isguestuser()) {
// Guests can't do a quiz, so offer them a choice of logging in or going back.
echo $output->view_page_guest($course, $quiz, $cm, $context, $viewobj->infomessages);
} else {
// If they are not enrolled in this course in a good enough role, tell them to enrol.
echo $output->view_page_notenrolled($course, $quiz, $cm, $context, $viewobj->infomessages);
}
} else {
echo $output->view_page($course, $quiz, $cm, $context, $viewobj);
}
これで無事
小テスト管理->パーミッション->小テストを受験する(mod/quiz:attempt)
にゲストを追加した小テストだけがゲストアクセスできるようになりました。
よろしければ以下2つの設定をお試しください。
[Moodleトップページにゲストログインボタンを表示する]
- サイト管理者としてMoodleにログインする。
- 「ダッシュボード > サイト管理 > プラグイン > 認証 > 認証管理」ページに移動する。
- 「ゲストログインボタン guestloginbutton」を「表示」にする。
- ページ下部の「変更を保存する」ボタンをクリックする。
[ゲストがコースを利用できるようにする]
- サイト管理者または編集権限のある教師としてゲストが受験可能な小テストのあるコースに入る。
- ページ右上のアクションメニューアイコン (歯車) をクリックする。
- 「さらに ...」を選択する。
- 「コース管理」セクションの「ユーザ」タブをクリックする。
- 「登録方法」リンクをクリックする。
- 「ゲストアクセス」欄の右側にある閉じた目のアイコンをクリックする。
(3) に遷移
受験可能回数、制限時間 が表示されますが、
「問題を受験する」ボタンが表示されない状況です。
if (!($canattempt || $canpreview || $viewobj->canreviewmine)) {
if (isguestuser()) {
// Guests can't do a quiz, so offer them a choice of logging in or going back.
echo $output->view_page_guest($course, $quiz, $cm, $context, $viewobj->infomessages); <--(1)
} else {
// If they are not enrolled in this course in a good enough role, tell them to enrol.
echo $output->view_page_notenrolled($course, $quiz, $cm, $context, $viewobj->infomessages); <--(2)
}
} else {
echo $output->view_page($course, $quiz, $cm, $context, $viewobj); <--(3)
}
以下のMoodleオンラインドキュメント (Capabilities/mod/quiz:attempt - MoodleDocs) を読みます限り、ゲストによる小テスト受験を可能にするためのプログラム修正は難しいように思えます。
"Guest users can never attempt quizzes, even if you give guests the mod/quiz:attempt capability. This is because all information about a user's progress through the quiz must be stored in the database associated with the user doing the attempt, and each user can only have one attempt open at a time. Since all guest users in Moodle share a single user account, letting guests attempt quizzes would just cause a big mess where different guest users' actions would conflict with each other. Therefore, people logged in as guest are never allowed to attempt quizzes."
[Capabilities/mod/quiz:attempt - MoodleDocs]
https://docs.moodle.org/37/en/Capabilities/mod/quiz:attempt
下記プログラム修正により、ユーザ名に「guest」を含むユーザ (例 「guest001」「002guest」等) の小テスト受験結果すべてを小テストページ表示時に削除することは可能です。
Moodleバージョン:
3.7.2+ (Build: 20190913)
修正対象プログラム:
mod/quiz/view.php
修正箇所:
82行目
[ 修正前 ]
// Create view object which collects all the information the renderer will need.
$viewobj = new mod_quiz_view_object();
$viewobj->accessmanager = $accessmanager;
$viewobj->canreviewmine = $canreviewmine || $canpreview;
// Get this user's attempts.
$attempts = quiz_get_user_attempts($quiz->id, $USER->id, 'finished', true);
[ 修正後 ]
// Create view object which collects all the information the renderer will need.
$viewobj = new mod_quiz_view_object();
$viewobj->accessmanager = $accessmanager;
$viewobj->canreviewmine = $canreviewmine || $canpreview;
if (preg_match('/guest/', $USER->username)) {
$params = [
'quiz' => $quiz->id,
'userid' => $USER->id,
];
$DB->delete_records('quiz_attempts', $params);
$DB->delete_records('quiz_grades', $params);
}
// Get this user's attempts.
$attempts = quiz_get_user_attempts($quiz->id, $USER->id, 'finished', true);