questiontype.php
来自「很棒的在线教学系统」· PHP 代码 · 共 404 行 · 第 1/2 页
PHP
404 行
/// ---- 1 ---- /// For responses stored by Moodle version 1.5 and later the answer /// field has the pattern random#-* where the # part is the numeric /// question id of the actual question shown in the quiz attempt /// and * represents the student response to that actual question. /// ---- 2 ---- /// For responses stored by older Moodle versions - the answer field is /// simply the question id of the actual question. The student response /// to the actual question is stored in a separate response record. /// ----------------------- /// This means that prior to Moodle version 1.5, random questions needed /// two response records for storing the response to a single question. /// From version 1.5 and later the question type random works like all /// the other question types in that it now only needs one response /// record per question. global $QTYPES; if (!ereg('^random([0-9]+)-(.*)$', $state->responses[''], $answerregs)) { if (empty($state->responses[''])) { // This is the case if there weren't enough questions available in the category. $question->questiontext = '<span class="notifyproblem">'. get_string('toomanyrandom', 'quiz'). '</span>'; $question->qtype = 'description'; return true; } // this must be an old-style state which stores only the id for the wrapped question if (!$wrappedquestion = get_record('question', 'id', $state->responses[''])) { notify("Can not find wrapped question {$state->responses['']}"); } // In the old model the actual response was stored in a separate entry in // the state table and fortunately there was only a single state per question if (!$state->responses[''] = get_field('question_states', 'answer', 'attempt', $state->attempt, 'question', $wrappedquestion->id)) { notify("Wrapped state missing"); } } else { if (!$wrappedquestion = get_record('question', 'id', $answerregs[1])) { // The teacher must have deleted this question by mistake // Convert it into a description type question with an explanation to the student $wrappedquestion = clone($question); $wrappedquestion->id = $answerregs[1]; $wrappedquestion->questiontext = get_string('questiondeleted', 'quiz'); $wrappedquestion->qtype = 'missingtype'; } $state->responses[''] = (false === $answerregs[2]) ? '' : $answerregs[2]; } if (!$QTYPES[$wrappedquestion->qtype] ->get_question_options($wrappedquestion)) { return false; } if (!$QTYPES[$wrappedquestion->qtype] ->restore_session_and_responses($wrappedquestion, $state)) { return false; } $wrappedquestion->name_prefix = $question->name_prefix; $wrappedquestion->maxgrade = $question->maxgrade; $state->options->question = &$wrappedquestion; return true; } function save_session_and_responses(&$question, &$state) { global $QTYPES; $wrappedquestion = &$state->options->question; // Trick the wrapped question into pretending to be the random one. $realqid = $wrappedquestion->id; $wrappedquestion->id = $question->id; $QTYPES[$wrappedquestion->qtype] ->save_session_and_responses($wrappedquestion, $state); // Read what the wrapped question has just set the answer field to // (if anything) $response = get_field('question_states', 'answer', 'id', $state->id); if(false === $response) { return false; } // Prefix the answer field... $response = "random$realqid-$response"; // ... and save it again. if (!set_field('question_states', 'answer', addslashes($response), 'id', $state->id)) { return false; } // Restore the real id $wrappedquestion->id = $realqid; return true; } function get_correct_responses(&$question, &$state) { global $QTYPES; $wrappedquestion = &$state->options->question; return $QTYPES[$wrappedquestion->qtype] ->get_correct_responses($wrappedquestion, $state); } // ULPGC ecastro function get_all_responses(&$question, &$state){ global $QTYPES; $wrappedquestion = &$state->options->question; return $QTYPES[$wrappedquestion->qtype] ->get_all_responses($wrappedquestion, $state); } // ULPGC ecastro function get_actual_response(&$question, &$state){ global $QTYPES; $wrappedquestion = &$state->options->question; return $QTYPES[$wrappedquestion->qtype] ->get_actual_response($wrappedquestion, $state); } function get_html_head_contributions(&$question, &$state) { global $QTYPES; $wrappedquestion = &$state->options->question; return $QTYPES[$wrappedquestion->qtype] ->get_html_head_contributions($wrappedquestion, $state); } function print_question(&$question, &$state, &$number, $cmoptions, $options) { global $QTYPES; $wrappedquestion = &$state->options->question; $wrappedquestion->randomquestionid = $question->id; $QTYPES[$wrappedquestion->qtype] ->print_question($wrappedquestion, $state, $number, $cmoptions, $options); } function grade_responses(&$question, &$state, $cmoptions) { global $QTYPES; $wrappedquestion = &$state->options->question; return $QTYPES[$wrappedquestion->qtype] ->grade_responses($wrappedquestion, $state, $cmoptions); } function get_texsource(&$question, &$state, $cmoptions, $type) { global $QTYPES; $wrappedquestion = &$state->options->question; return $QTYPES[$wrappedquestion->qtype] ->get_texsource($wrappedquestion, $state, $cmoptions, $type); } function compare_responses(&$question, $state, $teststate) { global $QTYPES; $wrappedquestion = &$teststate->options->question; return $QTYPES[$wrappedquestion->qtype] ->compare_responses($wrappedquestion, $state, $teststate); } function restore_recode_answer($state, $restore) { // The answer looks like 'randomXX-ANSWER', where XX is // the id of the used question and ANSWER the actual // response to that question. // However, there may still be old-style states around, // which store the id of the wrapped question in the // state of the random question and store the response // in a separate state for the wrapped question global $QTYPES; $answer_field = ""; if (ereg('^random([0-9]+)-(.*)$', $state->answer, $answerregs)) { // Recode the question id in $answerregs[1] // Get the question from backup_ids if(!$wrapped = backup_getid($restore->backup_unique_code,"question",$answerregs[1])) { echo 'Could not recode question in random-'.$answerregs[1].'<br />'; return($answer_field); } // Get the question type for recursion if (!$wrappedquestion->qtype = get_field('question', 'qtype', 'id', $wrapped->new_id)) { echo 'Could not get qtype while recoding question random-'.$answerregs[1].'<br />'; return($answer_field); } $newstate = $state; $newstate->question = $wrapped->new_id; $newstate->answer = $answerregs[2]; $answer_field = 'random'.$wrapped->new_id.'-'; // Recode the answer field in $answerregs[2] depending on // the qtype of question with id $answerregs[1] $answer_field .= $QTYPES[$wrappedquestion->qtype]->restore_recode_answer($newstate, $restore); } else { // Handle old-style states $answer_link = backup_getid($restore->backup_unique_code,"question",$state->answer); if ($answer_link) { $answer_field = $answer_link->new_id; } } return $answer_field; }}//// END OF CLASS ////////////////////////////////////////////////////////////////////////////////// INITIATION - Without this line the question type is not in use... /////////////////////////////////////////////////////////////////////////////question_register_questiontype(new random_qtype());?>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?