⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 questiontype.php

📁 很棒的在线教学系统
💻 PHP
📖 第 1 页 / 共 2 页
字号:
                $state->raw_grade = $question->options->answers[$response]->fraction;            }        } else {            foreach ($state->responses as $response) {                if ($response) {                    $state->raw_grade += $question->options->answers[$response]->fraction;                }            }        }        // Make sure we don't assign negative or too high marks        $state->raw_grade = min(max((float) $state->raw_grade,                            0.0), 1.0) * $question->maxgrade;        // Apply the penalty for this attempt        $state->penalty = $question->penalty * $question->maxgrade;        // mark the state as graded        $state->event = ($state->event ==  QUESTION_EVENTCLOSE) ? QUESTION_EVENTCLOSEANDGRADE : QUESTION_EVENTGRADE;        return true;    }    // ULPGC ecastro    function get_actual_response($question, $state) {        $answers = $question->options->answers;        $responses = array();        if (!empty($state->responses)) {            foreach ($state->responses as $aid =>$rid){                if (!empty($answers[$rid])) {                    $responses[] = $this->format_text($answers[$rid]->answer, $question->questiontextformat);                }            }        } else {            $responses[] = '';        }        return $responses;    }    function response_summary($question, $state, $length = 80) {        return implode(',', $this->get_actual_response($question, $state));    }/// BACKUP FUNCTIONS ////////////////////////////    /*     * Backup the data in the question     *     * This is used in question/backuplib.php     */    function backup($bf,$preferences,$question,$level=6) {        $status = true;        $multichoices = get_records("question_multichoice","question",$question,"id");        //If there are multichoices        if ($multichoices) {            //Iterate over each multichoice            foreach ($multichoices as $multichoice) {                $status = fwrite ($bf,start_tag("MULTICHOICE",$level,true));                //Print multichoice contents                fwrite ($bf,full_tag("LAYOUT",$level+1,false,$multichoice->layout));                fwrite ($bf,full_tag("ANSWERS",$level+1,false,$multichoice->answers));                fwrite ($bf,full_tag("SINGLE",$level+1,false,$multichoice->single));                fwrite ($bf,full_tag("SHUFFLEANSWERS",$level+1,false,$multichoice->shuffleanswers));                fwrite ($bf,full_tag("CORRECTFEEDBACK",$level+1,false,$multichoice->correctfeedback));                fwrite ($bf,full_tag("PARTIALLYCORRECTFEEDBACK",$level+1,false,$multichoice->partiallycorrectfeedback));                fwrite ($bf,full_tag("INCORRECTFEEDBACK",$level+1,false,$multichoice->incorrectfeedback));                fwrite ($bf,full_tag("ANSWERNUMBERING",$level+1,false,$multichoice->answernumbering));                $status = fwrite ($bf,end_tag("MULTICHOICE",$level,true));            }            //Now print question_answers            $status = question_backup_answers($bf,$preferences,$question);        }        return $status;    }/// RESTORE FUNCTIONS /////////////////    /*     * Restores the data in the question     *     * This is used in question/restorelib.php     */    function restore($old_question_id,$new_question_id,$info,$restore) {        $status = true;        //Get the multichoices array        $multichoices = $info['#']['MULTICHOICE'];        //Iterate over multichoices        for($i = 0; $i < sizeof($multichoices); $i++) {            $mul_info = $multichoices[$i];            //Now, build the question_multichoice record structure            $multichoice = new stdClass;            $multichoice->question = $new_question_id;            $multichoice->layout = backup_todb($mul_info['#']['LAYOUT']['0']['#']);            $multichoice->answers = backup_todb($mul_info['#']['ANSWERS']['0']['#']);            $multichoice->single = backup_todb($mul_info['#']['SINGLE']['0']['#']);            $multichoice->shuffleanswers = isset($mul_info['#']['SHUFFLEANSWERS']['0']['#'])?backup_todb($mul_info['#']['SHUFFLEANSWERS']['0']['#']):'';            if (array_key_exists("CORRECTFEEDBACK", $mul_info['#'])) {                $multichoice->correctfeedback = backup_todb($mul_info['#']['CORRECTFEEDBACK']['0']['#']);            } else {                $multichoice->correctfeedback = '';            }            if (array_key_exists("PARTIALLYCORRECTFEEDBACK", $mul_info['#'])) {                $multichoice->partiallycorrectfeedback = backup_todb($mul_info['#']['PARTIALLYCORRECTFEEDBACK']['0']['#']);            } else {                $multichoice->partiallycorrectfeedback = '';            }            if (array_key_exists("INCORRECTFEEDBACK", $mul_info['#'])) {                $multichoice->incorrectfeedback = backup_todb($mul_info['#']['INCORRECTFEEDBACK']['0']['#']);            } else {                $multichoice->incorrectfeedback = '';            }            if (array_key_exists("ANSWERNUMBERING", $mul_info['#'])) {                $multichoice->answernumbering = backup_todb($mul_info['#']['ANSWERNUMBERING']['0']['#']);            } else {                $multichoice->answernumbering = 'abc';            }            //We have to recode the answers field (a list of answers id)            //Extracts answer id from sequence            $answers_field = "";            $in_first = true;            $tok = strtok($multichoice->answers,",");            while ($tok) {                //Get the answer from backup_ids                $answer = backup_getid($restore->backup_unique_code,"question_answers",$tok);                if ($answer) {                    if ($in_first) {                        $answers_field .= $answer->new_id;                        $in_first = false;                    } else {                        $answers_field .= ",".$answer->new_id;                    }                }                //check for next                $tok = strtok(",");            }            //We have the answers field recoded to its new ids            $multichoice->answers = $answers_field;            //The structure is equal to the db, so insert the question_shortanswer            $newid = insert_record ("question_multichoice",$multichoice);            //Do some output            if (($i+1) % 50 == 0) {                if (!defined('RESTORE_SILENTLY')) {                    echo ".";                    if (($i+1) % 1000 == 0) {                        echo "<br />";                    }                }                backup_flush(300);            }            if (!$newid) {                $status = false;            }        }        return $status;    }    function restore_recode_answer($state, $restore) {        $pos = strpos($state->answer, ':');        $order = array();        $responses = array();        if (false === $pos) { // No order of answers is given, so use the default            if ($state->answer) {                $responses = explode(',', $state->answer);            }        } else {            $order = explode(',', substr($state->answer, 0, $pos));            if ($responsestring = substr($state->answer, $pos + 1)) {                $responses = explode(',', $responsestring);            }        }        if ($order) {            foreach ($order as $key => $oldansid) {                $answer = backup_getid($restore->backup_unique_code,"question_answers",$oldansid);                if ($answer) {                    $order[$key] = $answer->new_id;                } else {                    echo 'Could not recode multichoice answer id '.$oldansid.' for state '.$state->oldid.'<br />';                }            }        }        if ($responses) {            foreach ($responses as $key => $oldansid) {                $answer = backup_getid($restore->backup_unique_code,"question_answers",$oldansid);                if ($answer) {                    $responses[$key] = $answer->new_id;                } else {                    echo 'Could not recode multichoice response answer id '.$oldansid.' for state '.$state->oldid.'<br />';                }            }        }        return implode(',', $order).':'.implode(',', $responses);    }    /**     * Decode links in question type specific tables.     * @return bool success or failure.     */    function decode_content_links_caller($questionids, $restore, &$i) {        $status = true;        // Decode links in the question_multichoice table.        if ($multichoices = get_records_list('question_multichoice', 'question',                implode(',',  $questionids), '', 'id, correctfeedback, partiallycorrectfeedback, incorrectfeedback')) {            foreach ($multichoices as $multichoice) {                $correctfeedback = restore_decode_content_links_worker($multichoice->correctfeedback, $restore);                $partiallycorrectfeedback = restore_decode_content_links_worker($multichoice->partiallycorrectfeedback, $restore);                $incorrectfeedback = restore_decode_content_links_worker($multichoice->incorrectfeedback, $restore);                if ($correctfeedback != $multichoice->correctfeedback ||                        $partiallycorrectfeedback != $multichoice->partiallycorrectfeedback ||                        $incorrectfeedback != $multichoice->incorrectfeedback) {                    $subquestion->correctfeedback = addslashes($correctfeedback);                    $subquestion->partiallycorrectfeedback = addslashes($partiallycorrectfeedback);                    $subquestion->incorrectfeedback = addslashes($incorrectfeedback);                    if (!update_record('question_multichoice', $multichoice)) {                        $status = false;                    }                }                // Do some output.                if (++$i % 5 == 0 && !defined('RESTORE_SILENTLY')) {                    echo ".";                    if ($i % 100 == 0) {                        echo "<br />";                    }                    backup_flush(300);                }            }        }        return $status;    }    /**     * @return array of the numbering styles supported. For each one, there     *      should be a lang string answernumberingxxx in teh qtype_multichoice     *      language file, and a case in the switch statement in number_in_style,     *      and it should be listed in the definition of this column in install.xml.     */    function get_numbering_styles() {        return array('abc', 'ABCD', '123', 'none');    }    function number_html($qnum) {        return '<span class="anun">' . $qnum . '<span class="anumsep">.</span></span> ';    }    /**     * @param int $num The number, starting at 0.     * @param string $style The style to render the number in. One of the ones returned by $numberingoptions.     * @return string the number $num in the requested style.     */    function number_in_style($num, $style) {        switch($style) {            case 'abc':                return $this->number_html(chr(ord('a') + $num));            case 'ABCD':                return $this->number_html(chr(ord('A') + $num));            case '123':                return $this->number_html(($num + 1));            case 'none':                return '';            default:                return 'ERR';        }    }    function find_file_links($question, $courseid){        $urls = array();        // find links in the answers table.        $urls +=  question_find_file_links_from_html($question->options->correctfeedback, $courseid);        $urls +=  question_find_file_links_from_html($question->options->partiallycorrectfeedback, $courseid);        $urls +=  question_find_file_links_from_html($question->options->incorrectfeedback, $courseid);        foreach ($question->options->answers as $answer) {            $urls += question_find_file_links_from_html($answer->answer, $courseid);        }        //set all the values of the array to the question id        if ($urls){            $urls = array_combine(array_keys($urls), array_fill(0, count($urls), array($question->id)));        }        $urls = array_merge_recursive($urls, parent::find_file_links($question, $courseid));        return $urls;    }    function replace_file_links($question, $fromcourseid, $tocourseid, $url, $destination){        parent::replace_file_links($question, $fromcourseid, $tocourseid, $url, $destination);        // replace links in the question_match_sub table.        // We need to use a separate object, because in load_question_options, $question->options->answers        // is changed from a comma-separated list of ids to an array, so calling update_record on        // $question->options stores 'Array' in that column, breaking the question.        $optionschanged = false;        $newoptions = new stdClass;        $newoptions->id = $question->options->id;        $newoptions->correctfeedback = question_replace_file_links_in_html($question->options->correctfeedback, $fromcourseid, $tocourseid, $url, $destination, $optionschanged);        $newoptions->partiallycorrectfeedback  = question_replace_file_links_in_html($question->options->partiallycorrectfeedback, $fromcourseid, $tocourseid, $url, $destination, $optionschanged);        $newoptions->incorrectfeedback = question_replace_file_links_in_html($question->options->incorrectfeedback, $fromcourseid, $tocourseid, $url, $destination, $optionschanged);        if ($optionschanged){            if (!update_record('question_multichoice', addslashes_recursive($newoptions))) {                error('Couldn\'t update \'question_multichoice\' record '.$newoptions->id);            }        }        $answerchanged = false;        foreach ($question->options->answers as $answer) {            $answer->answer = question_replace_file_links_in_html($answer->answer, $fromcourseid, $tocourseid, $url, $destination, $answerchanged);            if ($answerchanged){                if (!update_record('question_answers', addslashes_recursive($answer))){                    error('Couldn\'t update \'question_answers\' record '.$answer->id);                }            }        }    }    /**     * Runs all the code required to set up and save an essay question for testing purposes.     * Alternate DB table prefix may be used to facilitate data deletion.     */    function generate_test($name, $courseid = null) {        list($form, $question) = parent::generate_test($name, $courseid);        $question->category = $form->category;        $form->questiontext = "How old is the sun?";        $form->generalfeedback = "General feedback";        $form->penalty = 0.1;        $form->single = 1;        $form->shuffleanswers = 1;        $form->answernumbering = 'abc';        $form->noanswers = 3;        $form->answer = array('Ancient', '5 billion years old', '4.5 billion years old');        $form->fraction = array(0.3, 0.9, 1);        $form->feedback = array('True, but lacking in accuracy', 'Close, but no cigar!', 'Yep, that is it!');        $form->correctfeedback = 'Excellent!';        $form->incorrectfeedback = 'Nope!';        $form->partiallycorrectfeedback = 'Not bad';        if ($courseid) {            $course = get_record('course', 'id', $courseid);        }        return $this->save_question($question, $form, $course);    }}// Register this question type with the question bank.question_register_questiontype(new question_multichoice_qtype());?>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -