ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5f
class.assKprimChoiceGUI.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 require_once 'Modules/TestQuestionPool/classes/class.assQuestionGUI.php';
5 require_once 'Modules/TestQuestionPool/interfaces/interface.ilGuiQuestionScoringAdjustable.php';
6 require_once 'Modules/TestQuestionPool/interfaces/interface.ilGuiAnswerScoringAdjustable.php';
7 
17 {
21  public $object;
22 
26  public function __construct($qId = -1)
27  {
28  parent::__construct();
29 
30  require_once 'Modules/TestQuestionPool/classes/class.assKprimChoice.php';
31  $this->object = new assKprimChoice();
32 
33  if ($qId > 0)
34  {
35  $this->object->loadFromDb($qId);
36  }
37  }
38 
39  protected function getAdditionalEditQuestionCommands()
40  {
41  return array('uploadImage', 'removeImage');
42  }
43 
44  protected function editQuestion(ilPropertyFormGUI $form = null)
45  {
46  if( $form === null )
47  {
48  $form = $this->buildEditForm();
49  }
50 
51  $this->getQuestionTemplate();
52  $this->tpl->addCss('Modules/Test/templates/default/ta.css');
53 
54  $this->tpl->setVariable("QUESTION_DATA", $this->ctrl->getHTML($form));
55  }
56 
57  protected function uploadImage()
58  {
59  $result = $this->writePostData(true);
60 
61  if( $result == 0 )
62  {
63  $this->object->saveToDb();
64  $this->editQuestion();
65  }
66  }
67 
68  public function removeImage()
69  {
70  $position = key($_POST['cmd']['removeImage']);
71  $this->object->removeAnswerImage($position);
72 
73  $this->object->saveToDb();
74  $this->editQuestion();
75  }
76 
77  public function downkprim_answers()
78  {
79  if( isset($_POST['cmd'][__FUNCTION__]) && count($_POST['cmd'][__FUNCTION__]) )
80  {
81  $this->object->moveAnswerDown( key($_POST['cmd'][__FUNCTION__]) );
82  $this->object->saveToDb();
83  }
84 
85  $this->editQuestion();
86  }
87 
88  public function upkprim_answers()
89  {
90  if( isset($_POST['cmd'][__FUNCTION__]) && count($_POST['cmd'][__FUNCTION__]) )
91  {
92  $this->object->moveAnswerUp( key($_POST['cmd'][__FUNCTION__]) );
93  $this->object->saveToDb();
94  }
95 
96  $this->editQuestion();
97  }
98 
99  protected function writePostData($upload = false)
100  {
101  $form = $this->buildEditForm();
102  $form->setValuesByPost();
103 
104  if( $upload )
105  {
106  $answersInput = $form->getItemByPostVar('kprim_answers');
107  $answersInput->setIgnoreMissingUploadsEnabled(true);
108 
109  if( !$answersInput->checkUploads($_POST[$answersInput->getPostVar()]) )
110  {
111  ilUtil::sendFailure($this->lng->txt("form_input_not_valid"));
112  $this->editQuestion($form);
113  return 1;
114  }
115 
116  $answersInput->collectValidFiles();
117  }
118  elseif( !$form->checkInput() )
119  {
120  $this->editQuestion($form);
121  return 1;
122  }
123 
125 
126  $this->writeQuestionSpecificPostData($form);
127  $this->writeAnswerSpecificPostData($form);
128 
129  $this->saveTaxonomyAssignments();
130 
131  return 0;
132  }
133 
137  private function buildEditForm()
138  {
139  $form = $this->buildBasicEditFormObject();
140 
141  $this->addQuestionFormCommandButtons($form);
142 
143  $this->addBasicQuestionFormProperties($form);
144 
145  $this->populateQuestionSpecificFormPart($form);
146  $this->populateAnswerSpecificFormPart($form);
147 
148  $this->populateTaxonomyFormSection($form);
149 
150  return $form;
151  }
152 
158  {
159  // shuffle answers
160  $shuffleAnswers = new ilCheckboxInputGUI($this->lng->txt( "shuffle_answers" ), "shuffle_answers_enabled");
161  $shuffleAnswers->setChecked( $this->object->isShuffleAnswersEnabled() );
162  $form->addItem($shuffleAnswers);
163 
164  if( !$this->object->getSelfAssessmentEditingMode() )
165  {
166  // answer mode (single-/multi-line)
167  $answerType = new ilSelectInputGUI($this->lng->txt('answer_types'), 'answer_type');
168  $answerType->setOptions($this->object->getAnswerTypeSelectOptions($this->lng));
169  $answerType->setValue( $this->object->getAnswerType() );
170  $form->addItem($answerType);
171  }
172 
173  if( !$this->object->getSelfAssessmentEditingMode() && $this->object->isSingleLineAnswerType($this->object->getAnswerType()) )
174  {
175  // thumb size
176  $thumbSize = new ilNumberInputGUI($this->lng->txt('thumb_size'), 'thumb_size');
177  $thumbSize->setSuffix($this->lng->txt("thumb_size_unit_pixel"));
178  $thumbSize->setInfo( $this->lng->txt('thumb_size_info') );
179  $thumbSize->setDecimals(false);
180  $thumbSize->setMinValue(20);
181  $thumbSize->setSize(6);
182  $thumbSize->setValue( $this->object->getThumbSize() );
183  $form->addItem($thumbSize);
184  }
185 
186  // option label
187  $optionLabel = new ilRadioGroupInputGUI($this->lng->txt('option_label'), 'option_label');
188  $optionLabel->setInfo($this->lng->txt('option_label_info'));
189  $optionLabel->setRequired(true);
190  $optionLabel->setValue($this->object->getOptionLabel());
191  foreach($this->object->getValidOptionLabelsTranslated($this->lng) as $labelValue => $labelText)
192  {
193  $option = new ilRadioOption($labelText, $labelValue);
194  $optionLabel->addOption($option);
195 
196  if( $this->object->isCustomOptionLabel($labelValue) )
197  {
198  $customLabelTrue = new ilTextInputGUI(
199  $this->lng->txt('option_label_custom_true'), 'option_label_custom_true'
200  );
201  $customLabelTrue->setValue($this->object->getCustomTrueOptionLabel());
202  $option->addSubItem($customLabelTrue);
203 
204  $customLabelFalse = new ilTextInputGUI(
205  $this->lng->txt('option_label_custom_false'), 'option_label_custom_false'
206  );
207  $customLabelFalse->setValue($this->object->getCustomFalseOptionLabel());
208  $option->addSubItem($customLabelFalse);
209  }
210  }
211  $form->addItem($optionLabel);
212 
213  // points
214  $points = new ilNumberInputGUI($this->lng->txt('points'), 'points');
215  $points->setRequired(true);
216  $points->setSize(3);
217  $points->allowDecimals(true);
218  $points->setMinValue(0);
219  $points->setMinvalueShouldBeGreater(true);
220  $points->setValue($this->object->getPoints());
221  $form->addItem($points);
222 
223  // score partial solution
224  $scorePartialSolution = new ilCheckboxInputGUI($this->lng->txt('score_partsol_enabled'), 'score_partsol_enabled');
225  $scorePartialSolution->setInfo($this->lng->txt('score_partsol_enabled_info'));
226  $scorePartialSolution->setChecked( $this->object->isScorePartialSolutionEnabled() );
227  $form->addItem($scorePartialSolution);
228 
229  return $form;
230  }
231 
236  {
237  $oldAnswerType = $this->object->getAnswerType();
238 
239  $this->object->setShuffleAnswersEnabled($form->getItemByPostVar('shuffle_answers_enabled')->getChecked());
240 
241  if( !$this->object->getSelfAssessmentEditingMode() )
242  {
243  $this->object->setAnswerType($form->getItemByPostVar('answer_type')->getValue());
244  }
245  else
246  {
247  $this->object->setAnswerType(assKprimChoice::ANSWER_TYPE_MULTI_LINE);
248  }
249 
250  if( !$this->object->getSelfAssessmentEditingMode() && $this->object->isSingleLineAnswerType($oldAnswerType) )
251  {
252  $this->object->setThumbSize($form->getItemByPostVar('thumb_size')->getValue());
253  }
254 
255  $this->object->setOptionLabel($form->getItemByPostVar('option_label')->getValue());
256 
257  if( $this->object->isCustomOptionLabel($this->object->getOptionLabel()) )
258  {
259  $this->object->setCustomTrueOptionLabel( strip_tags(
260  $form->getItemByPostVar('option_label_custom_true')->getValue()
261  ));
262  $this->object->setCustomFalseOptionLabel( strip_tags(
263  $form->getItemByPostVar('option_label_custom_false')->getValue()
264  ));
265  }
266 
267  $this->object->setPoints($form->getItemByPostVar('points')->getValue());
268 
269  $this->object->setScorePartialSolutionEnabled($form->getItemByPostVar('score_partsol_enabled')->getChecked());
270  }
271 
277  {
278  require_once 'Modules/TestQuestionPool/classes/class.ilKprimChoiceWizardInputGUI.php';
279  $kprimAnswers = new ilKprimChoiceWizardInputGUI($this->lng->txt('answers'), 'kprim_answers');
280  $kprimAnswers->setInfo($this->lng->txt('kprim_answers_info'));
281  $kprimAnswers->setSize(64);
282  $kprimAnswers->setMaxLength(1000);
283  $kprimAnswers->setRequired(true);
284  $kprimAnswers->setAllowMove(true);
285  $kprimAnswers->setQuestionObject($this->object);
286  if( !$this->object->getSelfAssessmentEditingMode() )
287  {
288  $kprimAnswers->setSingleline($this->object->isSingleLineAnswerType($this->object->getAnswerType()));
289  }
290  else
291  {
292  $kprimAnswers->setSingleline(false);
293  }
294  $kprimAnswers->setValues($this->object->getAnswers());
295  $form->addItem($kprimAnswers);
296 
297  return $form;
298  }
299 
304  {
305  $answers = $form->getItemByPostVar('kprim_answers')->getValues();
306  $answers = $this->handleAnswerTextsSubmit($answers);
307  $files = $form->getItemByPostVar('kprim_answers')->getFiles();
308 
309  $this->object->handleFileUploads($answers, $files);
310  $this->object->setAnswers($answers);
311  }
312 
313  private function handleAnswerTextsSubmit($answers)
314  {
315  if( $this->object->getAnswerType() == assKprimChoice::ANSWER_TYPE_MULTI_LINE )
316  {
317  return $answers;
318  }
319 
320  foreach($answers as $key => $answer)
321  {
322  $answer->setAnswerText(ilUtil::secureString($answer->getAnswerText()));
323  }
324 
325  return $answers;
326  }
327 
333  function getSpecificFeedbackOutput($active_id, $pass)
334  {
335  return ''; // question type supports inline answer specific feedback
336  }
337 
347  function getTestOutput(
348  $active_id,
349  // hey: prevPassSolutions - will be always available from now on
350  $pass,
351  // hey.
352  $is_postponed = FALSE,
353  $use_post_solutions = FALSE,
354  $showInlineFeedback = FALSE
355  )
356  {
357  // shuffle output
358  $keys = $this->getParticipantsAnswerKeySequence();
359 
360  // get the solution of the user for the active pass or from the last pass if allowed
361  $user_solution = array();
362  if ($active_id)
363  {
364  // hey: prevPassSolutions - obsolete due to central check
365  #$solutions = NULL;
366  #include_once "./Modules/Test/classes/class.ilObjTest.php";
367  #if (!ilObjTest::_getUsePreviousAnswers($active_id, true))
368  #{
369  # if (is_null($pass)) $pass = ilObjTest::_getPass($active_id);
370  #}
371  $solutions = $this->getTestOutputSolutions($active_id, $pass);
372  // hey.
373  foreach ($solutions as $idx => $solution_value)
374  {
375  $user_solution[$solution_value["value1"]] = $solution_value["value2"];
376  }
377  }
378 
379  // generate the question output
380  include_once "./Services/UICore/classes/class.ilTemplate.php";
381  $template = new ilTemplate("tpl.il_as_qpl_mc_kprim_output.html", TRUE, TRUE, "Modules/TestQuestionPool");
382 
383  foreach ($keys as $answer_id)
384  {
385  $answer = $this->object->getAnswer($answer_id);
386  if (strlen($answer->getImageFile()))
387  {
388  if ($this->object->getThumbSize())
389  {
390  $template->setCurrentBlock("preview");
391  $template->setVariable("URL_PREVIEW", $answer->getImageWebPath());
392  $template->setVariable("TEXT_PREVIEW", $this->lng->txt('preview'));
393  $template->setVariable("IMG_PREVIEW", ilUtil::getImagePath('enlarge.svg'));
394  $template->setVariable("ANSWER_IMAGE_URL", $answer->getThumbWebPath());
395  list($width, $height, $type, $attr) = getimagesize($answer->getImageFsPath());
396  $alt = $answer->getImageFile();
397  if (strlen($answer->getAnswertext()))
398  {
399  $alt = $answer->getAnswertext();
400  }
401  $alt = preg_replace("/<[^>]*?>/", "", $alt);
402  $template->setVariable("ANSWER_IMAGE_ALT", ilUtil::prepareFormOutput($alt));
403  $template->setVariable("ANSWER_IMAGE_TITLE", ilUtil::prepareFormOutput($alt));
404  $template->parseCurrentBlock();
405  }
406  else
407  {
408  $template->setCurrentBlock("answer_image");
409  $template->setVariable("ANSWER_IMAGE_URL", $answer->getImageWebPath());
410  list($width, $height, $type, $attr) = getimagesize($answer->getImageFsPath());
411  $alt = $answer->getImageFile();
412  if (strlen($answer->getAnswertext()))
413  {
414  $alt = $answer->getAnswertext();
415  }
416  $alt = preg_replace("/<[^>]*?>/", "", $alt);
417  $template->setVariable("ATTR", $attr);
418  $template->setVariable("ANSWER_IMAGE_ALT", ilUtil::prepareFormOutput($alt));
419  $template->setVariable("ANSWER_IMAGE_TITLE", ilUtil::prepareFormOutput($alt));
420  $template->parseCurrentBlock();
421  }
422  }
423 
424  if( $showInlineFeedback )
425  {
426  $this->populateSpecificFeedbackInline($user_solution, $answer_id, $template);
427  }
428 
429  $template->setCurrentBlock("answer_row");
430  $template->setVariable("ANSWER_ID", $answer_id);
431  $template->setVariable("ANSWER_TEXT", $this->object->prepareTextareaOutput($answer->getAnswertext(), TRUE));
432  $template->setVariable('VALUE_TRUE', 1);
433  $template->setVariable('VALUE_FALSE', 0);
434 
435  if( isset($user_solution[$answer->getPosition()]) )
436  {
437  $tplVar = $user_solution[$answer->getPosition()] ? 'CHECKED_ANSWER_TRUE' : 'CHECKED_ANSWER_FALSE';
438  $template->setVariable($tplVar, " checked=\"checked\"");
439  }
440 
441  $template->parseCurrentBlock();
442  }
443 
444  $questiontext = $this->object->getQuestion();
445  $template->setVariable("QUESTIONTEXT", $this->object->prepareTextareaOutput($questiontext, TRUE));
446 
447  $template->setVariable("INSTRUCTIONTEXT", $this->object->getInstructionTextTranslation(
448  $this->lng, $this->object->getOptionLabel()
449  ));
450 
451  $template->setVariable("OPTION_LABEL_TRUE", $this->object->getTrueOptionLabelTranslation(
452  $this->lng, $this->object->getOptionLabel()
453  ));
454 
455  $template->setVariable("OPTION_LABEL_FALSE", $this->object->getFalseOptionLabelTranslation(
456  $this->lng, $this->object->getOptionLabel()
457  ));
458 
459  $questionoutput = $template->get();
460  $pageoutput = $this->outQuestionPage("", $is_postponed, $active_id, $questionoutput);
461  return $pageoutput;
462  }
463 
468  public function getPreview($show_question_only = FALSE, $showInlineFeedback = false)
469  {
470  $user_solution = is_object($this->getPreviewSession()) ? (array)$this->getPreviewSession()->getParticipantsSolution() : array();
471  // shuffle output
472  $keys = $this->getParticipantsAnswerKeySequence();
473 
474  // generate the question output
475  include_once "./Services/UICore/classes/class.ilTemplate.php";
476  $template = new ilTemplate("tpl.il_as_qpl_mc_kprim_output.html", TRUE, TRUE, "Modules/TestQuestionPool");
477 
478  foreach ($keys as $answer_id)
479  {
480  $answer = $this->object->getAnswer($answer_id);
481  if (strlen($answer->getImageFile()))
482  {
483  if ($this->object->getThumbSize())
484  {
485  $template->setCurrentBlock("preview");
486  $template->setVariable("URL_PREVIEW", $answer->getImageWebPath());
487  $template->setVariable("TEXT_PREVIEW", $this->lng->txt('preview'));
488  $template->setVariable("IMG_PREVIEW", ilUtil::getImagePath('enlarge.svg'));
489  $template->setVariable("ANSWER_IMAGE_URL", $answer->getThumbWebPath());
490  list($width, $height, $type, $attr) = getimagesize($answer->getImageFsPath());
491  $alt = $answer->getImageFile();
492  if (strlen($answer->getAnswertext()))
493  {
494  $alt = $answer->getAnswertext();
495  }
496  $alt = preg_replace("/<[^>]*?>/", "", $alt);
497  $template->setVariable("ANSWER_IMAGE_ALT", ilUtil::prepareFormOutput($alt));
498  $template->setVariable("ANSWER_IMAGE_TITLE", ilUtil::prepareFormOutput($alt));
499  $template->parseCurrentBlock();
500  }
501  else
502  {
503  $template->setCurrentBlock("answer_image");
504  $template->setVariable("ANSWER_IMAGE_URL", $answer->getImageWebPath());
505  list($width, $height, $type, $attr) = getimagesize($answer->getImageFsPath());
506  $alt = $answer->getImageFile();
507  if (strlen($answer->getAnswertext()))
508  {
509  $alt = $answer->getAnswertext();
510  }
511  $alt = preg_replace("/<[^>]*?>/", "", $alt);
512  $template->setVariable("ATTR", $attr);
513  $template->setVariable("ANSWER_IMAGE_ALT", ilUtil::prepareFormOutput($alt));
514  $template->setVariable("ANSWER_IMAGE_TITLE", ilUtil::prepareFormOutput($alt));
515  $template->parseCurrentBlock();
516  }
517  }
518 
519  if( $showInlineFeedback )
520  {
521  $this->populateSpecificFeedbackInline($user_solution, $answer_id, $template);
522  }
523 
524  $template->setCurrentBlock("answer_row");
525  $template->setVariable("ANSWER_ID", $answer_id);
526  $template->setVariable("ANSWER_TEXT", $this->object->prepareTextareaOutput($answer->getAnswertext(), TRUE));
527  $template->setVariable('VALUE_TRUE', 1);
528  $template->setVariable('VALUE_FALSE', 0);
529 
530  if( isset($user_solution[$answer->getPosition()]) )
531  {
532  $tplVar = $user_solution[$answer->getPosition()] ? 'CHECKED_ANSWER_TRUE' : 'CHECKED_ANSWER_FALSE';
533  $template->setVariable($tplVar, " checked=\"checked\"");
534  }
535 
536  $template->parseCurrentBlock();
537  }
538  $questiontext = $this->object->getQuestion();
539  $template->setVariable("QUESTIONTEXT", $this->object->prepareTextareaOutput($questiontext, TRUE));
540 
541  $template->setVariable("INSTRUCTIONTEXT", $this->object->getInstructionTextTranslation(
542  $this->lng, $this->object->getOptionLabel()
543  ));
544 
545  $template->setVariable("OPTION_LABEL_TRUE", $this->object->getTrueOptionLabelTranslation(
546  $this->lng, $this->object->getOptionLabel()
547  ));
548 
549  $template->setVariable("OPTION_LABEL_FALSE", $this->object->getFalseOptionLabelTranslation(
550  $this->lng, $this->object->getOptionLabel()
551  ));
552 
553  $questionoutput = $template->get();
554  if (!$show_question_only)
555  {
556  // get page object output
557  $questionoutput = $this->getILIASPage($questionoutput);
558  }
559  return $questionoutput;
560  }
561 
573  public function getSolutionOutput(
574  $active_id,
575  $pass = NULL,
576  $graphicalOutput = FALSE,
577  $result_output = FALSE,
578  $show_question_only = TRUE,
579  $show_feedback = FALSE,
580  $show_correct_solution = FALSE,
581  $show_manual_scoring = FALSE,
582  $show_question_text = TRUE
583  )
584  {
585  // shuffle output
586  $keys = $this->getParticipantsAnswerKeySequence();
587 
588  // get the solution of the user for the active pass or from the last pass if allowed
589  $user_solution = array();
590  if (($active_id > 0) && (!$show_correct_solution))
591  {
592  $solutions =& $this->object->getSolutionValues($active_id, $pass);
593  foreach ($solutions as $idx => $solution_value)
594  {
595  $user_solution[$solution_value['value1']] = $solution_value['value2'];
596  }
597  }
598  else
599  {
600  // take the correct solution instead of the user solution
601  foreach ($this->object->getAnswers() as $answer)
602  {
603  $user_solution[$answer->getPosition()] = $answer->getCorrectness();
604  }
605  }
606 
607  // generate the question output
608  $template = new ilTemplate("tpl.il_as_qpl_mc_kprim_output_solution.html", TRUE, TRUE, "Modules/TestQuestionPool");
609 
610  foreach ($keys as $answer_id)
611  {
612  $answer = $this->object->getAnswer($answer_id);
613 
614  if (($active_id > 0) && (!$show_correct_solution))
615  {
616  if ($graphicalOutput)
617  {
618  // output of ok/not ok icons for user entered solutions
619 
620  if( $user_solution[$answer->getPosition()] == $answer->getCorrectness() )
621  {
622  $template->setCurrentBlock("icon_ok");
623  $template->setVariable("ICON_OK", ilUtil::getImagePath("icon_ok.svg"));
624  $template->setVariable("TEXT_OK", $this->lng->txt("answer_is_right"));
625  $template->parseCurrentBlock();
626  }
627  else
628  {
629  $template->setCurrentBlock("icon_ok");
630  $template->setVariable("ICON_NOT_OK", ilUtil::getImagePath("icon_not_ok.svg"));
631  $template->setVariable("TEXT_NOT_OK", $this->lng->txt("answer_is_wrong"));
632  $template->parseCurrentBlock();
633  }
634  }
635  }
636  if (strlen($answer->getImageFile()))
637  {
638  $template->setCurrentBlock("answer_image");
639  if ($this->object->getThumbSize())
640  {
641  $template->setVariable("ANSWER_IMAGE_URL", $answer->getThumbWebPath());
642  }
643  else
644  {
645  $template->setVariable("ANSWER_IMAGE_URL", $answer->getImageWebPath());
646  }
647 
648  $template->setVariable("ANSWER_IMAGE_ALT", ilUtil::prepareFormOutput($answer->getImageFile()));
649  $template->setVariable("ANSWER_IMAGE_TITLE", ilUtil::prepareFormOutput($answer->getImageFile()));
650  $template->parseCurrentBlock();
651  }
652 
653  if ($show_feedback)
654  {
655  $this->populateSpecificFeedbackInline($user_solution, $answer_id, $template);
656  }
657 
658  $template->setCurrentBlock("answer_row");
659  $template->setVariable("ANSWER_TEXT", $this->object->prepareTextareaOutput($answer->getAnswertext(), TRUE));
660 
661  if( $this->isPdfOutputMode() || $this->isContentEditingOutputMode() )
662  {
663  if( isset($user_solution[$answer->getPosition()]) )
664  {
665  if( $user_solution[$answer->getPosition()] )
666  {
667  $template->setVariable("SOLUTION_IMAGE_TRUE", ilUtil::getHtmlPath(ilUtil::getImagePath("radiobutton_checked.png")));
668  $template->setVariable("SOLUTION_ALT_TRUE", $this->lng->txt("checked"));
669  $template->setVariable("SOLUTION_IMAGE_FALSE", ilUtil::getHtmlPath(ilUtil::getImagePath("radiobutton_unchecked.png")));
670  $template->setVariable("SOLUTION_ALT_FALSE", $this->lng->txt("unchecked"));
671  }
672  else
673  {
674  $template->setVariable("SOLUTION_IMAGE_TRUE", ilUtil::getHtmlPath(ilUtil::getImagePath("radiobutton_unchecked.png")));
675  $template->setVariable("SOLUTION_ALT_TRUE", $this->lng->txt("unchecked"));
676  $template->setVariable("SOLUTION_IMAGE_FALSE", ilUtil::getHtmlPath(ilUtil::getImagePath("radiobutton_checked.png")));
677  $template->setVariable("SOLUTION_ALT_FALSE", $this->lng->txt("checked"));
678  }
679  }
680  else
681  {
682  $template->setVariable("SOLUTION_IMAGE_TRUE", ilUtil::getHtmlPath(ilUtil::getImagePath("radiobutton_unchecked.png")));
683  $template->setVariable("SOLUTION_ALT_TRUE", $this->lng->txt("unchecked"));
684  $template->setVariable("SOLUTION_IMAGE_FALSE", ilUtil::getHtmlPath(ilUtil::getImagePath("radiobutton_unchecked.png")));
685  $template->setVariable("SOLUTION_ALT_FALSE", $this->lng->txt("unchecked"));
686  }
687  }
688  else
689  {
690  $template->setVariable('SOL_QID', $this->object->getId());
691  $template->setVariable('SOL_SUFFIX', $show_correct_solution ? 'bestsolution' : 'usersolution');
692  $template->setVariable('SOL_POSITION', $answer->getPosition());
693 
694  $template->setVariable('SOL_TRUE_VALUE', 1);
695  $template->setVariable('SOL_FALSE_VALUE', 0);
696 
697  if( isset($user_solution[$answer->getPosition()]) )
698  {
699  if( $user_solution[$answer->getPosition()] )
700  {
701  $template->setVariable('SOL_TRUE_CHECKED', 'checked');
702  }
703  else
704  {
705  $template->setVariable('SOL_FALSE_CHECKED', 'checked');
706  }
707  }
708  }
709 
710  $template->parseCurrentBlock();
711  }
712 
713  if ($show_question_text==true)
714  {
715  $questiontext = $this->object->getQuestion();
716  $template->setVariable("QUESTIONTEXT", $this->object->prepareTextareaOutput($questiontext, TRUE));
717 
718  $template->setVariable("INSTRUCTIONTEXT", $this->object->getInstructionTextTranslation(
719  $this->lng, $this->object->getOptionLabel()
720  ));
721  }
722 
723  $template->setVariable("OPTION_LABEL_TRUE", $this->object->getTrueOptionLabelTranslation(
724  $this->lng, $this->object->getOptionLabel()
725  ));
726 
727  $template->setVariable("OPTION_LABEL_FALSE", $this->object->getFalseOptionLabelTranslation(
728  $this->lng, $this->object->getOptionLabel()
729  ));
730 
731 
732  $questionoutput = $template->get();
733  $feedback = ($show_feedback && !$this->isTestPresentationContext()) ? $this->getGenericFeedbackOutput($active_id, $pass) : "";
734 
735  $solutiontemplate = new ilTemplate("tpl.il_as_tst_solution_output.html",TRUE, TRUE, "Modules/TestQuestionPool");
736 
737  if (strlen($feedback))
738  {
739  $cssClass = ( $this->hasCorrectSolution($active_id, $pass) ?
741  );
742 
743  $solutiontemplate->setVariable("ILC_FB_CSS_CLASS", $cssClass);
744  $solutiontemplate->setVariable("FEEDBACK", $this->object->prepareTextareaOutput( $feedback, true ));
745  }
746 
747  $solutiontemplate->setVariable("SOLUTION_OUTPUT", $questionoutput);
748 
749  $solutionoutput = $solutiontemplate->get();
750 
751  if (!$show_question_only)
752  {
753  // get page object output
754  $solutionoutput = $this->getILIASPage($solutionoutput);
755  }
756  return $solutionoutput;
757  }
758 
759  protected function getParticipantsAnswerKeySequence()
760  {
761  $choiceKeys = array_keys($this->object->getAnswers());
762 
763  if( $this->object->isShuffleAnswersEnabled() )
764  {
765  $choiceKeys = $this->object->getShuffler()->shuffle($choiceKeys);
766  }
767 
768  return $choiceKeys;
769  }
770 
771  private function populateSpecificFeedbackInline($user_solution, $answer_id, $template)
772  {
773  require_once 'Modules/TestQuestionPool/classes/feedback/class.ilAssConfigurableMultiOptionQuestionFeedback.php';
774 
775  if($this->object->getSpecificFeedbackSetting() == ilAssConfigurableMultiOptionQuestionFeedback::FEEDBACK_SETTING_CHECKED)
776  {
777  if($user_solution[$answer_id])
778  {
779  $fb = $this->object->feedbackOBJ->getSpecificAnswerFeedbackTestPresentation($this->object->getId(), $answer_id);
780  if(strlen($fb))
781  {
782  $template->setCurrentBlock("feedback");
783  $template->setVariable("FEEDBACK", $this->object->prepareTextareaOutput($fb, true));
784  $template->parseCurrentBlock();
785  }
786  }
787  }
788 
789  if($this->object->getSpecificFeedbackSetting() == ilAssConfigurableMultiOptionQuestionFeedback::FEEDBACK_SETTING_ALL)
790  {
791  $fb = $this->object->feedbackOBJ->getSpecificAnswerFeedbackTestPresentation($this->object->getId(), $answer_id);
792  if(strlen($fb))
793  {
794  $template->setCurrentBlock("feedback");
795  $template->setVariable("FEEDBACK", $this->object->prepareTextareaOutput($fb, true));
796  $template->parseCurrentBlock();
797  }
798  }
799 
800  if($this->object->getSpecificFeedbackSetting() == ilAssConfigurableMultiOptionQuestionFeedback::FEEDBACK_SETTING_CORRECT)
801  {
802  $answer = $this->object->getAnswer($answer_id);
803 
804  if($answer->getCorrectness())
805  {
806  $fb = $this->object->feedbackOBJ->getSpecificAnswerFeedbackTestPresentation($this->object->getId(), $answer_id);
807  if(strlen($fb))
808  {
809  $template->setCurrentBlock("feedback");
810  $template->setVariable("FEEDBACK", $this->object->prepareTextareaOutput($fb, true));
811  $template->parseCurrentBlock();
812  }
813  }
814  }
815  }
816 
827  {
828  return array();
829  }
830 
841  {
842  return array();
843  }
844 
853  public function getAggregatedAnswersView($relevant_answers)
854  {
855  return $this->renderAggregateView(
856  $this->aggregateAnswers( $relevant_answers, $this->object->getAnswers() ) )->get();
857 
858  return '<pre>'.print_r($relevant_answers, 1).'</pre>';
859  }
860 
861  public function renderAggregateView($aggregate)
862  {
863  $trueOptionLabel = $this->object->getTrueOptionLabelTranslation($this->lng, $this->object->getOptionLabel());
864  $falseOptionLabel = $this->object->getFalseOptionLabelTranslation($this->lng, $this->object->getOptionLabel());
865 
866  $tpl = new ilTemplate('tpl.il_as_aggregated_kprim_answers_table.html', true, true, "Modules/TestQuestionPool");
867 
868  foreach( $aggregate as $lineData )
869  {
870  $tpl->setCurrentBlock('aggregaterow');
871  $tpl->setVariable('OPTION', $lineData['answertext']);
872  $tpl->setVariable('COUNT_TRUE', $lineData['count_true']);
873  $tpl->setVariable('COUNT_FALSE', $lineData['count_false']);
874  $tpl->parseCurrentBlock();
875  }
876 
877  $tpl->setVariable('OPTION_HEAD', $this->lng->txt('answers'));
878  $tpl->setVariable('COUNT_TRUE_HEAD', $trueOptionLabel);
879  $tpl->setVariable('COUNT_FALSE_HEAD', $falseOptionLabel);
880 
881  return $tpl;
882  }
883 
884  public function aggregateAnswers($rawSolutionData, $answers)
885  {
886  $aggregate = array();
887 
888  foreach( $answers as $answer )
889  {
890  $answerAgg = array(
891  'answertext' => $answer->getAnswerText(), 'count_true' => 0, 'count_false' => 0
892  );
893 
894  foreach( $rawSolutionData as $solutionRecord )
895  {
896  if( $solutionRecord['value1'] == $answer->getPosition() )
897  {
898  if( $solutionRecord['value2'] )
899  {
900  $answerAgg['count_true']++;
901  }
902  else
903  {
904  $answerAgg['count_false']++;
905  }
906  }
907 
908  }
909 
910  $aggregate[] = $answerAgg;
911  }
912 
913  return $aggregate;
914  }
915 
916 }
getSpecificFeedbackOutput($active_id, $pass)
writeQuestionSpecificPostData(ilPropertyFormGUI $form)
static prepareFormOutput($a_str, $a_strip=false)
prepares string output for html forms public
hasCorrectSolution($activeId, $passIndex)
This class represents an option in a radio group.
getAfterParticipationSuppressionQuestionPostVars()
Returns a list of postvars which will be suppressed in the form output when used in scoring adjustmen...
getSolutionOutput( $active_id, $pass=NULL, $graphicalOutput=FALSE, $result_output=FALSE, $show_question_only=TRUE, $show_feedback=FALSE, $show_correct_solution=FALSE, $show_manual_scoring=FALSE, $show_question_text=TRUE)
writePostData()
Evaluates a posted edit form and writes the form data in the question object.
addBasicQuestionFormProperties($form)
Add basic question form properties: assessment: title, author, description, question, working time.
$_POST['username']
Definition: cron.php:12
getItemByPostVar($a_post_var)
Get Item by POST variable.
This class represents a selection list property in a property form.
$result
This class represents a property form user interface.
getTestOutput( $active_id, $pass, $is_postponed=FALSE, $use_post_solutions=FALSE, $showInlineFeedback=FALSE)
getTestOutputSolutions($activeId, $pass)
This class represents a checkbox property in a property form.
addItem($a_item)
Add Item (Property, SectionHeader).
populateAnswerSpecificFormPart(ilPropertyFormGUI $form)
getQuestionTemplate()
get question template
populateTaxonomyFormSection(ilPropertyFormGUI $form)
setInfo($a_info)
Set Information Text.
setChecked($a_checked)
Set Checked.
This class represents a property in a property form.
setSuffix($a_value)
Set suffix.
getILIASPage($html="")
Returns the ILIAS Page around a question.
static getImagePath($img, $module_path="", $mode="output", $offline=false)
get image path (for images located in a template directory)
This class represents a number property in a property form.
special template class to simplify handling of ITX/PEAR
This class represents a text property in a property form.
writeAnswerSpecificPostData(ilPropertyFormGUI $form)
setOptions($a_options)
Set Options.
Basic GUI class for assessment questions.
static getHtmlPath($relative_path)
get url of path
getPreview($show_question_only=FALSE, $showInlineFeedback=false)
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.
getAggregatedAnswersView($relevant_answers)
Returns an html string containing a question specific representation of the answers so far given in t...
getAfterParticipationSuppressionAnswerPostVars()
Returns a list of postvars which will be suppressed in the form output when used in scoring adjustmen...
editQuestion(ilPropertyFormGUI $form=null)
static secureString($a_str, $a_strip_html=true, $a_allow="")
Remove unsecure tags.
Interface ilGuiAnswerScoringAdjustable.
outQuestionPage($a_temp_var, $a_postponed=false, $active_id="", $html="")
output question page
aggregateAnswers($rawSolutionData, $answers)
getGenericFeedbackOutput($active_id, $pass)
Returns the answer specific feedback for the question.
Interface ilGuiQuestionScoringAdjustable.
setValue($a_value)
Set Value.
populateSpecificFeedbackInline($user_solution, $answer_id, $template)
setRequired($a_required)
Set Required.
addQuestionFormCommandButtons($form)
Add the command buttons of a question properties form.
populateQuestionSpecificFormPart(ilPropertyFormGUI $form)