From 0b4c2c04f90d3b09bd3cba359fb07fd1973f5c0c Mon Sep 17 00:00:00 2001 From: Jean-Michel Vedrine Date: Thu, 4 Apr 2013 18:32:59 +0200 Subject: [PATCH 1/1] MDL-38880 Imported Cloze questions lose embedded images or other media --- question/format/xml/format.php | 36 ++++--- .../format/xml/tests/fixtures/multianswer.xml | 27 ++++++ .../sample_questions_with_old_image_tag.xml | 96 +++++++++++++++++++ 3 files changed, 144 insertions(+), 15 deletions(-) create mode 100644 question/format/xml/tests/fixtures/multianswer.xml create mode 100644 question/format/xml/tests/fixtures/sample_questions_with_old_image_tag.xml diff --git a/question/format/xml/format.php b/question/format/xml/format.php index 21b201d1a50..9c8304c6a1f 100644 --- a/question/format/xml/format.php +++ b/question/format/xml/format.php @@ -448,37 +448,43 @@ class qformat_xml extends qformat_default { * @return object question object */ public function import_multianswer($question) { + global $USER; question_bank::get_qtype('multianswer'); - $questiontext['text'] = $this->import_text($question['#']['questiontext'][0]['#']['text']); - $questiontext['format'] = FORMAT_HTML; - $questiontext['itemid'] = ''; + $questiontext = $this->import_text_with_files($question, + array('#', 'questiontext', 0)); $qo = qtype_multianswer_extract_question($questiontext); // 'header' parts particular to multianswer $qo->qtype = 'multianswer'; $qo->course = $this->course; - $qo->generalfeedback = ''; $qo->name = $this->clean_question_name($this->import_text($question['#']['name'][0]['#']['text'])); $qo->questiontextformat = $questiontext['format']; $qo->questiontext = $qo->questiontext['text']; - $itemid = $this->import_files($this->getpath($question, - array('#', 'questiontext', 0, '#', 'file'), array(), false)); - if (!empty($itemid)) { - $qo->questiontextitemid = $itemid; + if (!empty($questiontext['itemid'])) { + $qo->questiontextitemid = $questiontext['itemid']; } + // Backwards compatibility, deal with the old image tag. $filedata = $this->getpath($question, array('#', 'image_base64', '0', '#'), null, false); $filename = $this->getpath($question, array('#', 'image', '0', '#'), null, false); if ($filedata && $filename) { - $data = new stdClass(); - $data->content = $filedata; - $data->encoding = 'base64'; - // Question file areas don't support subdirs, so convert path to filename if necessary. - $data->name = clean_param(str_replace('/', '_', $filename), PARAM_FILE); - $qo->questiontextfiles[] = $data; - $qo->questiontext .= ' '; + $fs = get_file_storage(); + if (empty($qo->questiontextitemid)) { + $qo->questiontextitemid = file_get_unused_draft_itemid(); + } + $filename = clean_param(str_replace('/', '_', $filename), PARAM_FILE); + $filerecord = array( + 'contextid' => context_user::instance($USER->id)->id, + 'component' => 'user', + 'filearea' => 'draft', + 'itemid' => $qo->questiontextitemid, + 'filepath' => '/', + 'filename' => $filename, + ); + $fs->create_file_from_string($filerecord, base64_decode($filedata)); + $qo->questiontext .= ' '; } // restore files in generalfeedback diff --git a/question/format/xml/tests/fixtures/multianswer.xml b/question/format/xml/tests/fixtures/multianswer.xml new file mode 100644 index 00000000000..5a3cc3422a6 --- /dev/null +++ b/question/format/xml/tests/fixtures/multianswer.xml @@ -0,0 +1,27 @@ + + + + + + $course$/Default for Test images in backup + + + + + + + + cloze with images + + + Match the following cities with the correct state,

+

California California flag or Arizona Arizona flag
* San Francisco: {1:MULTICHOICE:=California#OK~Arizona#Wrong}
* Tucson: {1:MULTICHOICE:California#Wrong~%100%Arizona#OK}
* Los Angeles: {1:MULTICHOICE:=California#OK~Arizona#Wrong}
* Phoenix: {1:MULTICHOICE:%0%California#Wrong~=Arizona#OK}
The capital of France is {1:SHORTANSWER:%100%Paris#Congratulations!
~%50%Marseille#No, that is the second largest city in France (after
Paris).~*#Wrong answer. The capital of France is Paris, of course.}.

]]>
+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
+ + This is a Moodle question Moodle logo

]]>
+iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAHzSURBVDhPxZFbSJNhGIDXERsVGbKawWJaoyAYGeqNYgdl6zenrhhUlB0I6iJEbUl0WF1UUK2DYhDkGghu7Z+HraisPLAsu+0ygi66kCioqwg2t6f///YhzAVBXfTc/HzP9/J8L/wG/pG8QDw+TE+Xn/O+dva07MW5vZayys3yNp/ZwPPRBPuOHqGisordDc00Ki42bqhAjQ3Jid8jAvoL9vIt4qs463G73VRtrcFiseDvuSYG+TwB7y/zfdzHpzeDWachAjeuXyWkPqZ21zZ2Nrioa/JQarOjlK8jes7Eh/s18GwHRMxkgka+3lvEi1ubcgM63Zea6W5v5ESLB4fDwRVvNam+eRBey3TAxqObNl76rXwLFvAlsIyhC2W5gZ+JJmYixQS9q8RZZzpghwEr/R2LpYGPIYWZqJnYSWNugCkPPDDx1JddTyeZqCetasMdS6WB9OQB7Xet5kmbITeQntoP/YWEfSZxFoy5SA2YCXeukAJ+vD5MMl7Cw9YF2UAkGhIXmYSbZLgI9WKxOOukx52kVAvq6eXS6HOHyAyuRz0lN5hlwg19hcTOWqXQ0FxaXZPnGC4V7s+BsToRUM8YpdA2eHswG/DO2eDV7WpGWg30dpZIA5Nddkba5nP3+Epp4F2vwqh3CXeOLZyzwV/wvwPwC58bSNEdAkhaAAAAAElFTkSuQmCC
+ 0.3333333 + 0 +
+ +
\ No newline at end of file diff --git a/question/format/xml/tests/fixtures/sample_questions_with_old_image_tag.xml b/question/format/xml/tests/fixtures/sample_questions_with_old_image_tag.xml new file mode 100644 index 00000000000..852e5bc1979 --- /dev/null +++ b/question/format/xml/tests/fixtures/sample_questions_with_old_image_tag.xml @@ -0,0 +1,96 @@ + + + + + + + + $course$/Default for Test images in backup + + + + + + + + + cloze question with image + + +Match the following cities with the correct state:
* San Francisco: {1:MULTICHOICE:=California#OK~Arizona#Wrong}
* Tucson: {1:MULTICHOICE:California#Wrong~%100%Arizona#OK}
* Los Angeles: {1:MULTICHOICE:=California#OK~Arizona#Wrong}
* Phoenix: {1:MULTICHOICE:%0%California#Wrong~=Arizona#OK}
The capital of France is {1:SHORTANSWER:%100%Paris#Congratulations!
~%50%Marseille#No, that is the second largest city in France (after
Paris).~*#Wrong answer. The capital of France is Paris, of course.}.
]]>
+
+moodle.png + +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAHzSURBVDhPxZFbSJNhGIDXERsVGbKawWJaoyAYGeqNYgdl6zenrhhUlB0I6iJEbUl0WF1UUK2DYhDkGghu7Z+HraisPLAsu+0ygi66kCioqwg2t6f///YhzAVBXfTc/HzP9/J8L/wG/pG8QDw+TE+Xn/O+dva07MW5vZayys3yNp/ZwPPRBPuOHqGisordDc00Ki42bqhAjQ3Jid8jAvoL9vIt4qs463G73VRtrcFiseDvuSYG+TwB7y/zfdzHpzeDWachAjeuXyWkPqZ21zZ2Nrioa/JQarOjlK8jes7Eh/s18GwHRMxkgka+3lvEi1ubcgM63Zea6W5v5ESLB4fDwRVvNam+eRBey3TAxqObNl76rXwLFvAlsIyhC2W5gZ+JJmYixQS9q8RZZzpghwEr/R2LpYGPIYWZqJnYSWNugCkPPDDx1JddTyeZqCetasMdS6WB9OQB7Xet5kmbITeQntoP/YWEfSZxFoy5SA2YCXeukAJ+vD5MMl7Cw9YF2UAkGhIXmYSbZLgI9WKxOOukx52kVAvq6eXS6HOHyAyuRz0lN5hlwg19hcTOWqXQ0FxaXZPnGC4V7s+BsToRUM8YpdA2eHswG/DO2eDV7WpGWg30dpZIA5Nddkba5nP3+Epp4F2vwqh3CXeOLZyzwV/wvwPwC58bSNEdAkhaAAAAAElFTkSuQmCC + + + + + + 0 +
+ + + + + + mcq with image + + + + + moodle.png + +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAHzSURBVDhPxZFbSJNhGIDXERsVGbKawWJaoyAYGeqNYgdl6zenrhhUlB0I6iJEbUl0WF1UUK2DYhDkGghu7Z+HraisPLAsu+0ygi66kCioqwg2t6f///YhzAVBXfTc/HzP9/J8L/wG/pG8QDw+TE+Xn/O+dva07MW5vZayys3yNp/ZwPPRBPuOHqGisordDc00Ki42bqhAjQ3Jid8jAvoL9vIt4qs463G73VRtrcFiseDvuSYG+TwB7y/zfdzHpzeDWachAjeuXyWkPqZ21zZ2Nrioa/JQarOjlK8jes7Eh/s18GwHRMxkgka+3lvEi1ubcgM63Zea6W5v5ESLB4fDwRVvNam+eRBey3TAxqObNl76rXwLFvAlsIyhC2W5gZ+JJmYixQS9q8RZZzpghwEr/R2LpYGPIYWZqJnYSWNugCkPPDDx1JddTyeZqCetasMdS6WB9OQB7Xet5kmbITeQntoP/YWEfSZxFoy5SA2YCXeukAJ+vD5MMl7Cw9YF2UAkGhIXmYSbZLgI9WKxOOukx52kVAvq6eXS6HOHyAyuRz0lN5hlwg19hcTOWqXQ0FxaXZPnGC4V7s+BsToRUM8YpdA2eHswG/DO2eDV7WpGWg30dpZIA5Nddkba5nP3+Epp4F2vwqh3CXeOLZyzwV/wvwPwC58bSNEdAkhaAAAAAElFTkSuQmCC + + + + + + 1 + 0.1 + 0 + 1 + true + true + + + + + + + abc + + +wrong answer + + + + + + + + + +another wrong answer + + + + + + + + + +right answer + + + + + + + + + + +
\ No newline at end of file -- 2.43.0