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