mirrored from git://git.moodle.org/moodle.git
/
restore_qtype_multichoice_plugin.class.php
171 lines (150 loc) · 5.98 KB
/
restore_qtype_multichoice_plugin.class.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
<?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/>.
/**
* @package moodlecore
* @subpackage backup-moodle2
* @copyright 2010 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
/**
* restore plugin class that provides the necessary information
* needed to restore one multichoice qtype plugin
*
* @copyright 2010 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class restore_qtype_multichoice_plugin extends restore_qtype_plugin {
/**
* Returns the paths to be handled by the plugin at question level
*/
protected function define_question_plugin_structure() {
$paths = array();
// This qtype uses question_answers, add them
$this->add_question_question_answers($paths);
// Add own qtype stuff
$elename = 'multichoice';
// we used get_recommended_name() so this works
$elepath = $this->get_pathfor('/multichoice');
$paths[] = new restore_path_element($elename, $elepath);
return $paths; // And we return the interesting paths
}
/**
* Process the qtype/multichoice element
*/
public function process_multichoice($data) {
global $DB;
$data = (object)$data;
$oldid = $data->id;
// Detect if the question is created or mapped
$oldquestionid = $this->get_old_parentid('question');
$newquestionid = $this->get_new_parentid('question');
$questioncreated = (bool) $this->get_mappingid('question_created', $oldquestionid);
// If the question has been created by restore, we need to create its
// question_multichoice too
if ($questioncreated) {
// Adjust some columns
$data->question = $newquestionid;
// Map sequence of question_answer ids
if ($data->answers) {
$answersarr = explode(',', $data->answers);
} else {
$answersarr = array();
}
foreach ($answersarr as $key => $answer) {
$answersarr[$key] = $this->get_mappingid('question_answer', $answer);
}
$data->answers = implode(',', $answersarr);
// Insert record
$newitemid = $DB->insert_record('question_multichoice', $data);
// Create mapping (needed for decoding links)
$this->set_mapping('question_multichoice', $oldid, $newitemid);
}
}
public function recode_response($questionid, $sequencenumber, array $response) {
if (array_key_exists('_order', $response)) {
$response['_order'] = $this->recode_choice_order($response['_order']);
}
return $response;
}
/**
* Recode the choice order as stored in the response.
* @param string $order the original order.
* @return string the recoded order.
*/
protected function recode_choice_order($order) {
$neworder = array();
foreach (explode(',', $order) as $id) {
if ($newid = $this->get_mappingid('question_answer', $id)) {
$neworder[] = $newid;
}
}
return implode(',', $neworder);
}
/**
* Given one question_states record, return the answer
* recoded pointing to all the restored stuff for multichoice questions
*
* answer are two (hypen speparated) lists of comma separated question_answers
* the first to specify the order of the answers and the second to specify the
* responses. Note the order list (the first one) can be optional
*/
public function recode_legacy_state_answer($state) {
$answer = $state->answer;
$orderarr = array();
$responsesarr = array();
$lists = explode(':', $answer);
// if only 1 list, answer is missing the order list, adjust
if (count($lists) == 1) {
$lists[1] = $lists[0]; // here we have the responses
$lists[0] = ''; // here we have the order
}
// Map order
if (!empty($lists[0])) {
foreach (explode(',', $lists[0]) as $id) {
if ($newid = $this->get_mappingid('question_answer', $id)) {
$orderarr[] = $newid;
}
}
}
// Map responses
if (!empty($lists[1])) {
foreach (explode(',', $lists[1]) as $id) {
if ($newid = $this->get_mappingid('question_answer', $id)) {
$responsesarr[] = $newid;
}
}
}
// Build the final answer, if not order, only responses
$result = '';
if (empty($orderarr)) {
$result = implode(',', $responsesarr);
} else {
$result = implode(',', $orderarr) . ':' . implode(',', $responsesarr);
}
return $result;
}
/**
* Return the contents of this qtype to be processed by the links decoder
*/
public static function define_decode_contents() {
$contents = array();
$fields = array('correctfeedback', 'partiallycorrectfeedback', 'incorrectfeedback');
$contents[] = new restore_decode_content('question_multichoice',
$fields, 'question_multichoice');
return $contents;
}
}