MDL-47494 gapselect: Add lots of missing public/protected/private.
[moodle.git] / question / type / gapselect / backup / moodle2 / restore_qtype_gapselect_plugin.class.php
1 <?php
3 // This file is part of Moodle - http://moodle.org/
4 //
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
18 /**
19  * @package    moodlecore
20  * @subpackage backup-moodle2
21  * @copyright  2011 The Open University
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
26 defined('MOODLE_INTERNAL') || die();
29 /**
30  * restore plugin class that provides the necessary information
31  * needed to restore one gapselect qtype plugin
32  *
33  * @copyright  2011 The Open University
34  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
35  */
36 class restore_qtype_gapselect_plugin extends restore_qtype_plugin {
38     /**
39      * Returns the paths to be handled by the plugin at question level
40      */
41     protected function define_question_plugin_structure() {
43         $paths = array();
45         // This qtype uses question_answers, add them
46         $this->add_question_question_answers($paths);
48         // Add own qtype stuff
49         $elename = 'gapselect';
50         $elepath = $this->get_pathfor('/gapselect'); // we used get_recommended_name() so this works
51         $paths[] = new restore_path_element($elename, $elepath);
54         return $paths; // And we return the interesting paths
55     }
57     /**
58      * Process the qtype/gapselect element
59      */
60     public function process_gapselect($data) {
61         global $DB;
63         $data = (object)$data;
64         $oldid = $data->id;
66         // Detect if the question is created or mapped
67         $oldquestionid   = $this->get_old_parentid('question');
68         $newquestionid   = $this->get_new_parentid('question');
69         $questioncreated = $this->get_mappingid('question_created', $oldquestionid) ? true : false;
71         // If the question has been created by restore, we need to create its question_gapselect too
72         if ($questioncreated) {
73             // Adjust some columns
74             $data->questionid = $newquestionid;
75             // Insert record
76             $newitemid = $DB->insert_record('question_gapselect', $data);
77             // Create mapping (needed for decoding links)
78             $this->set_mapping('question_gapselect', $oldid, $newitemid);
79         } else {
80             // Nothing to remap if the question already existed
81         }
82     }
84     /**
85      * Given one question_states record, return the answer
86      * recoded pointing to all the restored stuff for gapselect questions
87      *
88      * answer are two (hypen speparated) lists of comma separated question_answers
89      * the first to specify the order of the answers and the second to specify the
90      * responses. Note the order list (the first one) can be optional
91      */
92     public function recode_state_answer($state) {
93         $answer = $state->answer;
94         $orderarr = array();
95         $responsesarr = array();
96         $lists = explode(':', $answer);
97         // if only 1 list, answer is missing the order list, adjust
98         if (count($lists) == 1) {
99             $lists[1] = $lists[0]; // here we have the responses
100             $lists[0] = '';        // here we have the order
101         }
102         // Map order
103         foreach (explode(',', $lists[0]) as $id) {
104             if (!empty($id) && $newid = $this->get_mappingid('question_answer', $id)) {
105                 $orderarr[] = $newid;
106             }
107         }
108         // Map responses
109         foreach (explode(',', $lists[1]) as $id) {
110             if (!empty($id) && $newid = $this->get_mappingid('question_answer', $id)) {
111                 $responsesarr[] = $newid;
112             }
113         }
114         // Build the final answer, if not order, only responses
115         $result = '';
116         if (empty($orderarr)) {
117             $result = implode(',', $responsesarr);
118         } else {
119             $result = implode(',', $orderarr) . ':' . implode(',', $responsesarr);
120         }
121         return $result;
122     }
124     /**
125      * Return the contents of this qtype to be processed by the links decoder
126      */
127     public static function define_decode_contents() {
129         $contents = array();
131         $fields = array('correctfeedback', 'partiallycorrectfeedback', 'incorrectfeedback');
132         $contents[] = new restore_decode_content('question_gapselect', $fields, 'question_gapselect');
134         return $contents;
135     }