AutorÃa | Ultima modificación | Ver Log |
<?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/>.
/**
* Upgrade library code for the multianswer question type.
*
* @package qtype
* @subpackage multianswer
* @copyright 2011 The Open University
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
/**
* Class for converting attempt data for multianswer questions when upgrading
* attempts to the new question engine.
*
* This class is used by the code in question/engine/upgrade/upgradelib.php.
*
* @copyright 2011 The Open University
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class qtype_multianswer_qe2_attempt_updater extends question_qtype_attempt_updater {
public function question_summary() {
$summary = $this->to_text($this->question->questiontext);
foreach ($this->question->options->questions as $i => $subq) {
switch ($subq->qtype) {
case 'multichoice':
$choices = array();
foreach ($subq->options->answers as $ans) {
$choices[] = $this->to_text($ans->answer);
}
$answerbit = '{' . implode('; ', $choices) . '}';
break;
case 'numerical':
case 'shortanswer':
$answerbit = '_____';
break;
default:
$answerbit = '{ERR unknown sub-question type}';
}
$summary = str_replace('{#' . $i . '}', $answerbit, $summary);
}
return $summary;
}
public function right_answer() {
$right = array();
foreach ($this->question->options->questions as $i => $subq) {
foreach ($subq->options->answers as $ans) {
if ($ans->fraction > 0.999) {
$right[$i] = $ans->answer;
break;
}
}
}
return $this->display_response($right);
}
public function explode_answer($answer) {
$response = array();
foreach (explode(',', $answer) as $part) {
list($index, $partanswer) = explode('-', $part, 2);
$response[$index] = str_replace(
array(',', '-'), array(",", "-"), $partanswer);
}
return $response;
}
public function display_response($response) {
$summary = array();
foreach ($this->question->options->questions as $i => $subq) {
$a = new stdClass();
$a->i = $i;
$a->response = $this->to_text($response[$i]);
$summary[] = get_string('subqresponse', 'qtype_multianswer', $a);
}
return implode('; ', $summary);
}
public function response_summary($state) {
$response = $this->explode_answer($state->answer);
foreach ($this->question->options->questions as $i => $subq) {
if ($response[$i] && $subq->qtype == 'multichoice') {
$response[$i] = $subq->options->answers[$response[$i]]->answer;
}
}
return $this->display_response($response);
}
public function was_answered($state) {
return !empty($state->answer);
}
public function set_first_step_data_elements($state, &$data) {
foreach ($this->question->options->questions as $i => $subq) {
switch ($subq->qtype) {
case 'multichoice':
$data[$this->add_prefix('_order', $i)] =
implode(',', array_keys($subq->options->answers));
break;
case 'numerical':
$data[$this->add_prefix('_separators', $i)] = '.$,';
break;
}
}
}
public function supply_missing_first_step_data(&$data) {
}
public function set_data_elements_for_step($state, &$data) {
$response = $this->explode_answer($state->answer);
foreach ($this->question->options->questions as $i => $subq) {
if (empty($response[$i])) {
continue;
}
switch ($subq->qtype) {
case 'multichoice':
$choices = array();
$order = 0;
foreach ($subq->options->answers as $ans) {
if ($ans->id == $response[$i]) {
$data[$this->add_prefix('answer', $i)] = $order;
}
$order++;
}
$answerbit = '{' . implode('; ', $choices) . '}';
break;
case 'numerical':
case 'shortanswer':
$data[$this->add_prefix('answer', $i)] = $response[$i];
break;
}
}
}
public function add_prefix($field, $i) {
$prefix = 'sub' . $i . '_';
if (substr($field, 0, 2) === '!_') {
return '-_' . $prefix . substr($field, 2);
} else if (substr($field, 0, 1) === '-') {
return '-' . $prefix . substr($field, 1);
} else if (substr($field, 0, 1) === '_') {
return '_' . $prefix . substr($field, 1);
} else {
return $prefix . $field;
}
}
}