Returns a QTI xml representation of the question Returns a QTI xml representation of the question and sets the internal domxml variable with the DOM XML representation of the QTI xml representation.
51 : string
52 {
54 $ilias =
$DIC[
'ilias'];
55
57 $eval->suppress_errors = true;
58
60
61 $a_xml_writer->xmlHeader();
62 $a_xml_writer->xmlStartTag("questestinterop");
63 $attrs = [
64 "ident" =>
"il_" .
IL_INST_ID .
"_qst_" . $this->
object->getId(),
65 "title" => $this->object->getTitle(),
66 "maxattempts" => $this->object->getNrOfTries()
67 ];
68 $a_xml_writer->xmlStartTag("item", $attrs);
69
70 $a_xml_writer->xmlElement(
"qticomment",
null, $this->
object->getComment());
71 $a_xml_writer->xmlStartTag("itemmetadata");
72 $a_xml_writer->xmlStartTag("qtimetadata");
73 $a_xml_writer->xmlStartTag("qtimetadatafield");
74 $a_xml_writer->xmlElement("fieldlabel", null, "ILIAS_VERSION");
75 $a_xml_writer->xmlElement("fieldentry", null, $ilias->getSetting("ilias_version"));
76 $a_xml_writer->xmlEndTag("qtimetadatafield");
77 $a_xml_writer->xmlStartTag("qtimetadatafield");
78 $a_xml_writer->xmlElement("fieldlabel", null, "QUESTIONTYPE");
79 $a_xml_writer->xmlElement(
"fieldentry",
null, $this->
object->getQuestionType());
80 $a_xml_writer->xmlEndTag("qtimetadatafield");
81 $a_xml_writer->xmlStartTag("qtimetadatafield");
82 $a_xml_writer->xmlElement("fieldlabel", null, "AUTHOR");
83 $a_xml_writer->xmlElement(
"fieldentry",
null, $this->
object->getAuthor());
84 $a_xml_writer->xmlEndTag("qtimetadatafield");
85
86
89
90 $a_xml_writer->xmlStartTag("qtimetadatafield");
91 $a_xml_writer->xmlElement("fieldlabel", null, "textgaprating");
92 $a_xml_writer->xmlElement(
"fieldentry",
null, $this->
object->getTextgapRating());
93 $a_xml_writer->xmlEndTag("qtimetadatafield");
94
95 $a_xml_writer->xmlStartTag("qtimetadatafield");
96 $a_xml_writer->xmlElement("fieldlabel", null, "fixedTextLength");
97 $a_xml_writer->xmlElement(
"fieldentry",
null, $this->
object->getFixedTextLength());
98 $a_xml_writer->xmlEndTag("qtimetadatafield");
99
100 $a_xml_writer->xmlStartTag("qtimetadatafield");
101 $a_xml_writer->xmlElement("fieldlabel", null, "identicalScoring");
102 $a_xml_writer->xmlElement(
"fieldentry",
null, $this->
object->getIdenticalScoring());
103 $a_xml_writer->xmlEndTag("qtimetadatafield");
104
105 $a_xml_writer->xmlStartTag("qtimetadatafield");
106 $a_xml_writer->xmlElement("fieldlabel", null, "feedback_mode");
107 $a_xml_writer->xmlElement(
"fieldentry",
null, $this->
object->getFeedbackMode());
108 $a_xml_writer->xmlEndTag("qtimetadatafield");
109
110 $a_xml_writer->xmlStartTag("qtimetadatafield");
111 $a_xml_writer->xmlElement("fieldlabel", null, "combinations");
112 $a_xml_writer->xmlElement(
"fieldentry",
null, base64_encode(json_encode($this->
object->getGapCombinations())));
113 $a_xml_writer->xmlEndTag("qtimetadatafield");
114
115 $a_xml_writer->xmlEndTag("qtimetadata");
116 $a_xml_writer->xmlEndTag("itemmetadata");
117
118
119 $attrs = [
120 "label" => $this->object->getTitle()
121 ];
122 $a_xml_writer->xmlStartTag("presentation", $attrs);
123
124 $a_xml_writer->xmlStartTag("flow");
125
126 $questionText = $this->object->getQuestion() ? $this->object->getQuestion() : ' ';
128
129 $text_parts = preg_split(
"/\[gap.*?\[\/gap\]/", $this->
object->getClozeText());
130
131
132 for ($i = 0; $i <= $this->object->getGapCount(); $i++) {
134
135 if ($i < $this->
object->getGapCount()) {
136
137 $gap = $this->object->getGap($i);
138 switch ($gap->getType()) {
140
141 $attrs = [
142 "ident" => "gap_$i",
143 "rcardinality" => "Single"
144 ];
145 $a_xml_writer->xmlStartTag("response_str", $attrs);
146 if ($i === 0) {
148 }
149
150 $attrs = ["shuffle" => ($gap->getShuffle() ? "Yes" : "No")];
151 $a_xml_writer->xmlStartTag("render_choice", $attrs);
152
153
154 foreach ($gap->getItems($this->randomGroup->dontShuffle()) as $answeritem) {
155 $attrs = [
156 "ident" => $answeritem->getOrder()
157 ];
158 $a_xml_writer->xmlStartTag("response_label", $attrs);
159 $a_xml_writer->xmlStartTag("material");
160 $a_xml_writer->xmlElement("mattext", null, $answeritem->getAnswertext());
161 $a_xml_writer->xmlEndTag("material");
162 $a_xml_writer->xmlEndTag("response_label");
163 }
164 $a_xml_writer->xmlEndTag("render_choice");
165 $a_xml_writer->xmlEndTag("response_str");
166 break;
168
169 $attrs = [
170 "ident" => "gap_$i",
171 "rcardinality" => "Single"
172 ];
173 $a_xml_writer->xmlStartTag("response_str", $attrs);
174 if ($i === 0) {
176 }
177 $attrs = [
178 "fibtype" => "String",
179 "prompt" => "Box",
180 "columns" => $gap->getMaxWidth(),
181 "maxchars" => $gap->getGapSize()
182 ];
183 $a_xml_writer->xmlStartTag("render_fib", $attrs);
184 $a_xml_writer->xmlEndTag("render_fib");
185 $a_xml_writer->xmlEndTag("response_str");
186 break;
188
189 $attrs = [
190 "ident" => "gap_$i",
191 "numtype" => "Decimal",
192 "rcardinality" => "Single"
193 ];
194 $a_xml_writer->xmlStartTag("response_num", $attrs);
195 if ($i === 0) {
197 }
198 $answeritem = $gap->getItem(0);
199 $attrs = [
200 "fibtype" => "Decimal",
201 "prompt" => "Box",
202 "columns" => $gap->getMaxWidth(),
203 "maxchars" => $gap->getGapSize()
204 ];
205 if (is_object($answeritem)) {
206 if ($eval->e($answeritem->getLowerBound()) !== false) {
207 $attrs["minnumber"] = $answeritem->getLowerBound();
208 }
209 if ($eval->e($answeritem->getUpperBound()) !== false) {
210 $attrs["maxnumber"] = $answeritem->getUpperBound();
211 }
212 }
213 $a_xml_writer->xmlStartTag("render_fib", $attrs);
214 $a_xml_writer->xmlEndTag("render_fib");
215 $a_xml_writer->xmlEndTag("response_num");
216 break;
217 }
218 }
219 }
220 $a_xml_writer->xmlEndTag("flow");
221 $a_xml_writer->xmlEndTag("presentation");
222
223
224 $a_xml_writer->xmlStartTag("resprocessing");
225 $a_xml_writer->xmlStartTag("outcomes");
226 $a_xml_writer->xmlStartTag("decvar");
227 $a_xml_writer->xmlEndTag("decvar");
228 $a_xml_writer->xmlEndTag("outcomes");
229
230
231 for ($i = 0; $i < $this->object->getGapCount(); $i++) {
232 $gap = $this->object->getGap($i);
233 switch ($gap->getType()) {
235 foreach ($gap->getItems($this->randomGroup->dontShuffle()) as $answer) {
236 $attrs = [
237 "continue" => "Yes"
238 ];
239 $a_xml_writer->xmlStartTag("respcondition", $attrs);
240
241 $a_xml_writer->xmlStartTag("conditionvar");
242
243 $attrs = [
244 "respident" => "gap_$i"
245 ];
246 $a_xml_writer->xmlElement("varequal", $attrs, $answer->getAnswertext());
247 $a_xml_writer->xmlEndTag("conditionvar");
248
249 $attrs = [
250 "action" => "Add"
251 ];
252 $a_xml_writer->xmlElement("setvar", $attrs, $answer->getPoints());
253
254 $linkrefid = "$i" . "_Response_" . $answer->getOrder();
255 $attrs = [
256 "feedbacktype" => "Response",
257 "linkrefid" => $linkrefid
258 ];
259 $a_xml_writer->xmlElement("displayfeedback", $attrs);
260 $a_xml_writer->xmlEndTag("respcondition");
261 }
262 break;
265 foreach ($gap->getItems($this->randomGroup->dontShuffle()) as $answer) {
266 $attrs = [
267 "continue" => "Yes"
268 ];
269 $a_xml_writer->xmlStartTag("respcondition", $attrs);
270
271 $a_xml_writer->xmlStartTag("conditionvar");
272 $attrs = [
273 "respident" => "gap_$i"
274 ];
275 $a_xml_writer->xmlElement("varequal", $attrs, $answer->getAnswertext());
276 $a_xml_writer->xmlEndTag("conditionvar");
277
278 $attrs = [
279 "action" => "Add"
280 ];
281 $a_xml_writer->xmlElement("setvar", $attrs, $answer->getPoints());
282
283 $linkrefid = "$i" . "_Response_" . $answer->getOrder();
284 $attrs = [
285 "feedbacktype" => "Response",
286 "linkrefid" => $linkrefid
287 ];
288 $a_xml_writer->xmlElement("displayfeedback", $attrs);
289 $a_xml_writer->xmlEndTag("respcondition");
290 }
291 break;
292 }
293 }
294
295 $feedback_allcorrect = $this->object->feedbackOBJ->getGenericFeedbackExportPresentation(
297 true
298 );
299 if (strlen($feedback_allcorrect)) {
300 $attrs = [
301 "continue" => "Yes"
302 ];
303 $a_xml_writer->xmlStartTag("respcondition", $attrs);
304
305 $a_xml_writer->xmlStartTag("conditionvar");
306
307 for ($i = 0; $i < $this->object->getGapCount(); $i++) {
308 $gap = $this->object->getGap($i);
309 $indexes = $gap->getBestSolutionIndexes();
310 if ($i > 0) {
311 $a_xml_writer->xmlStartTag("and");
312 }
313 switch ($gap->getType()) {
317 $k = 0;
318 foreach ($indexes as $key) {
319 if ($k > 0) {
320 $a_xml_writer->xmlStartTag("or");
321 }
322 $attrs = [
323 "respident" => "gap_$i"
324 ];
325 $answer = $gap->getItem($key);
326 $a_xml_writer->xmlElement("varequal", $attrs, $answer->getAnswertext());
327 if ($k > 0) {
328 $a_xml_writer->xmlEndTag("or");
329 }
330 $k++;
331 }
332 break;
333 }
334 if ($i > 0) {
335 $a_xml_writer->xmlEndTag("and");
336 }
337 }
338 $a_xml_writer->xmlEndTag("conditionvar");
339
340 $attrs = [
341 "feedbacktype" => "Response",
342 "linkrefid" => "response_allcorrect"
343 ];
344 $a_xml_writer->xmlElement("displayfeedback", $attrs);
345 $a_xml_writer->xmlEndTag("respcondition");
346 }
347 $feedback_onenotcorrect = $this->object->feedbackOBJ->getGenericFeedbackExportPresentation(
349 false
350 );
351 if (strlen($feedback_onenotcorrect)) {
352 $attrs = [
353 "continue" => "Yes"
354 ];
355 $a_xml_writer->xmlStartTag("respcondition", $attrs);
356
357 $a_xml_writer->xmlStartTag("conditionvar");
358
359 $a_xml_writer->xmlStartTag("not");
360 for ($i = 0; $i < $this->object->getGapCount(); $i++) {
361 $gap = $this->object->getGap($i);
362 $indexes = $gap->getBestSolutionIndexes();
363 if ($i > 0) {
364 $a_xml_writer->xmlStartTag("and");
365 }
366 switch ($gap->getType()) {
370 $k = 0;
371 foreach ($indexes as $key) {
372 if ($k > 0) {
373 $a_xml_writer->xmlStartTag("or");
374 }
375 $attrs = [
376 "respident" => "gap_$i"
377 ];
378 $answer = $gap->getItem($key);
379 $a_xml_writer->xmlElement("varequal", $attrs, $answer->getAnswertext());
380 if ($k > 0) {
381 $a_xml_writer->xmlEndTag("or");
382 }
383 $k++;
384 }
385 break;
386 }
387 if ($i > 0) {
388 $a_xml_writer->xmlEndTag("and");
389 }
390 }
391 $a_xml_writer->xmlEndTag("not");
392 $a_xml_writer->xmlEndTag("conditionvar");
393
394 $attrs = [
395 "feedbacktype" => "Response",
396 "linkrefid" => "response_onenotcorrect"
397 ];
398 $a_xml_writer->xmlElement("displayfeedback", $attrs);
399 $a_xml_writer->xmlEndTag("respcondition");
400 }
401
402 $a_xml_writer->xmlEndTag("resprocessing");
403
404
405 for ($i = 0; $i < $this->object->getGapCount(); $i++) {
406 $gap = $this->object->getGap($i);
407 switch ($gap->getType()) {
411 break;
412 }
413 }
415
416 if (strlen($feedback_allcorrect)) {
417 $attrs = [
418 "ident" => "response_allcorrect",
419 "view" => "All"
420 ];
421 $a_xml_writer->xmlStartTag("itemfeedback", $attrs);
422
423 $a_xml_writer->xmlStartTag("flow_mat");
425 $a_xml_writer->xmlEndTag("flow_mat");
426 $a_xml_writer->xmlEndTag("itemfeedback");
427 }
428 if (strlen($feedback_onenotcorrect)) {
429 $attrs = [
430 "ident" => "response_onenotcorrect",
431 "view" => "All"
432 ];
433 $a_xml_writer->xmlStartTag("itemfeedback", $attrs);
434
435 $a_xml_writer->xmlStartTag("flow_mat");
437 $a_xml_writer->xmlEndTag("flow_mat");
438 $a_xml_writer->xmlEndTag("itemfeedback");
439 }
440
441 $a_xml_writer->xmlEndTag("item");
442 $a_xml_writer->xmlEndTag("questestinterop");
443
444 $xml = $a_xml_writer->xmlDumpMem(false);
445 if (!$a_include_header) {
446 $pos = strpos($xml, "?>");
447 $xml = substr($xml, $pos + 2);
448 }
449 return $xml;
450 }
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
exportAnswerSpecificFeedbacks(ilXmlWriter $xmlWriter)
addGeneralMetadata(ilXmlWriter $xmlwriter)
addSuggestedSolution(ilXmlWriter $writer)
addAdditionalContentEditingModeInformation(ilXmlWriter $a_xml_writer)
adds a qti meta data field for ilias specific information of "additional content editing mode" (xml w...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...