See Release Notes
Long Term Support Release
Differences Between: [Versions 310 and 401] [Versions 311 and 401] [Versions 39 and 401] [Versions 401 and 402] [Versions 401 and 403]
1 <?php 2 // This file is part of Moodle - http://moodle.org/ 3 // 4 // Moodle is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // Moodle is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 16 17 /** 18 * Drag-and-drop onto image question renderer class. 19 * 20 * @package qtype_ddimageortext 21 * @copyright 2010 The Open University 22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 23 */ 24 25 26 defined('MOODLE_INTERNAL') || die(); 27 28 /** 29 * Generates the output for drag-and-drop onto image questions. 30 * 31 * @copyright 2010 The Open University 32 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 33 */ 34 class qtype_ddtoimage_renderer_base extends qtype_with_combined_feedback_renderer { 35 36 public function clear_wrong(question_attempt $qa) { 37 $question = $qa->get_question(); 38 $response = $qa->get_last_qt_data(); 39 40 if (!empty($response)) { 41 $cleanresponse = $question->clear_wrong_from_response($response); 42 } else { 43 $cleanresponse = $response; 44 } 45 $cleanresponsehtml = ''; 46 foreach ($cleanresponse as $fieldname => $value) { 47 list (, $html) = $this->hidden_field_for_qt_var($qa, $fieldname, $value); 48 $cleanresponsehtml .= $html; 49 } 50 return $cleanresponsehtml; 51 } 52 53 public function formulation_and_controls(question_attempt $qa, 54 question_display_options $options) { 55 56 $question = $qa->get_question(); 57 $response = $qa->get_last_qt_data(); 58 59 $questiontext = $question->format_questiontext($qa); 60 61 $dropareaclass = 'droparea'; 62 $draghomesclass = 'draghomes'; 63 if ($options->readonly) { 64 $dropareaclass .= ' readonly'; 65 $draghomesclass .= ' readonly'; 66 } 67 68 $output = html_writer::div($questiontext, 'qtext'); 69 70 $output .= html_writer::start_div('ddarea'); 71 $output .= html_writer::start_div($dropareaclass); 72 $output .= html_writer::img(self::get_url_for_image($qa, 'bgimage'), get_string('dropbackground', 'qtype_ddmarker'), 73 ['class' => 'dropbackground img-fluid w-100']); 74 75 $output .= html_writer::div('', 'dropzones'); 76 $output .= html_writer::end_div(); 77 $output .= html_writer::start_div($draghomesclass); 78 79 $dragimagehomes = ''; 80 foreach ($question->choices as $groupno => $group) { 81 $dragimagehomesgroup = ''; 82 $orderedgroup = $question->get_ordered_choices($groupno); 83 foreach ($orderedgroup as $choiceno => $dragimage) { 84 $dragimageurl = self::get_url_for_image($qa, 'dragimage', $dragimage->id); 85 $classes = [ 86 'group' . $groupno, 87 'draghome', 88 'user-select-none', 89 'choice' . $choiceno 90 ]; 91 if ($dragimage->infinite) { 92 $classes[] = 'infinite'; 93 } 94 if ($dragimageurl === null) { 95 $dragimagehomesgroup .= html_writer::div($dragimage->text, join(' ', $classes), ['src' => $dragimageurl]); 96 } else { 97 $dragimagehomesgroup .= html_writer::img($dragimageurl, $dragimage->text, ['class' => join(' ', $classes)]); 98 } 99 } 100 $dragimagehomes .= html_writer::div($dragimagehomesgroup, 'dragitemgroup' . $groupno); 101 } 102 103 $output .= $dragimagehomes; 104 $output .= html_writer::end_div(); 105 106 foreach ($question->places as $placeno => $place) { 107 $varname = $question->field($placeno); 108 list($fieldname, $html) = $this->hidden_field_for_qt_var($qa, $varname, null, 109 ['placeinput', 'place' . $placeno, 'group' . $place->group]); 110 $output .= $html; 111 $question->places[$placeno]->fieldname = $fieldname; 112 } 113 114 $output .= html_writer::end_div(); 115 116 $this->page->requires->string_for_js('blank', 'qtype_ddimageortext'); 117 $this->page->requires->js_call_amd('qtype_ddimageortext/question', 'init', 118 [$qa->get_outer_question_div_unique_id(), $options->readonly, $question->places]); 119 120 if ($qa->get_state() == question_state::$invalid) { 121 $output .= html_writer::div($question->get_validation_error($qa->get_last_qt_data()), 'validationerror'); 122 } 123 return $output; 124 } 125 126 /** 127 * Returns the URL for an image 128 * 129 * @param object $qa Question attempt object 130 * @param string $filearea File area descriptor 131 * @param int $itemid Item id to get 132 * @return string Output url, or null if not found 133 */ 134 protected static function get_url_for_image(question_attempt $qa, $filearea, $itemid = 0) { 135 $question = $qa->get_question(); 136 $qubaid = $qa->get_usage_id(); 137 $slot = $qa->get_slot(); 138 $fs = get_file_storage(); 139 if ($filearea == 'bgimage') { 140 $itemid = $question->id; 141 } 142 $componentname = $question->qtype->plugin_name(); 143 $draftfiles = $fs->get_area_files($question->contextid, $componentname, 144 $filearea, $itemid, 'id'); 145 if ($draftfiles) { 146 foreach ($draftfiles as $file) { 147 if ($file->is_directory()) { 148 continue; 149 } 150 $url = moodle_url::make_pluginfile_url($question->contextid, $componentname, 151 $filearea, "$qubaid/$slot/{$itemid}", '/', 152 $file->get_filename()); 153 return $url->out(); 154 } 155 } 156 return null; 157 } 158 159 /** 160 * Returns a hidden field for a qt variable 161 * 162 * @param object $qa Question attempt object 163 * @param string $varname The hidden var name 164 * @param string $value The hidden value 165 * @param array $classes Any additional css classes to apply 166 * @return array Array with field name and the html of the tag 167 */ 168 protected function hidden_field_for_qt_var(question_attempt $qa, $varname, $value = null, 169 $classes = null) { 170 if ($value === null) { 171 $value = $qa->get_last_qt_var($varname); 172 } 173 $fieldname = $qa->get_qt_field_name($varname); 174 $attributes = array('type' => 'hidden', 175 'id' => str_replace(':', '_', $fieldname), 176 'name' => $fieldname, 177 'value' => $value); 178 if ($classes !== null) { 179 $attributes['class'] = join(' ', $classes); 180 } 181 return array($fieldname, html_writer::empty_tag('input', $attributes)."\n"); 182 } 183 184 public function specific_feedback(question_attempt $qa) { 185 return $this->combined_feedback($qa); 186 } 187 188 public function correct_response(question_attempt $qa) { 189 return ''; 190 } 191 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body