. /** * Question type class for the true-false question type. * * @package qtype * @subpackage truefalse * @copyright 1999 onwards Martin Dougiamas {@link http://moodle.com} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); require_once($CFG->libdir . '/questionlib.php'); /** * The true-false question type class. * * @copyright 1999 onwards Martin Dougiamas {@link http://moodle.com} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class qtype_truefalse extends question_type { public function save_question_options($question) { global $DB; $result = new stdClass(); $context = $question->context; // Fetch old answer ids so that we can reuse them. $oldanswers = $DB->get_records('question_answers', array('question' => $question->id), 'id ASC'); // Save the true answer - update an existing answer if possible. $answer = array_shift($oldanswers); if (!$answer) { $answer = new stdClass(); $answer->question = $question->id; $answer->answer = ''; $answer->feedback = ''; $answer->id = $DB->insert_record('question_answers', $answer); } $answer->answer = get_string('true', 'qtype_truefalse'); $answer->fraction = $question->correctanswer; $answer->feedback = $this->import_or_save_files($question->feedbacktrue, $context, 'question', 'answerfeedback', $answer->id); $answer->feedbackformat = $question->feedbacktrue['format']; $DB->update_record('question_answers', $answer); $trueid = $answer->id; // Save the false answer - update an existing answer if possible. $answer = array_shift($oldanswers); if (!$answer) { $answer = new stdClass(); $answer->question = $question->id; $answer->answer = ''; $answer->feedback = ''; $answer->id = $DB->insert_record('question_answers', $answer); } $answer->answer = get_string('false', 'qtype_truefalse'); $answer->fraction = 1 - (int)$question->correctanswer; $answer->feedback = $this->import_or_save_files($question->feedbackfalse, $context, 'question', 'answerfeedback', $answer->id); $answer->feedbackformat = $question->feedbackfalse['format']; $DB->update_record('question_answers', $answer); $falseid = $answer->id; // Delete any left over old answer records. $fs = get_file_storage(); foreach ($oldanswers as $oldanswer) { $fs->delete_area_files($context->id, 'question', 'answerfeedback', $oldanswer->id); $DB->delete_records('question_answers', array('id' => $oldanswer->id)); } // Save question options in question_truefalse table. if ($options = $DB->get_record('question_truefalse', array('question' => $question->id))) { // No need to do anything, since the answer IDs won't have changed // But we'll do it anyway, just for robustness. $options->trueanswer = $trueid; $options->falseanswer = $falseid; $DB->update_record('question_truefalse', $options); } else { $options = new stdClass(); $options->question = $question->id; $options->trueanswer = $trueid; $options->falseanswer = $falseid; $DB->insert_record('question_truefalse', $options); } $this->save_hints($question); return true; } /** * Loads the question type specific options for the question. */ public function get_question_options($question) { global $DB, $OUTPUT; // Get additional information from database // and attach it to the question object. if (!$question->options = $DB->get_record('question_truefalse', array('question' => $question->id))) { echo $OUTPUT->notification('Error: Missing question options!'); return false; } // Load the answers. if (!$question->options->answers = $DB->get_records('question_answers', array('question' => $question->id), 'id ASC')) { echo $OUTPUT->notification('Error: Missing question answers for truefalse question ' . $question->id . '!'); return false; } return true; } protected function initialise_question_instance(question_definition $question, $questiondata) { parent::initialise_question_instance($question, $questiondata); $answers = $questiondata->options->answers; if ($answers[$questiondata->options->trueanswer]->fraction > 0.99) { $question->rightanswer = true; } else { $question->rightanswer = false; } $question->truefeedback = $answers[$questiondata->options->trueanswer]->feedback; $question->falsefeedback = $answers[$questiondata->options->falseanswer]->feedback; $question->truefeedbackformat = $answers[$questiondata->options->trueanswer]->feedbackformat; $question->falsefeedbackformat = $answers[$questiondata->options->falseanswer]->feedbackformat; $question->trueanswerid = $questiondata->options->trueanswer; $question->falseanswerid = $questiondata->options->falseanswer; } public function delete_question($questionid, $contextid) { global $DB; $DB->delete_records('question_truefalse', array('question' => $questionid)); parent::delete_question($questionid, $contextid); } public function move_files($questionid, $oldcontextid, $newcontextid) { parent::move_files($questionid, $oldcontextid, $newcontextid); $this->move_files_in_answers($questionid, $oldcontextid, $newcontextid); } protected function delete_files($questionid, $contextid) { parent::delete_files($questionid, $contextid); $this->delete_files_in_answers($questionid, $contextid); } public function get_random_guess_score($questiondata) { return 0.5; } public function get_possible_responses($questiondata) { return array( $questiondata->id => array( 0 => new question_possible_response(get_string('false', 'qtype_truefalse'), $questiondata->options->answers[ $questiondata->options->falseanswer]->fraction), 1 => new question_possible_response(get_string('true', 'qtype_truefalse'), $questiondata->options->answers[ $questiondata->options->trueanswer]->fraction), null => question_possible_response::no_response() ) ); } }