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 
5 require_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  {
65  $inst_id = ilInternalLink::_extractInstOfTarget($a_ref_id);
66  if (!($inst_id > 0))
67  {
68  $q_id = ilInternalLink::_extractObjIdOfTarget($a_ref_id);
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 ?>
Scorm 2004 Question Exporter.
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.
Create styles array
The data for the language used.
global $lng
Definition: privfeed.php:17
global $ilDB
static questionsJS(array $a_qids=null)