ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5f
class.assOrderingQuestionExport.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2013 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4include_once "./Modules/TestQuestionPool/classes/export/qti12/class.assQuestionExport.php";
5
16{
26 function toXML($a_include_header = true, $a_include_binary = true, $a_shuffle = false, $test_output = false, $force_image_references = false)
27 {
28 global $ilDB;
29 global $ilUser;
30 global $ilias;
31
32 include_once("./Services/Xml/classes/class.ilXmlWriter.php");
33 $a_xml_writer = new ilXmlWriter;
34 // set xml header
35 $a_xml_writer->xmlHeader();
36 $a_xml_writer->xmlStartTag("questestinterop");
37 $attrs = array(
38 "ident" => "il_".IL_INST_ID."_qst_".$this->object->getId(),
39 "title" => $this->object->getTitle(),
40 "maxattempts" => $this->object->getNrOfTries()
41 );
42 $a_xml_writer->xmlStartTag("item", $attrs);
43 // add question description
44 $a_xml_writer->xmlElement("qticomment", NULL, $this->object->getComment());
45 // add estimated working time
46 $workingtime = $this->object->getEstimatedWorkingTime();
47 $duration = sprintf("P0Y0M0DT%dH%dM%dS", $workingtime["h"], $workingtime["m"], $workingtime["s"]);
48 $a_xml_writer->xmlElement("duration", NULL, $duration);
49 // add ILIAS specific metadata
50 $a_xml_writer->xmlStartTag("itemmetadata");
51 $a_xml_writer->xmlStartTag("qtimetadata");
52 $a_xml_writer->xmlStartTag("qtimetadatafield");
53 $a_xml_writer->xmlElement("fieldlabel", NULL, "ILIAS_VERSION");
54 $a_xml_writer->xmlElement("fieldentry", NULL, $ilias->getSetting("ilias_version"));
55 $a_xml_writer->xmlEndTag("qtimetadatafield");
56 $a_xml_writer->xmlStartTag("qtimetadatafield");
57 $a_xml_writer->xmlElement("fieldlabel", NULL, "QUESTIONTYPE");
58 $a_xml_writer->xmlElement("fieldentry", NULL, ORDERING_QUESTION_IDENTIFIER);
59 $a_xml_writer->xmlEndTag("qtimetadatafield");
60 $a_xml_writer->xmlStartTag("qtimetadatafield");
61 $a_xml_writer->xmlElement("fieldlabel", NULL, "AUTHOR");
62 $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getAuthor());
63 $a_xml_writer->xmlEndTag("qtimetadatafield");
64
65 // additional content editing information
67 $this->addGeneralMetadata($a_xml_writer);
68
69 $a_xml_writer->xmlStartTag("qtimetadatafield");
70 $a_xml_writer->xmlElement("fieldlabel", NULL, "thumb_geometry");
71 $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getThumbGeometry());
72 $a_xml_writer->xmlEndTag("qtimetadatafield");
73 $a_xml_writer->xmlStartTag("qtimetadatafield");
74 $a_xml_writer->xmlElement("fieldlabel", NULL, "element_height");
75 $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getElementHeight());
76 $a_xml_writer->xmlEndTag("qtimetadatafield");
77 $a_xml_writer->xmlStartTag("qtimetadatafield");
78 $a_xml_writer->xmlElement("fieldlabel", NULL, "points");
79 $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getPoints());
80 $a_xml_writer->xmlEndTag("qtimetadatafield");
81 $a_xml_writer->xmlEndTag("qtimetadata");
82 $a_xml_writer->xmlEndTag("itemmetadata");
83
84 // PART I: qti presentation
85 $attrs = array(
86 "label" => $this->object->getTitle()
87 );
88 $a_xml_writer->xmlStartTag("presentation", $attrs);
89 // add flow to presentation
90 $a_xml_writer->xmlStartTag("flow");
91 // add material with question text to presentation
92 $this->object->addQTIMaterial($a_xml_writer, $this->object->getQuestion());
93 // add answers to presentation
94 $attrs = array();
95
96 if ($this->object->getOrderingType() == OQ_PICTURES)
97 $ordering_type ='OQP';
98 else if($this->object->getOrderingType() == OQ_NESTED_PICTURES)
99 $ordering_type ='OQNP';
100 else if($this->object->getOrderingType() == OQ_NESTED_TERMS)
101 $ordering_type ='OQNT';
102 else if($this->object->getOrderingType() == OQ_TERMS)
103 $ordering_type ='OQT';
104
105 $attrs = array(
106 "ident" => $ordering_type,
107 "rcardinality" => "Ordered"
108 );
109
110 if ($this->object->getOutputType() == OUTPUT_JAVASCRIPT)
111 {
112 $attrs["output"] = "javascript";
113 }
114 $a_xml_writer->xmlStartTag("response_lid", $attrs);
115 $solution = $this->object->getSuggestedSolution(0);
116 if (count($solution))
117 {
118 if (preg_match("/il_(\d*?)_(\w+)_(\d+)/", $solution["internal_link"], $matches))
119 {
120 $a_xml_writer->xmlStartTag("material");
121 $intlink = "il_" . IL_INST_ID . "_" . $matches[2] . "_" . $matches[3];
122 if (strcmp($matches[1], "") != 0)
123 {
124 $intlink = $solution["internal_link"];
125 }
126 $attrs = array(
127 "label" => "suggested_solution"
128 );
129 $a_xml_writer->xmlElement("mattext", $attrs, $intlink);
130 $a_xml_writer->xmlEndTag("material");
131 }
132 }
133 // shuffle output
134 $attrs = array();
135 if ($this->object->getShuffle())
136 {
137 $attrs = array(
138 "shuffle" => "Yes"
139 );
140 }
141 else
142 {
143 $attrs = array(
144 "shuffle" => "No"
145 );
146 }
147 $a_xml_writer->xmlStartTag("render_choice", $attrs);
148 // shuffle
149 $akeys = array_keys($this->object->getAnswers());
150 if ($this->object->getShuffle() && $a_shuffle)
151 {
152 $akeys = $this->object->pcArrayShuffle($akeys);
153 }
154
155 // add answers
156 foreach ($akeys as $index)
157 {
158 $answer = $this->object->getAnswer($index);
159 $attrs = array(
160 "ident" => $index
161 );
162 $a_xml_writer->xmlStartTag("response_label", $attrs);
163 if ($this->object->getOrderingType() == OQ_PICTURES
164 || $this->object->getOrderingType() == OQ_NESTED_PICTURES)
165 {
166 $imagetype = "image/jpeg";
167
168 $a_xml_writer->xmlStartTag("material");
169 if ($force_image_references)
170 {
171 $attrs = array(
172 "imagtype" => $imagetype,
173 "label" => $answer->getAnswertext(),
174 "uri" => $this->object->getImagePathWeb() . $answer->getAnswertext()
175 );
176 $a_xml_writer->xmlElement("matimage", $attrs);
177 }
178 else
179 {
180 $imagepath = $this->object->getImagePath() . $answer->getAnswertext();
181 $fh = @fopen($imagepath, "rb");
182 if ($fh != false)
183 {
184 $imagefile = fread($fh, filesize($imagepath));
185 fclose($fh);
186 $base64 = base64_encode($imagefile);
187
188 if (preg_match("/.*\.(png|gif)$/", $answer->getAnswertext(), $matches))
189 {
190 $imagetype = "image/".$matches[1];
191 }
192 $attrs = array(
193 "imagtype" => $imagetype,
194 "label" => $answer->getAnswertext(),
195 "embedded" => "base64"
196 );
197 $a_xml_writer->xmlElement("matimage", $attrs, $base64, FALSE, FALSE);
198 }
199 }
200 $a_xml_writer->xmlEndTag("material");
201 }
202 else if ($this->object->getOrderingType() == OQ_TERMS
203 || $this->object->getOrderingType() == OQ_NESTED_TERMS)
204 {
205 $a_xml_writer->xmlStartTag("material");
206 $this->object->addQTIMaterial($a_xml_writer, $answer->getAnswertext(), TRUE, FALSE);
207 $a_xml_writer->xmlEndTag("material");
208 $a_xml_writer->xmlStartTag("material");
209 if ($this->object->getOldLeveledOrdering())
210 {
211 $attrs = array(
212 "label" => "answerdepth"
213 );
214 $a_xml_writer->xmlElement("mattext", $attrs, $answer->getOrderingDepth());
215 }
216 $a_xml_writer->xmlEndTag("material");
217 }
218 $a_xml_writer->xmlEndTag("response_label");
219 }
220 $a_xml_writer->xmlEndTag("render_choice");
221 $a_xml_writer->xmlEndTag("response_lid");
222 $a_xml_writer->xmlEndTag("flow");
223 $a_xml_writer->xmlEndTag("presentation");
224
225 // PART II: qti resprocessing
226 $a_xml_writer->xmlStartTag("resprocessing");
227 $a_xml_writer->xmlStartTag("outcomes");
228 $a_xml_writer->xmlStartTag("decvar");
229 $a_xml_writer->xmlEndTag("decvar");
230 $a_xml_writer->xmlEndTag("outcomes");
231 // add response conditions
232 foreach ($this->object->getAnswers() as $index => $answer)
233 {
234 $attrs = array(
235 "continue" => "Yes"
236 );
237 $a_xml_writer->xmlStartTag("respcondition", $attrs);
238 // qti conditionvar
239 $a_xml_writer->xmlStartTag("conditionvar");
240 $attrs = array();
241
242 if ($this->object->getOrderingType() == OQ_PICTURES)
243 $ordering_type ='OQP';
244 else if($this->object->getOrderingType() == OQ_NESTED_PICTURES)
245 $ordering_type ='OQNP';
246 else if($this->object->getOrderingType() == OQ_NESTED_TERMS)
247 $ordering_type ='OQNT';
248 else if($this->object->getOrderingType() == OQ_TERMS)
249 $ordering_type ='OQT';
250
251 $attrs = array("respident" => $ordering_type);
252
253 $attrs["index"] = $index;
254 $a_xml_writer->xmlElement("varequal", $attrs, $index);
255 $a_xml_writer->xmlEndTag("conditionvar");
256 // qti setvar
257 $attrs = array(
258 "action" => "Add"
259 );
260 $a_xml_writer->xmlElement("setvar", $attrs, $this->object->getPoints() / count($this->object->getAnswers()));
261 // qti displayfeedback
262 $attrs = array(
263 "feedbacktype" => "Response",
264 "linkrefid" => "link_$index"
265 );
266 $a_xml_writer->xmlElement("displayfeedback", $attrs);
267 $a_xml_writer->xmlEndTag("respcondition");
268 }
269
270 $feedback_allcorrect = $this->object->feedbackOBJ->getGenericFeedbackExportPresentation(
271 $this->object->getId(), true
272 );
273 if (strlen($feedback_allcorrect))
274 {
275 $attrs = array(
276 "continue" => "Yes"
277 );
278 $a_xml_writer->xmlStartTag("respcondition", $attrs);
279 // qti conditionvar
280 $a_xml_writer->xmlStartTag("conditionvar");
281
282 foreach ($this->object->getAnswers() as $index => $answer)
283 {
284 $attrs = array();
285
286 if ($this->object->getOrderingType() == OQ_PICTURES)
287 $ordering_type ='OQP';
288 else if($this->object->getOrderingType() == OQ_NESTED_PICTURES)
289 $ordering_type ='OQNP';
290 else if($this->object->getOrderingType() == OQ_NESTED_TERMS)
291 $ordering_type ='OQNT';
292 else if($this->object->getOrderingType() == OQ_TERMS)
293 $ordering_type ='OQT';
294
295 $attrs = array("respident" => $ordering_type);
296
297 $attrs["index"] = $index;
298 $a_xml_writer->xmlElement("varequal", $attrs, $index);
299 }
300
301 $a_xml_writer->xmlEndTag("conditionvar");
302 // qti displayfeedback
303 $attrs = array(
304 "feedbacktype" => "Response",
305 "linkrefid" => "response_allcorrect"
306 );
307 $a_xml_writer->xmlElement("displayfeedback", $attrs);
308 $a_xml_writer->xmlEndTag("respcondition");
309 }
310
311 $feedback_onenotcorrect = $this->object->feedbackOBJ->getGenericFeedbackExportPresentation(
312 $this->object->getId(), false
313 );
314 if (strlen($feedback_onenotcorrect))
315 {
316 $attrs = array(
317 "continue" => "Yes"
318 );
319 $a_xml_writer->xmlStartTag("respcondition", $attrs);
320 // qti conditionvar
321 $a_xml_writer->xmlStartTag("conditionvar");
322 $a_xml_writer->xmlStartTag("not");
323
324 foreach ($this->object->getAnswers() as $index => $answer)
325 {
326 $attrs = array();
327 if ($this->object->getOrderingType() == OQ_PICTURES)
328 $ordering_type ='OQP';
329 else if($this->object->getOrderingType() == OQ_NESTED_PICTURES)
330 $ordering_type ='OQNP';
331 else if($this->object->getOrderingType() == OQ_NESTED_TERMS)
332 $ordering_type ='OQNT';
333 else if($this->object->getOrderingType() == OQ_TERMS)
334 $ordering_type ='OQT';
335
336 $attrs = array("respident" => $ordering_type);
337
338 $attrs["index"] = $index;
339 $a_xml_writer->xmlElement("varequal", $attrs, $index);
340 }
341
342 $a_xml_writer->xmlEndTag("not");
343 $a_xml_writer->xmlEndTag("conditionvar");
344 // qti displayfeedback
345 $attrs = array(
346 "feedbacktype" => "Response",
347 "linkrefid" => "response_onenotcorrect"
348 );
349 $a_xml_writer->xmlElement("displayfeedback", $attrs);
350 $a_xml_writer->xmlEndTag("respcondition");
351 }
352
353 $a_xml_writer->xmlEndTag("resprocessing");
354
355 // PART III: qti itemfeedback
356 foreach ($this->object->getAnswers() as $index => $answer)
357 {
358 $attrs = array(
359 "ident" => "link_$index",
360 "view" => "All"
361 );
362 $a_xml_writer->xmlStartTag("itemfeedback", $attrs);
363 // qti flow_mat
364 $a_xml_writer->xmlStartTag("flow_mat");
365 $a_xml_writer->xmlStartTag("material");
366 $a_xml_writer->xmlElement("mattext");
367 $a_xml_writer->xmlEndTag("material");
368 $a_xml_writer->xmlEndTag("flow_mat");
369 $a_xml_writer->xmlEndTag("itemfeedback");
370 }
371
372 if (strlen($feedback_allcorrect))
373 {
374 $attrs = array(
375 "ident" => "response_allcorrect",
376 "view" => "All"
377 );
378 $a_xml_writer->xmlStartTag("itemfeedback", $attrs);
379 // qti flow_mat
380 $a_xml_writer->xmlStartTag("flow_mat");
381 $this->object->addQTIMaterial($a_xml_writer, $feedback_allcorrect);
382 $a_xml_writer->xmlEndTag("flow_mat");
383 $a_xml_writer->xmlEndTag("itemfeedback");
384 }
385 if (strlen($feedback_onenotcorrect))
386 {
387 $attrs = array(
388 "ident" => "response_onenotcorrect",
389 "view" => "All"
390 );
391 $a_xml_writer->xmlStartTag("itemfeedback", $attrs);
392 // qti flow_mat
393 $a_xml_writer->xmlStartTag("flow_mat");
394 $this->object->addQTIMaterial($a_xml_writer, $feedback_onenotcorrect);
395 $a_xml_writer->xmlEndTag("flow_mat");
396 $a_xml_writer->xmlEndTag("itemfeedback");
397 }
398
399 $a_xml_writer->xmlEndTag("item");
400 $a_xml_writer->xmlEndTag("questestinterop");
401
402 $xml = $a_xml_writer->xmlDumpMem(FALSE);
403 if (!$a_include_header)
404 {
405 $pos = strpos($xml, "?>");
406 $xml = substr($xml, $pos + 2);
407 }
408 return $xml;
409 }
410}
411
412?>
Class for ordering question exports.
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.
Class for question exports.
addGeneralMetadata(ilXmlWriter $xmlwriter)
addAdditionalContentEditingModeInformation(ilXmlWriter $a_xml_writer)
adds a qti meta data field for ilias specific information of "additional content editing mode" (xml w...
XML writer class.
xmlHeader()
Writes xml header @access public.
const OQ_NESTED_PICTURES
const OUTPUT_JAVASCRIPT
const OQ_TERMS
const OQ_NESTED_TERMS
const OQ_PICTURES
Ordering question constants.
const ORDERING_QUESTION_IDENTIFIER
global $ilDB
global $ilUser
Definition: imgupload.php:15