3939 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
4040 */
4141class importer extends qformat_xml {
42-
4342 /**
4443 * Import a file to update a given question.
4544 *
4645 * @param qformat_xml $qformat an instance of
4746 * @param question_definition $question the question to add a version to.
4847 * @param string $importedquestionfile filename of the file to import.
49- * @return bool true on success. False on failure.
48+ * @return object|boolean Either a simple object with error and/or notice properties when there are issues
49+ * or true on success.
5050 */
5151 public static function import_file (
5252 qformat_xml $ qformat ,
5353 question_definition $ question ,
5454 string $ importedquestionfile
5555 ) {
56- global $ USER , $ DB , $ OUTPUT ;
56+ global $ USER , $ DB ;
5757
5858 $ context = context::instance_by_id ($ question ->contextid );
5959
6060 // STAGE 1: Parse the file.
6161 if (! $ importedlines = $ qformat ->readdata ($ importedquestionfile )) {
62- throw new exception (get_string ('cannotread ' , 'question ' ));
62+ $ result = new stdClass ();
63+ $ result ->error = get_string ('cannotread ' , 'question ' );
64+ return $ result ;
6365 }
6466
6567 // Extract all the questions.
6668 if (!$ importedquestions = $ qformat ->readquestions ($ importedlines )) {
67- throw new exception (get_string ('noquestionsinfile ' , 'question ' ));
69+ $ result = new stdClass ();
70+ $ result ->error = get_string ('noquestionsinfile ' , 'question ' );
71+ return $ result ;
6872 }
6973
7074 // Check if there's only one question in the file -- remove this once we do batch processing!
7175 if (count ($ importedquestions ) != 1 ) {
72- throw new exception (get_string ('toomanyquestionsinfile ' , 'qbank_importasversion ' ));
76+ $ result = new stdClass ();
77+ $ result ->error = get_string ('toomanyquestionsinfile ' , 'qbank_importasversion ' );
78+ return $ result ;
7379 }
7480
7581 // Count number of questions processed.
@@ -111,23 +117,45 @@ public static function import_file(
111117 $ questionversion ->id = $ DB ->insert_record ('question_versions ' , $ questionversion );
112118
113119 if (isset ($ newquestion ->questiontextitemid )) {
114- $ newquestion ->questiontext = file_save_draft_area_files ($ newquestion ->questiontextitemid ,
115- $ context ->id , 'question ' , 'questiontext ' , $ newquestion ->id ,
116- $ fileoptions , $ newquestion ->questiontext );
120+ $ newquestion ->questiontext = file_save_draft_area_files (
121+ $ newquestion ->questiontextitemid ,
122+ $ context ->id ,
123+ 'question ' ,
124+ 'questiontext ' ,
125+ $ newquestion ->id ,
126+ $ fileoptions ,
127+ $ newquestion ->questiontext
128+ );
117129 } else if (isset ($ newquestion ->questiontextfiles )) {
118130 foreach ($ newquestion ->questiontextfiles as $ file ) {
119131 question_bank::get_qtype ($ newquestion ->qtype )->import_file (
120- $ context , 'question ' , 'questiontext ' , $ newquestion ->id , $ file );
132+ $ context ,
133+ 'question ' ,
134+ 'questiontext ' ,
135+ $ newquestion ->id ,
136+ $ file
137+ );
121138 }
122139 }
123140 if (isset ($ newquestion ->generalfeedbackitemid )) {
124- $ newquestion ->generalfeedback = file_save_draft_area_files ($ newquestion ->generalfeedbackitemid ,
125- $ context ->id , 'question ' , 'generalfeedback ' , $ newquestion ->id ,
126- $ fileoptions , $ newquestion ->generalfeedback );
141+ $ newquestion ->generalfeedback = file_save_draft_area_files (
142+ $ newquestion ->generalfeedbackitemid ,
143+ $ context ->id ,
144+ 'question ' ,
145+ 'generalfeedback ' ,
146+ $ newquestion ->id ,
147+ $ fileoptions ,
148+ $ newquestion ->generalfeedback
149+ );
127150 } else if (isset ($ newquestion ->generalfeedbackfiles )) {
128151 foreach ($ newquestion ->generalfeedbackfiles as $ file ) {
129152 question_bank::get_qtype ($ newquestion ->qtype )->import_file (
130- $ context , 'question ' , 'generalfeedback ' , $ newquestion ->id , $ file );
153+ $ context ,
154+ 'question ' ,
155+ 'generalfeedback ' ,
156+ $ newquestion ->id ,
157+ $ file
158+ );
131159 }
132160 }
133161 $ DB ->update_record ('question ' , $ newquestion );
@@ -148,29 +176,48 @@ public static function import_file(
148176 if ($ isimportingcontextcourseoractivity ) {
149177 $ mergedtags = array_merge ($ newquestion ->coursetags , $ newquestion ->tags );
150178
151- core_tag_tag::set_item_tags ('core_question ' , 'question ' , $ newquestion ->id ,
152- $ newquestion ->context , $ mergedtags );
179+ core_tag_tag::set_item_tags (
180+ 'core_question ' ,
181+ 'question ' ,
182+ $ newquestion ->id ,
183+ $ newquestion ->context ,
184+ $ mergedtags
185+ );
153186 } else {
154- core_tag_tag::set_item_tags ('core_question ' , 'question ' , $ newquestion ->id ,
155- context_course::instance ($ qformat ->course ->id ), $ newquestion ->coursetags );
187+ core_tag_tag::set_item_tags (
188+ 'core_question ' ,
189+ 'question ' ,
190+ $ newquestion ->id ,
191+ context_course::instance ($ qformat ->course ->id ),
192+ $ newquestion ->coursetags
193+ );
156194
157195 if (!empty ($ newquestion ->tags )) {
158- core_tag_tag::set_item_tags ('core_question ' , 'question ' , $ newquestion ->id ,
159- $ importingcontext , $ newquestion ->tags );
196+ core_tag_tag::set_item_tags (
197+ 'core_question ' ,
198+ 'question ' ,
199+ $ newquestion ->id ,
200+ $ importingcontext ,
201+ $ newquestion ->tags
202+ );
160203 }
161204 }
162205 } else if (!empty ($ newquestion ->tags )) {
163- core_tag_tag::set_item_tags ('core_question ' , 'question ' , $ newquestion ->id ,
164- $ newquestion ->context , $ newquestion ->tags );
206+ core_tag_tag::set_item_tags (
207+ 'core_question ' ,
208+ 'question ' ,
209+ $ newquestion ->id ,
210+ $ newquestion ->context ,
211+ $ newquestion ->tags
212+ );
165213 }
166214 }
167215
168216 if (!empty ($ result ->error )) {
169- echo $ OUTPUT ->notification ($ result ->error );
170217 // Can't use $transaction->rollback(); since it requires an exception,
171218 // and I don't want to rewrite this code to change the error handling now.
172219 $ DB ->force_transaction_rollback ();
173- return false ;
220+ return $ result ;
174221 }
175222
176223 question_version_imported::create ([
@@ -185,11 +232,19 @@ public static function import_file(
185232
186233 $ transaction ->allow_commit ();
187234
188- if (!empty ($ result ->notice )) {
189- echo $ OUTPUT ->notification ($ result ->notice );
190- return true ;
235+ if ($ result === null ) {
236+ // Some question types don't have a return value when saving options.
237+ // If it hasn't thrown an Exception then it's fine.
238+ $ result = true ;
239+ }
240+ if ($ result === false ) {
241+ // This probably shouldn't happen but given all the question types out there
242+ // it's probably worth making sure we're handling it.
243+ $ result = new stdClass ();
244+ $ result ->error = get_string ('unknownerror ' , 'qbank_importasversion ' );
245+ return $ result ;
191246 }
192247
193- return true ;
248+ return $ result ;
194249 }
195250}
0 commit comments