開発:小テストの試み
Template:Quiz developer docs attempts.phpスクリプトは、quizモジュールの中で最も複雑なスクリプトの1つです。ユーザーへの問題の表示、ユーザーの解答の評価および評点付け、さらにさまざまな小テスト設定を考慮に入れ、それに応じてスクリプトの動作を変更する必要があります。小テストモジュールの機能に不可欠なこのスクリプトは、問題/状態モデルを使用するためのコンテキストと例を提供し、locallibで提供される機能のいくつかを説明するために、このドキュメントである程度詳しく説明されています。 php。
attempts.phpで起こることを説明することの即時の利益に加えて、このドキュメントは小テストモジュールコードへの入り口を提供するべきです。 attempts.phpでは、他のスクリプトでも使用される可能性が高いいくつかの関数が使用されています。
attempts.phpスクリプトはユーザーの操作がどのように処理されるかを理解するのに役立ちますが、小テストや問題を編集するための教師インターフェースを理解するためには、edit.phpを参照する必要があります。
このファイルはMoodle 1.9までの状況を説明しています。 Moodle 2.0以降では、 開発:Quiz_user_interface_overviewに示すようにAttempt.phpがいくつかのビットに分割されました 。しかし、コードはまだ同じことをしていて、小さくて整理されたものになっています。 ( https://moodle.org/mod/forum/discuss.php?d=68922もご覧ください 。)
単純化された視点
簡単な機能的な観点からは、attempts.phpの責任は小テストでの試みの処理です。これには、問題の表示やユーザーが提供または生成したデータの保存が含まれます。対話は、ページを開いて新しい受験を作成してサーバーに解答を送信することに限定される可能性があります。これにより、解答が段階的になります。このスクリプトは実際にはより洗練されており、受験を中断して続行することができますが、この2ステップのシナリオは良い出発点を提供し、コア機能をカバーします。
新しい試みを始める
新規の受験が開始されると、受験オブジェクトが関数によって作成されます。quiz_create_attempt()(行183)。空を返します
試みオブジェクト。学生が問題を見たという事実を記録するためにすぐにデータベースに格納されます。次のステップは、すべての問題をロードし、それらすべてに対して初期状態を作成することです。問題のロードは2段階のプロセスです。最初に問題レコードがデータベースから抽出され、次に関数が抽出されます。
quiz_get_questions_options()と呼ばれています。これはname_prefixフィールドを添付し、特定の問題タイプを呼び出します。
get_question_options()必要なデータを追加するための各問題レコードのメソッド。
//問題をロードする if(!$ questions = get_records_sql($ sql)){ ... } //問題タイプ固有の情報をロードします if(!quiz_get_question_options($ questions)){ ... } //問題セッションを最新の状態にリストアします //必要に応じて新しいセッションを作成する if(!$ states = quiz_get_states($ questions、$ try)){ ... }すべての問題が正しく初期化された後、状態オブジェクトが関数によってそれぞれに対して作成されます。
quiz_get_states()。この機能は、各問題に状態を提供する責任があり、リストアするものがない場合は新しい状態を作成します。新しく作成された州はすぐにデータベースに追加されます。この時点で、必要なデータはすべて生成またはロードされているので、最後のステップはページを印刷することです。印刷は、単純な呼び出しとは別に、attempts.phpスクリプトの最後まで実行されます。
print_heading()(409行目)は、以下の呼び出しによってすべての問題レコードをループ処理します。
quiz_print_quiz_question()(461行目)は、特定の問題タイプを呼び出すための単なる略記です。
print_question()方法。したがって、非常に便利なことに、各問題はそれ自体を印刷することに責任があります。印刷を切り上げるために、送信ボタンとフッターがページの下部に印刷されます。
解答を処理する
受験を作成して表示した後の次の論理的なステップは、ユーザーがすべての問題に対する解答を入力し、マークを付けるためにそれらを送信することです。データベースには既にオープンな既存のものがあり、各問題の状態に同じことが当てはまるため、今では新しい試みを作成する必要はありません。そのため、今回は受験レコードがデータベースからロードされます。問題は、問題レコードを照会してから、関数を呼び出して必要な問題タイプ固有のフィールドを添付することによって、同じ方法でロードされます。quiz_get_question_options()。今すぐ関数の呼び出し
quiz_get_states()実際には新しいものを生成するのではなくデータベースから状態をリストアするので、同じコードが2つのシナリオ(受験の作成と終了)で機能します。議論中の受験に関するすべてのデータがロードされたので、学生によって提出された解答が現場にやって来ます。それぞれの問題に対して、彼らは評価され採点される必要があります。ここでの最初のステップは、それぞれの問題とそれに関連する解答に対処する方法を決定することです。単純化した場合では、これは明らかです。すべての解答を採点し、評定を保存してから受験を終了する必要があります。しかし、もっと複雑な場合があるので、関数は
quiz_extract_responses()を作成するために呼び出されます
$アクション関数の一連の命令として機能する配列
quiz_process_responses()1つの問題に対する解答処理全体をカプセル化し、特定の問題タイプを呼び出す非常に複雑な機能
grade_responses()評定の方法提出されたすべての解答が処理された後、問題は新しい州に表示されます。例外は、学生がその試みを終了するように要求した場合(または制限時間のために自動的に終了する場合)です。この場合、受験は次のように設定することによって閉じられます。
時限現在時刻へのフィールド。この後、ユーザーはreview.phpにリダイレクトされ、小テストのレビュー設定に応じて、学生の解答、フィードバック、評定および正解を含む問題が表示されます。
より複雑な見方
試みが開始される前に、ユーザーが小テストを試みることが許可されているかどうかを判断するために、一連の必須およびオプションのチェックがあります。これらのチェックに加えて、ページの表示と機能は、教師の権限を持つユーザーと持たないユーザーではわずかに異なります。また、小テストが「セキュア」モード($ quiz-> popupオプション)で開始するように設定されている場合、ページの印刷は多少異なります。これらすべてのシナリオを含めることは、上記の単純なシナリオから逸脱して、try.phpスクリプトの構造を明らかに複雑にします。
まず第一に、小テストへのアクセスはゲストに拒否されています。さらに、IP範囲($ quiz->サブネット)へのアクセスを制限し、小テストのパスワードを設定すること($ quiz-> password)が可能です。どちらの場合も、必要なテストに合格できないユーザーはアクセスを拒否されます。
教師が小テストを「試みる」と、ページ上部にタブナビゲーション機能が表示されます。これにより、教師は小テストのレビュー、プレビュー、および編集(さらに多くのオプション)を切り替えることができます。教師インターフェースには、学生インターフェースには存在しない、新しい試みを開始するためのボタンも含まれています。教師の受験は自動的にプレビューとしてマークされます。つまり、新しい受験が開始されると古い受験は自動的に削除されます。また、学生の解答にレビューが表示されるのを防ぎ、学生の試みがしている間はプレビューの試みが小テストを編集する可能性を妨げないようにします。
これらのページ間の問題およびナビゲーションを伴う複数のページを許可するために、この機能によってさらに複雑な問題が導入されています。これは、どの問題がどのページにあるのか、どのページが現在表示されているのか、そしてどのページを次に表示する必要があるのかを決定するためのメカニズムを必要とします。これを達成するのはそれほど難しくありませんが、注意が必要です:試みが閉じられるとき、それらがマークされる前にすべての問題とそれらの最新の状態をロードする必要があります。前に表示されたページのうち、ロードされ、処理され、保存されます。次のページの問題と状態が読み込まれます。
スクリプトの最後に向かって、時限小テストを担当する2つのコードブロックがあります($ quiz-> timelimit)。最初のブロックは、javascriptを使用してフォームの開始要素を印刷し、javascriptが有効になっていることを確認します(小テストは通常どおり印刷されるため、送信だけでは機能しません)。 2番目のブロックにはファイルjstimer.phpが含まれています。このファイルは、カウントダウンし、時間が経過すると自動送信を行うタイマーを表示します。