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 + -
显示快捷键?