📄 questiontype.php
字号:
$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 + -