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 * Upgrade library code for the multianswer question type. 19 * 20 * @package qtype 21 * @subpackage multianswer 22 * @copyright 2011 The Open University 23 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 24 */ 25 26 27 defined('MOODLE_INTERNAL') || die(); 28 29 30 /** 31 * Class for converting attempt data for multianswer questions when upgrading 32 * attempts to the new question engine. 33 * 34 * This class is used by the code in question/engine/upgrade/upgradelib.php. 35 * 36 * @copyright 2011 The Open University 37 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 38 */ 39 class qtype_multianswer_qe2_attempt_updater extends question_qtype_attempt_updater { 40 41 public function question_summary() { 42 $summary = $this->to_text($this->question->questiontext); 43 foreach ($this->question->options->questions as $i => $subq) { 44 switch ($subq->qtype) { 45 case 'multichoice': 46 $choices = array(); 47 foreach ($subq->options->answers as $ans) { 48 $choices[] = $this->to_text($ans->answer); 49 } 50 $answerbit = '{' . implode('; ', $choices) . '}'; 51 break; 52 case 'numerical': 53 case 'shortanswer': 54 $answerbit = '_____'; 55 break; 56 default: 57 $answerbit = '{ERR unknown sub-question type}'; 58 } 59 $summary = str_replace('{#' . $i . '}', $answerbit, $summary); 60 } 61 return $summary; 62 } 63 64 public function right_answer() { 65 $right = array(); 66 67 foreach ($this->question->options->questions as $i => $subq) { 68 foreach ($subq->options->answers as $ans) { 69 if ($ans->fraction > 0.999) { 70 $right[$i] = $ans->answer; 71 break; 72 } 73 } 74 } 75 76 return $this->display_response($right); 77 } 78 79 public function explode_answer($answer) { 80 $response = array(); 81 82 foreach (explode(',', $answer) as $part) { 83 list($index, $partanswer) = explode('-', $part, 2); 84 $response[$index] = str_replace( 85 array(',', '-'), array(",", "-"), $partanswer); 86 } 87 88 return $response; 89 } 90 91 public function display_response($response) { 92 $summary = array(); 93 foreach ($this->question->options->questions as $i => $subq) { 94 $a = new stdClass(); 95 $a->i = $i; 96 $a->response = $this->to_text($response[$i]); 97 $summary[] = get_string('subqresponse', 'qtype_multianswer', $a); 98 } 99 100 return implode('; ', $summary); 101 } 102 103 public function response_summary($state) { 104 $response = $this->explode_answer($state->answer); 105 foreach ($this->question->options->questions as $i => $subq) { 106 if ($response[$i] && $subq->qtype == 'multichoice') { 107 $response[$i] = $subq->options->answers[$response[$i]]->answer; 108 } 109 } 110 return $this->display_response($response); 111 } 112 113 public function was_answered($state) { 114 return !empty($state->answer); 115 } 116 117 public function set_first_step_data_elements($state, &$data) { 118 foreach ($this->question->options->questions as $i => $subq) { 119 switch ($subq->qtype) { 120 case 'multichoice': 121 $data[$this->add_prefix('_order', $i)] = 122 implode(',', array_keys($subq->options->answers)); 123 break; 124 case 'numerical': 125 $data[$this->add_prefix('_separators', $i)] = '.$,'; 126 break; 127 } 128 } 129 } 130 131 public function supply_missing_first_step_data(&$data) { 132 } 133 134 public function set_data_elements_for_step($state, &$data) { 135 $response = $this->explode_answer($state->answer); 136 foreach ($this->question->options->questions as $i => $subq) { 137 if (empty($response[$i])) { 138 continue; 139 } 140 141 switch ($subq->qtype) { 142 case 'multichoice': 143 $choices = array(); 144 $order = 0; 145 foreach ($subq->options->answers as $ans) { 146 if ($ans->id == $response[$i]) { 147 $data[$this->add_prefix('answer', $i)] = $order; 148 } 149 $order++; 150 } 151 $answerbit = '{' . implode('; ', $choices) . '}'; 152 break; 153 case 'numerical': 154 case 'shortanswer': 155 $data[$this->add_prefix('answer', $i)] = $response[$i]; 156 break; 157 } 158 } 159 } 160 161 public function add_prefix($field, $i) { 162 $prefix = 'sub' . $i . '_'; 163 if (substr($field, 0, 2) === '!_') { 164 return '-_' . $prefix . substr($field, 2); 165 } else if (substr($field, 0, 1) === '-') { 166 return '-' . $prefix . substr($field, 1); 167 } else if (substr($field, 0, 1) === '_') { 168 return '_' . $prefix . substr($field, 1); 169 } else { 170 return $prefix . $field; 171 } 172 } 173 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body