4 include_once
"./Modules/TestQuestionPool/classes/export/qti12/class.assQuestionExport.php";
26 function toXML($a_include_header =
true, $a_include_binary =
true, $a_shuffle =
false, $test_output =
false, $force_image_references =
false)
30 include_once
"./Services/Math/classes/class.EvalMath.php";
32 $eval->suppress_errors = TRUE;
33 include_once(
"./Services/Xml/classes/class.ilXmlWriter.php");
37 $a_xml_writer->xmlStartTag(
"questestinterop");
39 "ident" =>
"il_".IL_INST_ID.
"_qst_".$this->object->getId(),
40 "title" => $this->
object->getTitle(),
41 "maxattempts" => $this->
object->getNrOfTries()
43 $a_xml_writer->xmlStartTag(
"item", $attrs);
45 $a_xml_writer->xmlElement(
"qticomment", NULL, $this->object->getComment());
47 $workingtime = $this->
object->getEstimatedWorkingTime();
48 $duration = sprintf(
"P0Y0M0DT%dH%dM%dS", $workingtime[
"h"], $workingtime[
"m"], $workingtime[
"s"]);
49 $a_xml_writer->xmlElement(
"duration", NULL, $duration);
51 $a_xml_writer->xmlStartTag(
"itemmetadata");
52 $a_xml_writer->xmlStartTag(
"qtimetadata");
53 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
54 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"ILIAS_VERSION");
55 $a_xml_writer->xmlElement(
"fieldentry", NULL, $ilias->getSetting(
"ilias_version"));
56 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
57 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
58 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"QUESTIONTYPE");
60 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
61 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
62 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"AUTHOR");
63 $a_xml_writer->xmlElement(
"fieldentry", NULL, $this->object->getAuthor());
64 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
70 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
71 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"textgaprating");
72 $a_xml_writer->xmlElement(
"fieldentry", NULL, $this->object->getTextgapRating());
73 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
75 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
76 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"fixedTextLength");
77 $a_xml_writer->xmlElement(
"fieldentry", NULL, $this->object->getFixedTextLength());
78 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
80 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
81 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"identicalScoring");
82 $a_xml_writer->xmlElement(
"fieldentry", NULL, $this->object->getIdenticalScoring());
83 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
85 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
86 $a_xml_writer->xmlElement(
"fieldlabel", NULL,
"combinations");
87 $a_xml_writer->xmlElement(
"fieldentry", NULL, base64_encode(json_encode($this->object->getGapCombinations())));
88 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
90 $a_xml_writer->xmlEndTag(
"qtimetadata");
91 $a_xml_writer->xmlEndTag(
"itemmetadata");
95 "label" => $this->object->getTitle()
97 $a_xml_writer->xmlStartTag(
"presentation", $attrs);
99 $a_xml_writer->xmlStartTag(
"flow");
101 $questionText = $this->
object->getQuestion() ? $this->
object->getQuestion() :
' ';
102 $this->
object->addQTIMaterial($a_xml_writer, $questionText);
104 $text_parts = preg_split(
"/\[gap.*?\[\/gap\]/", $this->object->getClozeText());
107 for ($i = 0; $i <= $this->
object->getGapCount(); $i++)
109 $this->
object->addQTIMaterial($a_xml_writer, $text_parts[$i]);
111 if ($i < $this->object->getGapCount())
114 $gap = $this->
object->getGap($i);
115 switch ($gap->getType())
121 "rcardinality" =>
"Single" 123 $a_xml_writer->xmlStartTag(
"response_str", $attrs);
124 $solution = $this->
object->getSuggestedSolution($i);
125 if (count($solution))
127 if (preg_match(
"/il_(\d*?)_(\w+)_(\d+)/", $solution[
"internal_link"], $matches))
130 "label" =>
"suggested_solution" 132 $a_xml_writer->xmlStartTag(
"material", $attrs);
133 $intlink =
"il_" . IL_INST_ID .
"_" . $matches[2] .
"_" . $matches[3];
134 if (strcmp($matches[1],
"") != 0)
136 $intlink = $solution[
"internal_link"];
138 $a_xml_writer->xmlElement(
"mattext", NULL, $intlink);
139 $a_xml_writer->xmlEndTag(
"material");
143 $attrs = array(
"shuffle" => ($gap->getShuffle() ?
"Yes" :
"No"));
144 $a_xml_writer->xmlStartTag(
"render_choice", $attrs);
147 $shuffleState = $gap->getShuffle();
148 $gap->setShuffle(
false);
149 $items = $gap->getItems();
150 $gap->setShuffle($shuffleState);
151 foreach ($items as $answeritem)
154 "ident" => $answeritem->getOrder()
156 $a_xml_writer->xmlStartTag(
"response_label", $attrs);
157 $a_xml_writer->xmlStartTag(
"material");
158 $a_xml_writer->xmlElement(
"mattext", NULL, $answeritem->getAnswertext());
159 $a_xml_writer->xmlEndTag(
"material");
160 $a_xml_writer->xmlEndTag(
"response_label");
162 $a_xml_writer->xmlEndTag(
"render_choice");
163 $a_xml_writer->xmlEndTag(
"response_str");
169 "rcardinality" =>
"Single" 171 $a_xml_writer->xmlStartTag(
"response_str", $attrs);
172 $solution = $this->
object->getSuggestedSolution($i);
173 if (count($solution))
175 if (preg_match(
"/il_(\d*?)_(\w+)_(\d+)/", $solution[
"internal_link"], $matches))
178 "label" =>
"suggested_solution" 180 $a_xml_writer->xmlStartTag(
"material", $attrs);
181 $intlink =
"il_" . IL_INST_ID .
"_" . $matches[2] .
"_" . $matches[3];
182 if (strcmp($matches[1],
"") != 0)
184 $intlink = $solution[
"internal_link"];
186 $a_xml_writer->xmlElement(
"mattext", NULL, $intlink);
187 $a_xml_writer->xmlEndTag(
"material");
191 "fibtype" =>
"String",
193 "columns" => $gap->getMaxWidth(),
194 "maxchars" => $gap->getGapSize()
196 $a_xml_writer->xmlStartTag(
"render_fib", $attrs);
197 $a_xml_writer->xmlEndTag(
"render_fib");
198 $a_xml_writer->xmlEndTag(
"response_str");
204 "numtype" =>
"Decimal",
205 "rcardinality" =>
"Single" 207 $a_xml_writer->xmlStartTag(
"response_num", $attrs);
208 $solution = $this->
object->getSuggestedSolution($i);
209 if (count($solution))
211 if (preg_match(
"/il_(\d*?)_(\w+)_(\d+)/", $solution[
"internal_link"], $matches))
214 "label" =>
"suggested_solution" 216 $a_xml_writer->xmlStartTag(
"material", $attrs);
217 $intlink =
"il_" . IL_INST_ID .
"_" . $matches[2] .
"_" . $matches[3];
218 if (strcmp($matches[1],
"") != 0)
220 $intlink = $solution[
"internal_link"];
222 $a_xml_writer->xmlElement(
"mattext", NULL, $intlink);
223 $a_xml_writer->xmlEndTag(
"material");
226 $answeritem = $gap->getItem(0);
228 "fibtype" =>
"Decimal",
230 "columns" => $gap->getMaxWidth(),
231 "maxchars" => $gap->getGapSize()
233 if (is_object($answeritem))
235 if ($eval->e($answeritem->getLowerBound()) !== FALSE)
237 $attrs[
"minnumber"] = $answeritem->getLowerBound();
239 if ($eval->e($answeritem->getUpperBound()) !== FALSE)
241 $attrs[
"maxnumber"] = $answeritem->getUpperBound();
244 $a_xml_writer->xmlStartTag(
"render_fib", $attrs);
245 $a_xml_writer->xmlEndTag(
"render_fib");
246 $a_xml_writer->xmlEndTag(
"response_num");
251 $a_xml_writer->xmlEndTag(
"flow");
252 $a_xml_writer->xmlEndTag(
"presentation");
255 $a_xml_writer->xmlStartTag(
"resprocessing");
256 $a_xml_writer->xmlStartTag(
"outcomes");
257 $a_xml_writer->xmlStartTag(
"decvar");
258 $a_xml_writer->xmlEndTag(
"decvar");
259 $a_xml_writer->xmlEndTag(
"outcomes");
262 for ($i = 0; $i < $this->
object->getGapCount(); $i++)
264 $gap = $this->
object->getGap($i);
265 switch ($gap->getType())
268 $shuffleState = $gap->getShuffle();
269 $gap->setShuffle(
false);
270 $items = $gap->getItems();
271 $gap->setShuffle($shuffleState);
272 foreach ($items as $answer)
277 $a_xml_writer->xmlStartTag(
"respcondition", $attrs);
279 $a_xml_writer->xmlStartTag(
"conditionvar");
282 "respident" =>
"gap_$i" 284 $a_xml_writer->xmlElement(
"varequal", $attrs, $answer->getAnswertext());
285 $a_xml_writer->xmlEndTag(
"conditionvar");
290 $a_xml_writer->xmlElement(
"setvar", $attrs, $answer->getPoints());
293 $linkrefid =
"$i" .
"_Response_" . $answer->getOrder();
295 "feedbacktype" =>
"Response",
296 "linkrefid" => $linkrefid
298 $a_xml_writer->xmlElement(
"displayfeedback", $attrs);
299 $a_xml_writer->xmlEndTag(
"respcondition");
303 foreach ($gap->getItems() as $answer)
308 $a_xml_writer->xmlStartTag(
"respcondition", $attrs);
310 $a_xml_writer->xmlStartTag(
"conditionvar");
312 "respident" =>
"gap_$i" 314 $a_xml_writer->xmlElement(
"varequal", $attrs, $answer->getAnswertext());
315 $a_xml_writer->xmlEndTag(
"conditionvar");
320 $a_xml_writer->xmlElement(
"setvar", $attrs, $answer->getPoints());
322 $linkrefid =
"$i" .
"_Response_" . $answer->getOrder();
324 "feedbacktype" =>
"Response",
325 "linkrefid" => $linkrefid
327 $a_xml_writer->xmlElement(
"displayfeedback", $attrs);
328 $a_xml_writer->xmlEndTag(
"respcondition");
332 foreach ($gap->getItems() as $answer)
337 $a_xml_writer->xmlStartTag(
"respcondition", $attrs);
339 $a_xml_writer->xmlStartTag(
"conditionvar");
341 "respident" =>
"gap_$i" 343 $a_xml_writer->xmlElement(
"varequal", $attrs, $answer->getAnswertext());
344 $a_xml_writer->xmlEndTag(
"conditionvar");
349 $a_xml_writer->xmlElement(
"setvar", $attrs, $answer->getPoints());
351 $linkrefid =
"$i" .
"_Response_" . $answer->getOrder();
353 "feedbacktype" =>
"Response",
354 "linkrefid" => $linkrefid
356 $a_xml_writer->xmlElement(
"displayfeedback", $attrs);
357 $a_xml_writer->xmlEndTag(
"respcondition");
363 $feedback_allcorrect = $this->
object->feedbackOBJ->getGenericFeedbackExportPresentation(
364 $this->object->getId(), true
366 if (strlen($feedback_allcorrect))
371 $a_xml_writer->xmlStartTag(
"respcondition", $attrs);
373 $a_xml_writer->xmlStartTag(
"conditionvar");
375 for ($i = 0; $i < $this->
object->getGapCount(); $i++)
377 $gap = $this->
object->getGap($i);
378 $indexes = $gap->getBestSolutionIndexes();
381 $a_xml_writer->xmlStartTag(
"and");
383 switch ($gap->getType())
387 foreach ($indexes as $key)
391 $a_xml_writer->xmlStartTag(
"or");
394 "respident" =>
"gap_$i" 396 $answer = $gap->getItem($key);
397 $a_xml_writer->xmlElement(
"varequal", $attrs, $answer->getAnswertext());
400 $a_xml_writer->xmlEndTag(
"or");
407 foreach ($indexes as $key)
411 $a_xml_writer->xmlStartTag(
"or");
414 "respident" =>
"gap_$i" 416 $answer = $gap->getItem($key);
417 $a_xml_writer->xmlElement(
"varequal", $attrs, $answer->getAnswertext());
420 $a_xml_writer->xmlEndTag(
"or");
427 foreach ($indexes as $key)
431 $a_xml_writer->xmlStartTag(
"or");
434 "respident" =>
"gap_$i" 436 $answer = $gap->getItem($key);
437 $a_xml_writer->xmlElement(
"varequal", $attrs, $answer->getAnswertext());
440 $a_xml_writer->xmlEndTag(
"or");
448 $a_xml_writer->xmlEndTag(
"and");
451 $a_xml_writer->xmlEndTag(
"conditionvar");
454 "feedbacktype" =>
"Response",
455 "linkrefid" =>
"response_allcorrect" 457 $a_xml_writer->xmlElement(
"displayfeedback", $attrs);
458 $a_xml_writer->xmlEndTag(
"respcondition");
460 $feedback_onenotcorrect = $this->
object->feedbackOBJ->getGenericFeedbackExportPresentation(
461 $this->object->getId(), false
463 if (strlen($feedback_onenotcorrect))
468 $a_xml_writer->xmlStartTag(
"respcondition", $attrs);
470 $a_xml_writer->xmlStartTag(
"conditionvar");
472 $a_xml_writer->xmlStartTag(
"not");
473 for ($i = 0; $i < $this->
object->getGapCount(); $i++)
475 $gap = $this->
object->getGap($i);
476 $indexes = $gap->getBestSolutionIndexes();
479 $a_xml_writer->xmlStartTag(
"and");
481 switch ($gap->getType())
485 foreach ($indexes as $key)
489 $a_xml_writer->xmlStartTag(
"or");
492 "respident" =>
"gap_$i" 494 $answer = $gap->getItem($key);
495 $a_xml_writer->xmlElement(
"varequal", $attrs, $answer->getAnswertext());
498 $a_xml_writer->xmlEndTag(
"or");
505 foreach ($indexes as $key)
509 $a_xml_writer->xmlStartTag(
"or");
512 "respident" =>
"gap_$i" 514 $answer = $gap->getItem($key);
515 $a_xml_writer->xmlElement(
"varequal", $attrs, $answer->getAnswertext());
518 $a_xml_writer->xmlEndTag(
"or");
525 foreach ($indexes as $key)
529 $a_xml_writer->xmlStartTag(
"or");
532 "respident" =>
"gap_$i" 534 $answer = $gap->getItem($key);
535 $a_xml_writer->xmlElement(
"varequal", $attrs, $answer->getAnswertext());
538 $a_xml_writer->xmlEndTag(
"or");
546 $a_xml_writer->xmlEndTag(
"and");
549 $a_xml_writer->xmlEndTag(
"not");
550 $a_xml_writer->xmlEndTag(
"conditionvar");
553 "feedbacktype" =>
"Response",
554 "linkrefid" =>
"response_onenotcorrect" 556 $a_xml_writer->xmlElement(
"displayfeedback", $attrs);
557 $a_xml_writer->xmlEndTag(
"respcondition");
560 $a_xml_writer->xmlEndTag(
"resprocessing");
563 for ($i = 0; $i < $this->
object->getGapCount(); $i++)
565 $gap = $this->
object->getGap($i);
566 switch ($gap->getType())
600 $a_xml_writer->xmlStartTag(
"itemfeedback", $attrs);
602 $a_xml_writer->xmlStartTag(
"flow_mat");
606 $fb = $this->
object->feedbackOBJ->getSpecificAnswerFeedbackExportPresentation(
607 $this->object->getId(), $i
609 $this->
object->addQTIMaterial($a_xml_writer, $fb);
610 $a_xml_writer->xmlEndTag(
"flow_mat");
611 $a_xml_writer->xmlEndTag(
"itemfeedback");
614 if (strlen($feedback_allcorrect))
617 "ident" =>
"response_allcorrect",
620 $a_xml_writer->xmlStartTag(
"itemfeedback", $attrs);
622 $a_xml_writer->xmlStartTag(
"flow_mat");
623 $this->
object->addQTIMaterial($a_xml_writer, $feedback_allcorrect);
624 $a_xml_writer->xmlEndTag(
"flow_mat");
625 $a_xml_writer->xmlEndTag(
"itemfeedback");
627 if (strlen($feedback_onenotcorrect))
630 "ident" =>
"response_onenotcorrect",
633 $a_xml_writer->xmlStartTag(
"itemfeedback", $attrs);
635 $a_xml_writer->xmlStartTag(
"flow_mat");
636 $this->
object->addQTIMaterial($a_xml_writer, $feedback_onenotcorrect);
637 $a_xml_writer->xmlEndTag(
"flow_mat");
638 $a_xml_writer->xmlEndTag(
"itemfeedback");
641 $a_xml_writer->xmlEndTag(
"item");
642 $a_xml_writer->xmlEndTag(
"questestinterop");
644 $xml = $a_xml_writer->xmlDumpMem(FALSE);
645 if (!$a_include_header)
647 $pos = strpos($xml,
"?>");
648 $xml = substr($xml, $pos + 2);
const CLOZE_TEXT
Cloze question constants.
Class for question exports.
addGeneralMetadata(ilXmlWriter $xmlwriter)
Class for cloze question exports.
xmlHeader()
Writes xml header public.
addAdditionalContentEditingModeInformation(ilXmlWriter $a_xml_writer)
adds a qti meta data field for ilias specific information of "additional content editing mode" (xml w...
toXML($a_include_header=true, $a_include_binary=true, $a_shuffle=false, $test_output=false, $force_image_references=false)
Returns a QTI xml representation of the question.
const CLOZE_TEST_IDENTIFIER
Question identifier constants.