41 $this->randomGroup = $DIC->refinery()->random();
49 public function toXML($a_include_header =
true, $a_include_binary =
true, $a_shuffle =
false, $test_output =
false, $force_image_references =
false): string
52 $ilias = $DIC[
'ilias'];
55 $eval->suppress_errors =
true;
59 $a_xml_writer->xmlHeader();
60 $a_xml_writer->xmlStartTag(
"questestinterop");
62 "ident" =>
"il_" .
IL_INST_ID .
"_qst_" . $this->
object->getId(),
63 "title" => $this->
object->getTitle(),
64 "maxattempts" => $this->
object->getNrOfTries()
66 $a_xml_writer->xmlStartTag(
"item", $attrs);
68 $a_xml_writer->xmlElement(
"qticomment",
null, $this->
object->getComment());
69 $a_xml_writer->xmlStartTag(
"itemmetadata");
70 $a_xml_writer->xmlStartTag(
"qtimetadata");
71 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
72 $a_xml_writer->xmlElement(
"fieldlabel",
null,
"ILIAS_VERSION");
73 $a_xml_writer->xmlElement(
"fieldentry",
null, $ilias->getSetting(
"ilias_version"));
74 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
75 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
76 $a_xml_writer->xmlElement(
"fieldlabel",
null,
"QUESTIONTYPE");
77 $a_xml_writer->xmlElement(
"fieldentry",
null, $this->
object->getQuestionType());
78 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
79 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
80 $a_xml_writer->xmlElement(
"fieldlabel",
null,
"AUTHOR");
81 $a_xml_writer->xmlElement(
"fieldentry",
null, $this->
object->getAuthor());
82 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
88 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
89 $a_xml_writer->xmlElement(
"fieldlabel",
null,
"textgaprating");
90 $a_xml_writer->xmlElement(
"fieldentry",
null, $this->
object->getTextgapRating());
91 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
93 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
94 $a_xml_writer->xmlElement(
"fieldlabel",
null,
"fixedTextLength");
95 $a_xml_writer->xmlElement(
"fieldentry",
null, $this->
object->getFixedTextLength());
96 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
98 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
99 $a_xml_writer->xmlElement(
"fieldlabel",
null,
"identicalScoring");
100 $a_xml_writer->xmlElement(
"fieldentry",
null, $this->
object->getIdenticalScoring());
101 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
103 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
104 $a_xml_writer->xmlElement(
"fieldlabel",
null,
"feedback_mode");
105 $a_xml_writer->xmlElement(
"fieldentry",
null, $this->
object->getFeedbackMode());
106 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
108 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
109 $a_xml_writer->xmlElement(
"fieldlabel",
null,
"combinations");
110 $a_xml_writer->xmlElement(
"fieldentry",
null, base64_encode(json_encode($this->
object->getGapCombinations())));
111 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
113 $a_xml_writer->xmlEndTag(
"qtimetadata");
114 $a_xml_writer->xmlEndTag(
"itemmetadata");
118 "label" => $this->
object->getTitle()
120 $a_xml_writer->xmlStartTag(
"presentation", $attrs);
122 $a_xml_writer->xmlStartTag(
"flow");
124 $questionText = $this->
object->getQuestion() ? $this->
object->getQuestion() :
' ';
127 $text_parts = preg_split(
"/\[gap.*?\[\/gap\]/", $this->
object->getClozeText());
130 for ($i = 0; $i <= $this->
object->getGapCount(); $i++) {
133 if ($i < $this->
object->getGapCount()) {
135 $gap = $this->
object->getGap($i);
136 switch ($gap->getType()) {
141 "rcardinality" =>
"Single" 143 $a_xml_writer->xmlStartTag(
"response_str", $attrs);
148 $attrs = [
"shuffle" => ($gap->getShuffle() ?
"Yes" :
"No")];
149 $a_xml_writer->xmlStartTag(
"render_choice", $attrs);
152 foreach ($gap->getItems($this->randomGroup->dontShuffle()) 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);
176 "fibtype" =>
"String",
178 "columns" => $gap->getMaxWidth(),
179 "maxchars" => $gap->getGapSize()
181 $a_xml_writer->xmlStartTag(
"render_fib", $attrs);
182 $a_xml_writer->xmlEndTag(
"render_fib");
183 $a_xml_writer->xmlEndTag(
"response_str");
189 "numtype" =>
"Decimal",
190 "rcardinality" =>
"Single" 192 $a_xml_writer->xmlStartTag(
"response_num", $attrs);
196 $answeritem = $gap->getItem(0);
198 "fibtype" =>
"Decimal",
200 "columns" => $gap->getMaxWidth(),
201 "maxchars" => $gap->getGapSize()
203 if (is_object($answeritem)) {
204 if ($eval->e($answeritem->getLowerBound()) !==
false) {
205 $attrs[
"minnumber"] = $answeritem->getLowerBound();
207 if ($eval->e($answeritem->getUpperBound()) !==
false) {
208 $attrs[
"maxnumber"] = $answeritem->getUpperBound();
211 $a_xml_writer->xmlStartTag(
"render_fib", $attrs);
212 $a_xml_writer->xmlEndTag(
"render_fib");
213 $a_xml_writer->xmlEndTag(
"response_num");
218 $a_xml_writer->xmlEndTag(
"flow");
219 $a_xml_writer->xmlEndTag(
"presentation");
222 $a_xml_writer->xmlStartTag(
"resprocessing");
223 $a_xml_writer->xmlStartTag(
"outcomes");
224 $a_xml_writer->xmlStartTag(
"decvar");
225 $a_xml_writer->xmlEndTag(
"decvar");
226 $a_xml_writer->xmlEndTag(
"outcomes");
229 for ($i = 0; $i < $this->
object->getGapCount(); $i++) {
230 $gap = $this->
object->getGap($i);
231 switch ($gap->getType()) {
233 foreach ($gap->getItems($this->randomGroup->dontShuffle()) as $answer) {
237 $a_xml_writer->xmlStartTag(
"respcondition", $attrs);
239 $a_xml_writer->xmlStartTag(
"conditionvar");
242 "respident" =>
"gap_$i" 244 $a_xml_writer->xmlElement(
"varequal", $attrs, $answer->getAnswertext());
245 $a_xml_writer->xmlEndTag(
"conditionvar");
250 $a_xml_writer->xmlElement(
"setvar", $attrs, $answer->getPoints());
252 $linkrefid =
"$i" .
"_Response_" . $answer->getOrder();
254 "feedbacktype" =>
"Response",
255 "linkrefid" => $linkrefid
257 $a_xml_writer->xmlElement(
"displayfeedback", $attrs);
258 $a_xml_writer->xmlEndTag(
"respcondition");
263 foreach ($gap->getItems($this->randomGroup->dontShuffle()) as $answer) {
267 $a_xml_writer->xmlStartTag(
"respcondition", $attrs);
269 $a_xml_writer->xmlStartTag(
"conditionvar");
271 "respident" =>
"gap_$i" 273 $a_xml_writer->xmlElement(
"varequal", $attrs, $answer->getAnswertext());
274 $a_xml_writer->xmlEndTag(
"conditionvar");
279 $a_xml_writer->xmlElement(
"setvar", $attrs, $answer->getPoints());
281 $linkrefid =
"$i" .
"_Response_" . $answer->getOrder();
283 "feedbacktype" =>
"Response",
284 "linkrefid" => $linkrefid
286 $a_xml_writer->xmlElement(
"displayfeedback", $attrs);
287 $a_xml_writer->xmlEndTag(
"respcondition");
293 $feedback_allcorrect = $this->
object->feedbackOBJ->getGenericFeedbackExportPresentation(
297 if (strlen($feedback_allcorrect)) {
301 $a_xml_writer->xmlStartTag(
"respcondition", $attrs);
303 $a_xml_writer->xmlStartTag(
"conditionvar");
305 for ($i = 0; $i < $this->
object->getGapCount(); $i++) {
306 $gap = $this->
object->getGap($i);
307 $indexes = $gap->getBestSolutionIndexes();
309 $a_xml_writer->xmlStartTag(
"and");
311 switch ($gap->getType()) {
316 foreach ($indexes as $key) {
318 $a_xml_writer->xmlStartTag(
"or");
321 "respident" =>
"gap_$i" 323 $answer = $gap->getItem($key);
324 $a_xml_writer->xmlElement(
"varequal", $attrs, $answer->getAnswertext());
326 $a_xml_writer->xmlEndTag(
"or");
333 $a_xml_writer->xmlEndTag(
"and");
336 $a_xml_writer->xmlEndTag(
"conditionvar");
339 "feedbacktype" =>
"Response",
340 "linkrefid" =>
"response_allcorrect" 342 $a_xml_writer->xmlElement(
"displayfeedback", $attrs);
343 $a_xml_writer->xmlEndTag(
"respcondition");
345 $feedback_onenotcorrect = $this->
object->feedbackOBJ->getGenericFeedbackExportPresentation(
349 if (strlen($feedback_onenotcorrect)) {
353 $a_xml_writer->xmlStartTag(
"respcondition", $attrs);
355 $a_xml_writer->xmlStartTag(
"conditionvar");
357 $a_xml_writer->xmlStartTag(
"not");
358 for ($i = 0; $i < $this->
object->getGapCount(); $i++) {
359 $gap = $this->
object->getGap($i);
360 $indexes = $gap->getBestSolutionIndexes();
362 $a_xml_writer->xmlStartTag(
"and");
364 switch ($gap->getType()) {
369 foreach ($indexes as $key) {
371 $a_xml_writer->xmlStartTag(
"or");
374 "respident" =>
"gap_$i" 376 $answer = $gap->getItem($key);
377 $a_xml_writer->xmlElement(
"varequal", $attrs, $answer->getAnswertext());
379 $a_xml_writer->xmlEndTag(
"or");
386 $a_xml_writer->xmlEndTag(
"and");
389 $a_xml_writer->xmlEndTag(
"not");
390 $a_xml_writer->xmlEndTag(
"conditionvar");
393 "feedbacktype" =>
"Response",
394 "linkrefid" =>
"response_onenotcorrect" 396 $a_xml_writer->xmlElement(
"displayfeedback", $attrs);
397 $a_xml_writer->xmlEndTag(
"respcondition");
400 $a_xml_writer->xmlEndTag(
"resprocessing");
403 for ($i = 0; $i < $this->
object->getGapCount(); $i++) {
404 $gap = $this->
object->getGap($i);
405 switch ($gap->getType()) {
414 if (strlen($feedback_allcorrect)) {
416 "ident" =>
"response_allcorrect",
419 $a_xml_writer->xmlStartTag(
"itemfeedback", $attrs);
421 $a_xml_writer->xmlStartTag(
"flow_mat");
423 $a_xml_writer->xmlEndTag(
"flow_mat");
424 $a_xml_writer->xmlEndTag(
"itemfeedback");
426 if (strlen($feedback_onenotcorrect)) {
428 "ident" =>
"response_onenotcorrect",
431 $a_xml_writer->xmlStartTag(
"itemfeedback", $attrs);
433 $a_xml_writer->xmlStartTag(
"flow_mat");
435 $a_xml_writer->xmlEndTag(
"flow_mat");
436 $a_xml_writer->xmlEndTag(
"itemfeedback");
439 $a_xml_writer->xmlEndTag(
"item");
440 $a_xml_writer->xmlEndTag(
"questestinterop");
442 $xml = $a_xml_writer->xmlDumpMem(
false);
443 if (!$a_include_header) {
444 $pos = strpos($xml,
"?>");
445 $xml = substr($xml, $pos + 2);
456 $feedbackIdentifierList->load($this->
object->getId());
458 foreach ($feedbackIdentifierList as $fbIdentifier) {
459 $feedback = $this->
object->feedbackOBJ->getSpecificAnswerFeedbackExportPresentation(
461 $fbIdentifier->getQuestionIndex(),
462 $fbIdentifier->getAnswerIndex()
483 return "{$fbIdentifier->getQuestionIndex()}_{$fbIdentifier->getAnswerIndex()}";
addQTIMaterial(ilXmlWriter $a_xml_writer, string $a_material, bool $close_material_tag=true, bool $add_mobs=true)
buildQtiExportIdent(ilAssSpecificFeedbackIdentifier $fbIdentifier)
Class for question exports.
addGeneralMetadata(ilXmlWriter $xmlwriter)
xmlEndTag(string $tag)
Writes an endtag.
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
exportAnswerSpecificFeedbacks(ilXmlWriter $xmlWriter)
Class for cloze question exports.
addAdditionalContentEditingModeInformation(ilXmlWriter $a_xml_writer)
adds a qti meta data field for ilias specific information of "additional content editing mode" (xml w...
addSuggestedSolution(ilXmlWriter $writer)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
__construct(Container $dic, ilPlugin $plugin)
xmlStartTag(string $tag, ?array $attrs=null, bool $empty=false, bool $encode=true, bool $escape=true)
Writes a starttag.
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 Returns a QTI xml representation of the question and...