ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
class.assClozeTestExport.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2013 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
4 include_once "./Modules/TestQuestionPool/classes/export/qti12/class.assQuestionExport.php";
5 
16 {
26  public function toXML($a_include_header = true, $a_include_binary = true, $a_shuffle = false, $test_output = false, $force_image_references = false)
27  {
28  global $DIC;
29  $ilias = $DIC['ilias'];
30 
31  include_once "./Services/Math/classes/class.EvalMath.php";
32  $eval = new EvalMath();
33  $eval->suppress_errors = true;
34  include_once("./Services/Xml/classes/class.ilXmlWriter.php");
35  $a_xml_writer = new ilXmlWriter;
36  // set xml header
37  $a_xml_writer->xmlHeader();
38  $a_xml_writer->xmlStartTag("questestinterop");
39  $attrs = array(
40  "ident" => "il_" . IL_INST_ID . "_qst_" . $this->object->getId(),
41  "title" => $this->object->getTitle(),
42  "maxattempts" => $this->object->getNrOfTries()
43  );
44  $a_xml_writer->xmlStartTag("item", $attrs);
45  // add question description
46  $a_xml_writer->xmlElement("qticomment", null, $this->object->getComment());
47  // add estimated working time
48  $workingtime = $this->object->getEstimatedWorkingTime();
49  $duration = sprintf("P0Y0M0DT%dH%dM%dS", $workingtime["h"], $workingtime["m"], $workingtime["s"]);
50  $a_xml_writer->xmlElement("duration", null, $duration);
51  // add ILIAS specific metadata
52  $a_xml_writer->xmlStartTag("itemmetadata");
53  $a_xml_writer->xmlStartTag("qtimetadata");
54  $a_xml_writer->xmlStartTag("qtimetadatafield");
55  $a_xml_writer->xmlElement("fieldlabel", null, "ILIAS_VERSION");
56  $a_xml_writer->xmlElement("fieldentry", null, $ilias->getSetting("ilias_version"));
57  $a_xml_writer->xmlEndTag("qtimetadatafield");
58  $a_xml_writer->xmlStartTag("qtimetadatafield");
59  $a_xml_writer->xmlElement("fieldlabel", null, "QUESTIONTYPE");
60  $a_xml_writer->xmlElement("fieldentry", null, CLOZE_TEST_IDENTIFIER);
61  $a_xml_writer->xmlEndTag("qtimetadatafield");
62  $a_xml_writer->xmlStartTag("qtimetadatafield");
63  $a_xml_writer->xmlElement("fieldlabel", null, "AUTHOR");
64  $a_xml_writer->xmlElement("fieldentry", null, $this->object->getAuthor());
65  $a_xml_writer->xmlEndTag("qtimetadatafield");
66 
67  // additional content editing information
68  $this->addAdditionalContentEditingModeInformation($a_xml_writer);
69  $this->addGeneralMetadata($a_xml_writer);
70 
71  $a_xml_writer->xmlStartTag("qtimetadatafield");
72  $a_xml_writer->xmlElement("fieldlabel", null, "textgaprating");
73  $a_xml_writer->xmlElement("fieldentry", null, $this->object->getTextgapRating());
74  $a_xml_writer->xmlEndTag("qtimetadatafield");
75 
76  $a_xml_writer->xmlStartTag("qtimetadatafield");
77  $a_xml_writer->xmlElement("fieldlabel", null, "fixedTextLength");
78  $a_xml_writer->xmlElement("fieldentry", null, $this->object->getFixedTextLength());
79  $a_xml_writer->xmlEndTag("qtimetadatafield");
80 
81  $a_xml_writer->xmlStartTag("qtimetadatafield");
82  $a_xml_writer->xmlElement("fieldlabel", null, "identicalScoring");
83  $a_xml_writer->xmlElement("fieldentry", null, $this->object->getIdenticalScoring());
84  $a_xml_writer->xmlEndTag("qtimetadatafield");
85 
86  $a_xml_writer->xmlStartTag("qtimetadatafield");
87  $a_xml_writer->xmlElement("fieldlabel", null, "feedback_mode");
88  $a_xml_writer->xmlElement("fieldentry", null, $this->object->getFeedbackMode());
89  $a_xml_writer->xmlEndTag("qtimetadatafield");
90 
91  $a_xml_writer->xmlStartTag("qtimetadatafield");
92  $a_xml_writer->xmlElement("fieldlabel", null, "combinations");
93  $a_xml_writer->xmlElement("fieldentry", null, base64_encode(json_encode($this->object->getGapCombinations())));
94  $a_xml_writer->xmlEndTag("qtimetadatafield");
95 
96  $a_xml_writer->xmlEndTag("qtimetadata");
97  $a_xml_writer->xmlEndTag("itemmetadata");
98 
99  // PART I: qti presentation
100  $attrs = array(
101  "label" => $this->object->getTitle()
102  );
103  $a_xml_writer->xmlStartTag("presentation", $attrs);
104  // add flow to presentation
105  $a_xml_writer->xmlStartTag("flow");
106 
107  $questionText = $this->object->getQuestion() ? $this->object->getQuestion() : '&nbsp;';
108  $this->object->addQTIMaterial($a_xml_writer, $questionText);
109 
110  $text_parts = preg_split("/\[gap.*?\[\/gap\]/", $this->object->getClozeText());
111 
112  // add material with question text to presentation
113  for ($i = 0; $i <= $this->object->getGapCount(); $i++) {
114  $this->object->addQTIMaterial($a_xml_writer, $text_parts[$i]);
115 
116  if ($i < $this->object->getGapCount()) {
117  // add gap
118  $gap = $this->object->getGap($i);
119  switch ($gap->getType()) {
120  case CLOZE_SELECT:
121  // comboboxes
122  $attrs = array(
123  "ident" => "gap_$i",
124  "rcardinality" => "Single"
125  );
126  $a_xml_writer->xmlStartTag("response_str", $attrs);
127  $solution = $this->object->getSuggestedSolution($i);
128  if (count($solution)) {
129  if (preg_match("/il_(\d*?)_(\w+)_(\d+)/", $solution["internal_link"], $matches)) {
130  $attrs = array(
131  "label" => "suggested_solution"
132  );
133  $a_xml_writer->xmlStartTag("material", $attrs);
134  $intlink = "il_" . IL_INST_ID . "_" . $matches[2] . "_" . $matches[3];
135  if (strcmp($matches[1], "") != 0) {
136  $intlink = $solution["internal_link"];
137  }
138  $a_xml_writer->xmlElement("mattext", null, $intlink);
139  $a_xml_writer->xmlEndTag("material");
140  }
141  }
142 
143  $attrs = array("shuffle" => ($gap->getShuffle() ? "Yes" : "No"));
144  $a_xml_writer->xmlStartTag("render_choice", $attrs);
145 
146  // add answers
147  foreach ($gap->getItems(new ilArrayElementOrderKeeper()) as $answeritem) {
148  $attrs = array(
149  "ident" => $answeritem->getOrder()
150  );
151  $a_xml_writer->xmlStartTag("response_label", $attrs);
152  $a_xml_writer->xmlStartTag("material");
153  $a_xml_writer->xmlElement("mattext", null, $answeritem->getAnswertext());
154  $a_xml_writer->xmlEndTag("material");
155  $a_xml_writer->xmlEndTag("response_label");
156  }
157  $a_xml_writer->xmlEndTag("render_choice");
158  $a_xml_writer->xmlEndTag("response_str");
159  break;
160  case CLOZE_TEXT:
161  // text fields
162  $attrs = array(
163  "ident" => "gap_$i",
164  "rcardinality" => "Single"
165  );
166  $a_xml_writer->xmlStartTag("response_str", $attrs);
167  $solution = $this->object->getSuggestedSolution($i);
168  if (count($solution)) {
169  if (preg_match("/il_(\d*?)_(\w+)_(\d+)/", $solution["internal_link"], $matches)) {
170  $attrs = array(
171  "label" => "suggested_solution"
172  );
173  $a_xml_writer->xmlStartTag("material", $attrs);
174  $intlink = "il_" . IL_INST_ID . "_" . $matches[2] . "_" . $matches[3];
175  if (strcmp($matches[1], "") != 0) {
176  $intlink = $solution["internal_link"];
177  }
178  $a_xml_writer->xmlElement("mattext", null, $intlink);
179  $a_xml_writer->xmlEndTag("material");
180  }
181  }
182  $attrs = array(
183  "fibtype" => "String",
184  "prompt" => "Box",
185  "columns" => $gap->getMaxWidth(),
186  "maxchars" => $gap->getGapSize()
187  );
188  $a_xml_writer->xmlStartTag("render_fib", $attrs);
189  $a_xml_writer->xmlEndTag("render_fib");
190  $a_xml_writer->xmlEndTag("response_str");
191  break;
192  case CLOZE_NUMERIC:
193  // numeric fields
194  $attrs = array(
195  "ident" => "gap_$i",
196  "numtype" => "Decimal",
197  "rcardinality" => "Single"
198  );
199  $a_xml_writer->xmlStartTag("response_num", $attrs);
200  $solution = $this->object->getSuggestedSolution($i);
201  if (count($solution)) {
202  if (preg_match("/il_(\d*?)_(\w+)_(\d+)/", $solution["internal_link"], $matches)) {
203  $attrs = array(
204  "label" => "suggested_solution"
205  );
206  $a_xml_writer->xmlStartTag("material", $attrs);
207  $intlink = "il_" . IL_INST_ID . "_" . $matches[2] . "_" . $matches[3];
208  if (strcmp($matches[1], "") != 0) {
209  $intlink = $solution["internal_link"];
210  }
211  $a_xml_writer->xmlElement("mattext", null, $intlink);
212  $a_xml_writer->xmlEndTag("material");
213  }
214  }
215  $answeritem = $gap->getItem(0);
216  $attrs = array(
217  "fibtype" => "Decimal",
218  "prompt" => "Box",
219  "columns" => $gap->getMaxWidth(),
220  "maxchars" => $gap->getGapSize()
221  );
222  if (is_object($answeritem)) {
223  if ($eval->e($answeritem->getLowerBound()) !== false) {
224  $attrs["minnumber"] = $answeritem->getLowerBound();
225  }
226  if ($eval->e($answeritem->getUpperBound()) !== false) {
227  $attrs["maxnumber"] = $answeritem->getUpperBound();
228  }
229  }
230  $a_xml_writer->xmlStartTag("render_fib", $attrs);
231  $a_xml_writer->xmlEndTag("render_fib");
232  $a_xml_writer->xmlEndTag("response_num");
233  break;
234  }
235  }
236  }
237  $a_xml_writer->xmlEndTag("flow");
238  $a_xml_writer->xmlEndTag("presentation");
239 
240  // PART II: qti resprocessing
241  $a_xml_writer->xmlStartTag("resprocessing");
242  $a_xml_writer->xmlStartTag("outcomes");
243  $a_xml_writer->xmlStartTag("decvar");
244  $a_xml_writer->xmlEndTag("decvar");
245  $a_xml_writer->xmlEndTag("outcomes");
246 
247  // add response conditions
248  for ($i = 0; $i < $this->object->getGapCount(); $i++) {
249  $gap = $this->object->getGap($i);
250  switch ($gap->getType()) {
251  case CLOZE_SELECT:
252  foreach ($gap->getItems(new ilArrayElementOrderKeeper()) as $answer) {
253  $attrs = array(
254  "continue" => "Yes"
255  );
256  $a_xml_writer->xmlStartTag("respcondition", $attrs);
257  // qti conditionvar
258  $a_xml_writer->xmlStartTag("conditionvar");
259 
260  $attrs = array(
261  "respident" => "gap_$i"
262  );
263  $a_xml_writer->xmlElement("varequal", $attrs, $answer->getAnswertext());
264  $a_xml_writer->xmlEndTag("conditionvar");
265  // qti setvar
266  $attrs = array(
267  "action" => "Add"
268  );
269  $a_xml_writer->xmlElement("setvar", $attrs, $answer->getPoints());
270  // qti displayfeedback
271  $linkrefid = "";
272  $linkrefid = "$i" . "_Response_" . $answer->getOrder();
273  $attrs = array(
274  "feedbacktype" => "Response",
275  "linkrefid" => $linkrefid
276  );
277  $a_xml_writer->xmlElement("displayfeedback", $attrs);
278  $a_xml_writer->xmlEndTag("respcondition");
279  }
280  break;
281  case CLOZE_TEXT:
282  foreach ($gap->getItems(new ilArrayElementOrderKeeper()) as $answer) {
283  $attrs = array(
284  "continue" => "Yes"
285  );
286  $a_xml_writer->xmlStartTag("respcondition", $attrs);
287  // qti conditionvar
288  $a_xml_writer->xmlStartTag("conditionvar");
289  $attrs = array(
290  "respident" => "gap_$i"
291  );
292  $a_xml_writer->xmlElement("varequal", $attrs, $answer->getAnswertext());
293  $a_xml_writer->xmlEndTag("conditionvar");
294  // qti setvar
295  $attrs = array(
296  "action" => "Add"
297  );
298  $a_xml_writer->xmlElement("setvar", $attrs, $answer->getPoints());
299  // qti displayfeedback
300  $linkrefid = "$i" . "_Response_" . $answer->getOrder();
301  $attrs = array(
302  "feedbacktype" => "Response",
303  "linkrefid" => $linkrefid
304  );
305  $a_xml_writer->xmlElement("displayfeedback", $attrs);
306  $a_xml_writer->xmlEndTag("respcondition");
307  }
308  break;
309  case CLOZE_NUMERIC:
310  foreach ($gap->getItems(new ilArrayElementOrderKeeper()) as $answer) {
311  $attrs = array(
312  "continue" => "Yes"
313  );
314  $a_xml_writer->xmlStartTag("respcondition", $attrs);
315  // qti conditionvar
316  $a_xml_writer->xmlStartTag("conditionvar");
317  $attrs = array(
318  "respident" => "gap_$i"
319  );
320  $a_xml_writer->xmlElement("varequal", $attrs, $answer->getAnswertext());
321  $a_xml_writer->xmlEndTag("conditionvar");
322  // qti setvar
323  $attrs = array(
324  "action" => "Add"
325  );
326  $a_xml_writer->xmlElement("setvar", $attrs, $answer->getPoints());
327  // qti displayfeedback
328  $linkrefid = "$i" . "_Response_" . $answer->getOrder();
329  $attrs = array(
330  "feedbacktype" => "Response",
331  "linkrefid" => $linkrefid
332  );
333  $a_xml_writer->xmlElement("displayfeedback", $attrs);
334  $a_xml_writer->xmlEndTag("respcondition");
335  }
336  break;
337  }
338  }
339 
340  $feedback_allcorrect = $this->object->feedbackOBJ->getGenericFeedbackExportPresentation(
341  $this->object->getId(),
342  true
343  );
344  if (strlen($feedback_allcorrect)) {
345  $attrs = array(
346  "continue" => "Yes"
347  );
348  $a_xml_writer->xmlStartTag("respcondition", $attrs);
349  // qti conditionvar
350  $a_xml_writer->xmlStartTag("conditionvar");
351 
352  for ($i = 0; $i < $this->object->getGapCount(); $i++) {
353  $gap = $this->object->getGap($i);
354  $indexes = $gap->getBestSolutionIndexes();
355  if ($i > 0) {
356  $a_xml_writer->xmlStartTag("and");
357  }
358  switch ($gap->getType()) {
359  case CLOZE_SELECT:
360  $k = 0;
361  foreach ($indexes as $key) {
362  if ($k > 0) {
363  $a_xml_writer->xmlStartTag("or");
364  }
365  $attrs = array(
366  "respident" => "gap_$i"
367  );
368  $answer = $gap->getItem($key);
369  $a_xml_writer->xmlElement("varequal", $attrs, $answer->getAnswertext());
370  if ($k > 0) {
371  $a_xml_writer->xmlEndTag("or");
372  }
373  $k++;
374  }
375  break;
376  case CLOZE_TEXT:
377  $k = 0;
378  foreach ($indexes as $key) {
379  if ($k > 0) {
380  $a_xml_writer->xmlStartTag("or");
381  }
382  $attrs = array(
383  "respident" => "gap_$i"
384  );
385  $answer = $gap->getItem($key);
386  $a_xml_writer->xmlElement("varequal", $attrs, $answer->getAnswertext());
387  if ($k > 0) {
388  $a_xml_writer->xmlEndTag("or");
389  }
390  $k++;
391  }
392  break;
393  case CLOZE_NUMERIC:
394  $k = 0;
395  foreach ($indexes as $key) {
396  if ($k > 0) {
397  $a_xml_writer->xmlStartTag("or");
398  }
399  $attrs = array(
400  "respident" => "gap_$i"
401  );
402  $answer = $gap->getItem($key);
403  $a_xml_writer->xmlElement("varequal", $attrs, $answer->getAnswertext());
404  if ($k > 0) {
405  $a_xml_writer->xmlEndTag("or");
406  }
407  $k++;
408  }
409  break;
410  }
411  if ($i > 0) {
412  $a_xml_writer->xmlEndTag("and");
413  }
414  }
415  $a_xml_writer->xmlEndTag("conditionvar");
416  // qti displayfeedback
417  $attrs = array(
418  "feedbacktype" => "Response",
419  "linkrefid" => "response_allcorrect"
420  );
421  $a_xml_writer->xmlElement("displayfeedback", $attrs);
422  $a_xml_writer->xmlEndTag("respcondition");
423  }
424  $feedback_onenotcorrect = $this->object->feedbackOBJ->getGenericFeedbackExportPresentation(
425  $this->object->getId(),
426  false
427  );
428  if (strlen($feedback_onenotcorrect)) {
429  $attrs = array(
430  "continue" => "Yes"
431  );
432  $a_xml_writer->xmlStartTag("respcondition", $attrs);
433  // qti conditionvar
434  $a_xml_writer->xmlStartTag("conditionvar");
435 
436  $a_xml_writer->xmlStartTag("not");
437  for ($i = 0; $i < $this->object->getGapCount(); $i++) {
438  $gap = $this->object->getGap($i);
439  $indexes = $gap->getBestSolutionIndexes();
440  if ($i > 0) {
441  $a_xml_writer->xmlStartTag("and");
442  }
443  switch ($gap->getType()) {
444  case CLOZE_SELECT:
445  $k = 0;
446  foreach ($indexes as $key) {
447  if ($k > 0) {
448  $a_xml_writer->xmlStartTag("or");
449  }
450  $attrs = array(
451  "respident" => "gap_$i"
452  );
453  $answer = $gap->getItem($key);
454  $a_xml_writer->xmlElement("varequal", $attrs, $answer->getAnswertext());
455  if ($k > 0) {
456  $a_xml_writer->xmlEndTag("or");
457  }
458  $k++;
459  }
460  break;
461  case CLOZE_TEXT:
462  $k = 0;
463  foreach ($indexes as $key) {
464  if ($k > 0) {
465  $a_xml_writer->xmlStartTag("or");
466  }
467  $attrs = array(
468  "respident" => "gap_$i"
469  );
470  $answer = $gap->getItem($key);
471  $a_xml_writer->xmlElement("varequal", $attrs, $answer->getAnswertext());
472  if ($k > 0) {
473  $a_xml_writer->xmlEndTag("or");
474  }
475  $k++;
476  }
477  break;
478  case CLOZE_NUMERIC:
479  $k = 0;
480  foreach ($indexes as $key) {
481  if ($k > 0) {
482  $a_xml_writer->xmlStartTag("or");
483  }
484  $attrs = array(
485  "respident" => "gap_$i"
486  );
487  $answer = $gap->getItem($key);
488  $a_xml_writer->xmlElement("varequal", $attrs, $answer->getAnswertext());
489  if ($k > 0) {
490  $a_xml_writer->xmlEndTag("or");
491  }
492  $k++;
493  }
494  break;
495  }
496  if ($i > 0) {
497  $a_xml_writer->xmlEndTag("and");
498  }
499  }
500  $a_xml_writer->xmlEndTag("not");
501  $a_xml_writer->xmlEndTag("conditionvar");
502  // qti displayfeedback
503  $attrs = array(
504  "feedbacktype" => "Response",
505  "linkrefid" => "response_onenotcorrect"
506  );
507  $a_xml_writer->xmlElement("displayfeedback", $attrs);
508  $a_xml_writer->xmlEndTag("respcondition");
509  }
510 
511  $a_xml_writer->xmlEndTag("resprocessing");
512 
513  // PART III: qti itemfeedback
514  for ($i = 0; $i < $this->object->getGapCount(); $i++) {
515  $gap = $this->object->getGap($i);
516  switch ($gap->getType()) {
517  case CLOZE_SELECT:
518  break;
519  case CLOZE_TEXT:
520  break;
521  case CLOZE_NUMERIC:
522  break;
523  }
524  /*foreach ($gap->getItems() as $answer)
525  {
526  $linkrefid = "$i" . "_Response_" . $answer->getOrder();
527  $attrs = array(
528  "ident" => $linkrefid,
529  "view" => "All"
530  );
531  $a_xml_writer->xmlStartTag("itemfeedback", $attrs);
532  // qti flow_mat
533  $a_xml_writer->xmlStartTag("flow_mat");
534 // $a_xml_writer->xmlStartTag("material");
535 // $a_xml_writer->xmlElement("mattext");
536 // $a_xml_writer->xmlEndTag("material");
537  $fb = $this->object->feedbackOBJ->getSpecificAnswerFeedbackExportPresentation(
538  $this->object->getId(), $index
539  );
540  $this->object->addQTIMaterial($a_xml_writer, $fb);
541  $a_xml_writer->xmlEndTag("flow_mat");
542  $a_xml_writer->xmlEndTag("itemfeedback");
543  }*/
544  /*
545  $attrs = array(
546  "ident" => $i,
547  "view" => "All"
548  );
549  $a_xml_writer->xmlStartTag("itemfeedback", $attrs);
550  // qti flow_mat
551  $a_xml_writer->xmlStartTag("flow_mat");
552  // $a_xml_writer->xmlStartTag("material");
553  // $a_xml_writer->xmlElement("mattext");
554  // $a_xml_writer->xmlEndTag("material");
555  $fb = $this->object->feedbackOBJ->getSpecificAnswerFeedbackExportPresentation(
556  $this->object->getId(), $i, 0
557  );
558  $this->object->addQTIMaterial($a_xml_writer, $fb);
559  $a_xml_writer->xmlEndTag("flow_mat");
560  $a_xml_writer->xmlEndTag("itemfeedback");
561  */
562  }
563  $this->exportAnswerSpecificFeedbacks($a_xml_writer);
564 
565  if (strlen($feedback_allcorrect)) {
566  $attrs = array(
567  "ident" => "response_allcorrect",
568  "view" => "All"
569  );
570  $a_xml_writer->xmlStartTag("itemfeedback", $attrs);
571  // qti flow_mat
572  $a_xml_writer->xmlStartTag("flow_mat");
573  $this->object->addQTIMaterial($a_xml_writer, $feedback_allcorrect);
574  $a_xml_writer->xmlEndTag("flow_mat");
575  $a_xml_writer->xmlEndTag("itemfeedback");
576  }
577  if (strlen($feedback_onenotcorrect)) {
578  $attrs = array(
579  "ident" => "response_onenotcorrect",
580  "view" => "All"
581  );
582  $a_xml_writer->xmlStartTag("itemfeedback", $attrs);
583  // qti flow_mat
584  $a_xml_writer->xmlStartTag("flow_mat");
585  $this->object->addQTIMaterial($a_xml_writer, $feedback_onenotcorrect);
586  $a_xml_writer->xmlEndTag("flow_mat");
587  $a_xml_writer->xmlEndTag("itemfeedback");
588  }
589 
590  $a_xml_writer->xmlEndTag("item");
591  $a_xml_writer->xmlEndTag("questestinterop");
592 
593  $xml = $a_xml_writer->xmlDumpMem(false);
594  if (!$a_include_header) {
595  $pos = strpos($xml, "?>");
596  $xml = substr($xml, $pos + 2);
597  }
598  return $xml;
599  }
600 
604  protected function exportAnswerSpecificFeedbacks(ilXmlWriter $xmlWriter)
605  {
606  require_once 'Modules/TestQuestionPool/classes/feedback/class.ilAssSpecificFeedbackIdentifierList.php';
607  $feedbackIdentifierList = new ilAssSpecificFeedbackIdentifierList();
608  $feedbackIdentifierList->load($this->object->getId());
609 
610  foreach ($feedbackIdentifierList as $fbIdentifier) {
611  $feedback = $this->object->feedbackOBJ->getSpecificAnswerFeedbackExportPresentation(
612  $this->object->getId(),
613  $fbIdentifier->getQuestionIndex(),
614  $fbIdentifier->getAnswerIndex()
615  );
616 
617  $xmlWriter->xmlStartTag("itemfeedback", array(
618  "ident" => $this->buildQtiExportIdent($fbIdentifier), "view" => "All"
619  ));
620 
621  $xmlWriter->xmlStartTag("flow_mat");
622  $this->object->addQTIMaterial($xmlWriter, $feedback);
623  $xmlWriter->xmlEndTag("flow_mat");
624 
625  $xmlWriter->xmlEndTag("itemfeedback");
626  }
627  }
628 
634  {
635  return "{$fbIdentifier->getQuestionIndex()}_{$fbIdentifier->getAnswerIndex()}";
636  }
637 }
xmlStartTag($tag, $attrs=null, $empty=false, $encode=true, $escape=true)
Writes a starttag.
global $DIC
Definition: saml.php:7
const CLOZE_TEXT
Cloze question constants.
XML writer class.
buildQtiExportIdent(ilAssSpecificFeedbackIdentifier $fbIdentifier)
Class for question exports.
addGeneralMetadata(ilXmlWriter $xmlwriter)
xmlEndTag($tag)
Writes an endtag.
exportAnswerSpecificFeedbacks(ilXmlWriter $xmlWriter)
const CLOZE_SELECT
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...
$i
Definition: disco.tpl.php:19
const CLOZE_NUMERIC
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.
$key
Definition: croninfo.php:18
const CLOZE_TEST_IDENTIFIER
Question identifier constants.