開発:クイズの試み

クイズからのリダイレクト)

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がいくつかのビットに分割されました 。しかし、コードはまだ同じことをしていて、小さくて整理されたものになっています。 ( http://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が含まれています。このファイルは、カウントダウンし、時間が経過すると自動送信を行うタイマーを表示します。