ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
class.ilQuestionExporter.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2010 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4
5require_once("./Modules/TestQuestionPool/classes/class.assQuestionGUI.php");
6
17{
18 static $exported = array(); //json data for all exported questions (class variable)
19 static $mobs = array(); //json data for all mobs (class variable)
20 static $media_files = array(); //json data for all files (class variable)
21
22 var $db; // database object
23 var $ilias; // ilias object
24 var $ref_id; // reference ID
25 var $inst_id; // installation id
26 var $q_gui; // Question GUI object
27 var $tpl; // question template
28 var $json; // json object for current question
29 var $json_decoded; // json object (decoded) for current question
30 var $preview_mode; // preview mode activated yes/no
31
36 public function __construct($a_preview_mode = false)
37 {
38 global $ilDB, $lng;
39
40 $this->db = $ilDB;
41 $this->lng = $lng;
42
43 $this->lng->loadLanguageModule('assessment');
44
45 $this->inst_id = IL_INST_ID;
46
47 $this->preview_mode = $a_preview_mode;
48
49 $this->tpl = new ilTemplate("tpl.question_export.html", true, true, "Modules/Scorm2004");
50
51 // fix for bug 5386, alex 29.10.2009
52 if (!$a_preview_mode)
53 {
54 $this->tpl->setVariable("FORM_BEGIN", "<form onsubmit='return false;'>");
55 $this->tpl->setVariable("FORM_END", "</form>");
56 }
57
58 }
59
60
61 public function exportQuestion($a_ref_id, $a_image_path = null, $a_output_mode = "presentation") {
62
63 if ($a_ref_id != "")
64 {
66 if (!($inst_id > 0))
67 {
69 }
70 }
71
72 $this->q_gui = assQuestionGUI::_getQuestionGUI("", $q_id);
73
74 if (!is_object($this->q_gui->object))
75 {
76 return "Error: Question not found.";
77 }
78
79 $type = $this->q_gui->object->getQuestionType();
80 if (method_exists($this,$type))
81 {
82 $this->q_gui->object->setExportImagePath($a_image_path);
83 $this->q_gui->object->feedbackOBJ->setPageObjectOutputMode($a_output_mode);
84 $this->json = $this->q_gui->object->toJSON();
85 $this->json_decoded = json_decode($this->json);
86 self::$exported[$this->json_decoded->id] = $this->json;
87 self::$mobs[$this->json_decoded->id] = $this->json_decoded->mobs;
88 return $this->$type();
89 } else {
90 return "Error: Question Type not implemented/Question editing not finished";
91 }
92 }
93
94 static public function indicateNewSco() {
95 self::$exported = array();
96 self::$mobs = array();
97 self::$media_files = array();
98 }
99
100 static public function getMobs() {
101 $allmobs = array();
102 foreach (self::$mobs as $key => $value) {
103 for ($i=0;$i<count($mobs[$key]);$i++) {
104 array_push($allmobs,$mobs[$key][$i]);
105 }
106 }
107 return $allmobs;
108 }
109
110 static public function getFiles() {
111 return self::$media_files;
112 }
113
114 static public function questionsJS(array $a_qids = null) {
115 $exportstring = '';
116 if(!is_array($a_qids)) {
117 $exportstring ='var questions = new Array();';
118 }
119 foreach (self::$exported as $key => $value) {
120 if(!is_array($a_qids) || in_array($key, $a_qids)) {
121 $exportstring .= "questions[$key]= $value;";
122 }
123 }
124 return $exportstring;
125 }
126
127 private function setHeaderFooter()
128 {
129 $this->tpl->setCurrentBlock("common");
130 $this->tpl->setVariable("VAL_ID", $this->json_decoded->id);
131 $this->tpl->setVariable("VAL_TYPE", $this->json_decoded->type);
132 $this->tpl->parseCurrentBlock();
133 }
134
135 private function assSingleChoice()
136 {
137 $this->tpl->setCurrentBlock("singlechoice");
138 $this->tpl->setVariable("TXT_SUBMIT_ANSWERS", $this->lng->txt("cont_submit_answers"));
139 $this->tpl->setVariable("VAL_ID", $this->json_decoded->id);
140 if ($this->preview_mode) {
141 $this->tpl->setVariable("VAL_NO_DISPLAY", "style=\"display:none\"");
142 }
143 if($this->json_decoded->path)
144 {
145 $this->tpl->setVariable("HANDLE_IMAGES",
146 "ilias.questions.handleMCImages(".$this->json_decoded->id.");");
147 }
148 $this->tpl->parseCurrentBlock();
149 foreach ($this->json_decoded->answers as $answer) {
150 if ($answer->image!="") {
151 array_push(self::$media_files,$this->q_gui->object->getImagePath().$answer->image);
152 if (is_file($this->q_gui->object->getImagePath()."thumb.".$answer->image))
153 {
154 array_push(self::$media_files,$this->q_gui->object->getImagePath()."thumb.".$answer->image);
155 }
156 }
157 }
158// $this->setHeaderFooter();
159 return $this->tpl->get();
160 }
161
162 private function assMultipleChoice() {
163
164 global $tpl;
165 $this->q_gui->populateJavascriptFilesRequiredForWorkForm($tpl);
166 $tpl->addCss('Modules/Test/templates/default/ta.css');
167
168 $this->tpl->setCurrentBlock("multiplechoice");
169 $this->tpl->setVariable("TXT_SUBMIT_ANSWERS", $this->lng->txt("cont_submit_answers"));
170 $this->tpl->setVariable("VAL_ID", $this->json_decoded->id);
171 if($this->json_decoded->selection_limit)
172 {
173 $this->tpl->setVariable('SELECTION_LIMIT_HINT', sprintf(
174 $this->lng->txt('ass_mc_sel_lim_hint'),
175 $this->json_decoded->selection_limit,
176 count($this->json_decoded->answers)
177 ));
178
179 $this->tpl->setVariable('SELECTION_LIMIT_VALUE', $this->json_decoded->selection_limit);
180 }
181 else
182 {
183 $this->tpl->setVariable('SELECTION_LIMIT_VALUE', 'null');
184 }
185 if ($this->preview_mode) {
186 $this->tpl->setVariable("VAL_NO_DISPLAY", "style=\"display:none\"");
187 }
188 if($this->json_decoded->path)
189 {
190 $this->tpl->setVariable("HANDLE_IMAGES",
191 "ilias.questions.handleMCImages(".$this->json_decoded->id.");");
192 }
193 $this->tpl->parseCurrentBlock();
194 foreach ($this->json_decoded->answers as $answer) {
195 if ($answer->image!="") {
196 array_push(self::$media_files,$this->q_gui->object->getImagePath().$answer->image);
197 array_push(self::$media_files,$this->q_gui->object->getImagePath()."thumb.".$answer->image);
198 }
199 }
200// $this->setHeaderFooter();
201 return $this->tpl->get();
202 }
203
204
205 private function assKprimChoice()
206 {
207 global $tpl;
208 $tpl->addCss('Modules/Test/templates/default/ta.css');
209
210 $this->tpl->setCurrentBlock("kprimchoice");
211
212 $this->tpl->setVariable("TXT_SUBMIT_ANSWERS", $this->lng->txt("cont_submit_answers"));
213 $this->tpl->setVariable("VAL_ID", $this->json_decoded->id);
214
215 if( $this->preview_mode )
216 {
217 $this->tpl->setVariable("VAL_NO_DISPLAY", "style=\"display:none\"");
218 }
219
220 if( $this->json_decoded->path )
221 {
222 $this->tpl->setVariable("HANDLE_IMAGES",
223 "ilias.questions.handleKprimImages(".$this->json_decoded->id.");");
224 }
225
226 $this->tpl->setVariable('OPTION_LABEL_TRUE', $this->json_decoded->trueOptionLabel);
227 $this->tpl->setVariable('OPTION_LABEL_FALSE', $this->json_decoded->falseOptionLabel);
228
229 $this->tpl->setVariable('VALUE_TRUE', 1);
230 $this->tpl->setVariable('VALUE_FALSE', 0);
231
232 $this->tpl->parseCurrentBlock();
233
234 foreach( $this->json_decoded->answers as $answer )
235 {
236 if( is_object($answer->image) )
237 {
238 self::$media_files[] = $answer->getImageFsPath();
239 self::$media_files[] = $answer->getThumbFsPath();
240 }
241 else if( is_string($answer->image) )
242 {
243 self::$media_files[] = $this->q_gui->object->getImagePath() . $answer->image;
244 if (is_file($this->q_gui->object->getImagePath()."thumb.".$answer->image))
245 {
246 self::$media_files[] = $this->q_gui->object->getImagePath() . "thumb." . $answer->image;
247 }
248 }
249 }
250
251 // $this->setHeaderFooter();
252
253 return $this->tpl->get();
254 }
255
256 private function assTextQuestion() {
257 $maxlength = $this->json_decoded->maxlength == 0 ? 4096 : $this->json_decoded->maxlength;
258 $this->tpl->setCurrentBlock("textquestion");
259 $this->tpl->setVariable("VAL_ID", $this->json_decoded->id);
260 $this->tpl->setVariable("TXT_SUBMIT_ANSWERS", $this->lng->txt("cont_submit_answers"));
261 $this->tpl->setVariable("VAL_MAXLENGTH", $maxlength);
262 if ($this->preview_mode) {
263 $this->tpl->setVariable("VAL_NO_DISPLAY", "style=\"display:none\"");
264 }
265 $this->tpl->parseCurrentBlock();
266// $this->setHeaderFooter();
267 return $this->tpl->get();
268 }
269
270 private function assClozeTest() {
271 $this->tpl->setCurrentBlock("clozequestion");
272 $this->tpl->setVariable("VAL_ID", $this->json_decoded->id);
273 $this->tpl->setVariable("TXT_SUBMIT_ANSWERS", $this->lng->txt("cont_submit_answers"));
274 if ($this->preview_mode) {
275 $this->tpl->setVariable("VAL_NO_DISPLAY", "style=\"display:none\"");
276 }
277 $this->tpl->parseCurrentBlock();
278// $this->setHeaderFooter();
279 return $this->tpl->get();
280 }
281
282 private function assLongMenu() {
283 $this->tpl->setCurrentBlock("longmenu");
284 $this->tpl->setVariable("VAL_ID", $this->json_decoded->id);
285 $this->tpl->setVariable("TXT_SUBMIT_ANSWERS", $this->lng->txt("cont_submit_answers"));
286 if ($this->preview_mode) {
287 $this->tpl->setVariable("VAL_NO_DISPLAY", "style=\"display:none\"");
288 }
289 $this->tpl->parseCurrentBlock();
290// $this->setHeaderFooter();
291 return $this->tpl->get();
292 }
293
294 private function assOrderingQuestion() {
295 $this->tpl->setCurrentBlock("orderingquestion");
296 $this->tpl->setVariable("VAL_ID", $this->json_decoded->id);
297 $this->tpl->setVariable("TXT_SUBMIT_ANSWERS", $this->lng->txt("cont_submit_answers"));
298 if ($this->preview_mode) {
299 $this->tpl->setVariable("VAL_NO_DISPLAY", "style=\"display:none\"");
300 }
301 if($this->q_gui->object->getOrderingType() == OQ_PICTURES)
302 {
303 $this->tpl->setVariable("VAL_SUBTYPE", "_images");
304 $this->tpl->setVariable("HANDLE_IMAGES",
305 "ilias.questions.handleOrderingImages(".$this->json_decoded->id.");");
306
307 foreach ($this->json_decoded->answers as $answer) {
308 if ($answer->answertext!="") {
309 array_push(self::$media_files,$this->q_gui->object->getImagePath().$answer->answertext);
310 array_push(self::$media_files,$this->q_gui->object->getImagePath()."thumb.".$answer->answertext);
311 }
312 }
313 }
314 else
315 {
316 $this->tpl->setVariable("VAL_SUBTYPE", "_terms");
317 }
318 $this->tpl->parseCurrentBlock();
319// $this->setHeaderFooter();
320 return $this->tpl->get();
321 }
322
323 private function assMatchingQuestion() {
324 global $tpl;
325 $tpl->addJavaScript('Modules/TestQuestionPool/js/ilMatchingQuestion.js');
326 $tpl->addCss('Modules/TestQuestionPool/templates/default/test_javascript.css');
327 $this->tpl->setCurrentBlock("matchingquestion");
328 $this->tpl->setVariable("VAL_ID", $this->json_decoded->id);
329 $this->tpl->setVariable("BTN_LABEL_RESET", $this->lng->txt("reset_terms"));
330 $this->tpl->setVariable("TXT_SUBMIT_ANSWERS", $this->lng->txt("cont_submit_answers"));
331 if ($this->preview_mode) {
332 $this->tpl->setVariable("VAL_NO_DISPLAY", "style=\"display:none\"");
333 }
334 $this->tpl->parseCurrentBlock();
335// $this->setHeaderFooter();
336 return $this->tpl->get();
337 }
338
339 private function assImagemapQuestion() {
340 $this->tpl->setVariable("TXT_SUBMIT_ANSWERS", $this->lng->txt("cont_submit_answers"));
341 array_push(self::$media_files,$this->q_gui->object->getImagePath().$this->q_gui->object->getImageFilename());
342 $this->tpl->setCurrentBlock("mapareas");
343 $areas = $this->json_decoded->answers;
344 //set areas in PHP cause of inteference between pure and highlighter
345 foreach ($areas as $area) {
346 $this->tpl->setVariable("VAL_TOOLTIP", htmlspecialchars($area->answertext));
347 $this->tpl->setVariable("VAL_COORDS", $area->coords);
348 $this->tpl->setVariable("VAL_ORDER", $area->order);
349 $this->tpl->setVariable("VAL_AREA", $area->area);
350 $this->tpl->setVariable("VAL_ID", $this->json_decoded->id);
351 $this->tpl->parseCurrentBlock();
352 }
353 $this->tpl->setCurrentBlock("imagemapquestion");
354 $this->tpl->setVariable("VAL_ID", $this->json_decoded->id);
355 if ($this->preview_mode) {
356 $this->tpl->setVariable("VAL_NO_DISPLAY", "style=\"display:none\"");
357 }
358 $this->tpl->parseCurrentBlock();
359// $this->setHeaderFooter();
360 return $this->tpl->get();
361 }
362
363 private function assTextSubset() {
364 $this->tpl->setCurrentBlock("textsubset");
365 $this->tpl->setVariable("VAL_ID", $this->json_decoded->id);
366 $this->tpl->setVariable("TXT_SUBMIT_ANSWERS", $this->lng->txt("cont_submit_answers"));
367 $this->tpl->setVariable("VAL_MAXLENGTH", $maxlength);
368 if ($this->preview_mode) {
369 $this->tpl->setVariable("VAL_NO_DISPLAY", "style=\"display:none\"");
370 }
371 $this->tpl->parseCurrentBlock();
372// $this->setHeaderFooter();
373 return $this->tpl->get();
374 }
375
376 private function assOrderingHorizontal() {
377 $this->tpl->setCurrentBlock("orderinghorizontal");
378 $this->tpl->setVariable("VAL_ID", $this->json_decoded->id);
379 $this->tpl->setVariable("TXT_SUBMIT_ANSWERS", $this->lng->txt("cont_submit_answers"));
380 if ($this->preview_mode) {
381 $this->tpl->setVariable("VAL_NO_DISPLAY", "style=\"display:none\"");
382 }
383 $this->tpl->parseCurrentBlock();
384// $this->setHeaderFooter();
385 return $this->tpl->get();
386 }
387
388 private function assErrorText() {
389 $this->tpl->setCurrentBlock("errortext");
390 $this->tpl->setVariable("VAL_ID", $this->json_decoded->id);
391 $this->tpl->setVariable("TXT_SUBMIT_ANSWERS", $this->lng->txt("cont_submit_answers"));
392 if ($this->preview_mode) {
393 $this->tpl->setVariable("VAL_NO_DISPLAY", "style=\"display:none\"");
394 }
395 $this->tpl->parseCurrentBlock();
396// $this->setHeaderFooter();
397 return $this->tpl->get();
398 }
399}
400
401?>
sprintf('%.4f', $callTime)
An exception for terminatinating execution or to throw for unit testing.
static _getQuestionGUI($question_type, $question_id=-1)
Creates a question gui representation and returns the alias to the question gui note: please do not u...
Scorm 2004 Question Exporter.
__construct($a_preview_mode=false)
Constructor @access public.
exportQuestion($a_ref_id, $a_image_path=null, $a_output_mode="presentation")
static questionsJS(array $a_qids=null)
special template class to simplify handling of ITX/PEAR
const OQ_PICTURES
Ordering question constants.
global $lng
Definition: privfeed.php:17
global $ilDB
$mobs