See Release Notes
Long Term Support Release
<?php // This file is part of Moodle - http://moodle.org/ // // Moodle is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Moodle is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * Drag-and-drop onto image question definition class. * * @package qtype_ddimageortext * @copyright 2009 The Open University * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); require_once($CFG->dirroot . '/question/type/questionbase.php'); require_once($CFG->dirroot . '/question/type/gapselect/questionbase.php'); /** * Represents a drag-and-drop onto image question. * * @copyright 2009 The Open University * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class qtype_ddtoimage_question_base extends qtype_gapselect_question_base { public function clear_wrong_from_response(array $response) { foreach ($this->places as $place => $notused) { if (array_key_exists($this->field($place), $response) && $response[$this->field($place)] != $this->get_right_choice_for($place)) { $response[$this->field($place)] = ''; } } return $response; } public function get_right_choice_for($placeno) { $place = $this->places[$placeno]; foreach ($this->choiceorder[$place->group] as $choicekey => $choiceid) { if ($this->rightchoices[$placeno] == $choiceid) { return $choicekey; } } } public function summarise_response(array $response) { $allblank = true; foreach ($this->places as $placeno => $place) { $summariseplace = $place->summarise(); if (array_key_exists($this->field($placeno), $response) && $response[$this->field($placeno)]) { $selected = $this->get_selected_choice($place->group, $response[$this->field($placeno)]); if (isset($selected)) { $summarisechoice = $selected->summarise(); } else { $summarisechoice = get_string('deletedchoice', 'qtype_ddimageortext'); } $allblank = false; } else { $summarisechoice = ''; } $choices[] = "$summariseplace -> {{$summarisechoice}}"; } if ($allblank) { return null; } return implode(' ', $choices); } public function check_file_access($qa, $options, $component, $filearea, $args, $forcedownload) { if ($filearea == 'bgimage' || $filearea == 'dragimage') { $validfilearea = true; } else { $validfilearea = false; } if ($component == 'qtype_ddimageortext' && $validfilearea) { $question = $qa->get_question(); $itemid = reset($args); if ($filearea == 'bgimage') { return $itemid == $question->id; } else if ($filearea == 'dragimage') { foreach ($question->choices as $group) { foreach ($group as $drag) { if ($drag->id == $itemid) { return true; } } } return false; } } else { return parent::check_file_access($qa, $options, $component, $filearea, $args, $forcedownload); } } public function get_validation_error(array $response) { if ($this->is_complete_response($response)) { return ''; } return get_string('pleasedraganimagetoeachdropregion', 'qtype_ddimageortext'); } public function classify_response(array $response) { $parts = array(); foreach ($this->places as $placeno => $place) { $group = $place->group; if (!array_key_exists($this->field($placeno), $response) || !$response[$this->field($placeno)]) { $parts[$placeno] = question_classified_response::no_response(); continue; } $fieldname = $this->field($placeno); $choicekey = $this->choiceorder[$group][$response[$fieldname]]; $choice = $this->choices[$group][$choicekey]; $correct = $this->get_right_choice_for($placeno) == $response[$fieldname]; if ($correct) { $grade = 1; } else { $grade = 0; } $parts[$placeno] = new question_classified_response($choice->no, $choice->summarise(), $grade); } return $parts; } public function get_random_guess_score() {< $accum = 0;> if (empty($this->places)) { > // Having no places would be nonsensical. However, it used to be possible > // to create questions like that, so avoid errors in this case. > return null; > }> $accum = 0;foreach ($this->places as $place) { foreach ($this->choices[$place->group] as $choice) { if ($choice->infinite) { return null; } } $accum += 1 / count($this->choices[$place->group]); } return $accum / count($this->places); } public function get_question_summary() { $summary = ''; if (!html_is_blank($this->questiontext)) { $question = $this->html_to_text($this->questiontext, $this->questiontextformat); $summary .= $question . '; '; } $places = array(); foreach ($this->places as $place) { $cs = array(); foreach ($this->choices[$place->group] as $choice) { $cs[] = $choice->summarise(); } $places[] = '[[' . $place->summarise() . ']] -> {' . implode(' / ', $cs) . '}'; } $summary .= implode('; ', $places); return $summary; } }