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
4require_once 'Modules/TestQuestionPool/classes/class.assQuestionGUI.php';
5require_once 'Modules/TestQuestionPool/interfaces/interface.ilGuiQuestionScoringAdjustable.php';
6require_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
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
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
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
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
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}
$result
populateSpecificFeedbackInline($user_solution, $answer_id, $template)
getPreview($show_question_only=FALSE, $showInlineFeedback=false)
getAfterParticipationSuppressionQuestionPostVars()
Returns a list of postvars which will be suppressed in the form output when used in scoring adjustmen...
writeAnswerSpecificPostData(ilPropertyFormGUI $form)
getAfterParticipationSuppressionAnswerPostVars()
Returns a list of postvars which will be suppressed in the form output when used in scoring adjustmen...
getTestOutput( $active_id, $pass, $is_postponed=FALSE, $use_post_solutions=FALSE, $showInlineFeedback=FALSE)
getAggregatedAnswersView($relevant_answers)
Returns an html string containing a question specific representation of the answers so far given in t...
writeQuestionSpecificPostData(ilPropertyFormGUI $form)
editQuestion(ilPropertyFormGUI $form=null)
getSpecificFeedbackOutput($active_id, $pass)
aggregateAnswers($rawSolutionData, $answers)
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)
populateAnswerSpecificFormPart(ilPropertyFormGUI $form)
populateQuestionSpecificFormPart(ilPropertyFormGUI $form)
Basic GUI class for assessment questions.
populateTaxonomyFormSection(ilPropertyFormGUI $form)
addQuestionFormCommandButtons($form)
Add the command buttons of a question properties form.
getILIASPage($html="")
Returns the ILIAS Page around a question.
getQuestionTemplate()
get question template
writePostData()
Evaluates a posted edit form and writes the form data in the question object.
getTestOutputSolutions($activeId, $pass)
outQuestionPage($a_temp_var, $a_postponed=false, $active_id="", $html="")
output question page
hasCorrectSolution($activeId, $passIndex)
addBasicQuestionFormProperties($form)
Add basic question form properties: assessment: title, author, description, question,...
getGenericFeedbackOutput($active_id, $pass)
Returns the answer specific feedback for the question.
This class represents a checkbox property in a property form.
This class represents a number property in a property form.
This class represents a property form user interface.
addItem($a_item)
Add Item (Property, SectionHeader).
getItemByPostVar($a_post_var)
Get Item by POST variable.
This class represents a property in a property form.
This class represents an option in a radio group.
This class represents a selection list property in a property form.
special template class to simplify handling of ITX/PEAR
This class represents a text property in a property form.
static secureString($a_str, $a_strip_html=true, $a_allow="")
Remove unsecure tags.
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.
static getHtmlPath($relative_path)
get url of path
static getImagePath($img, $module_path="", $mode="output", $offline=false)
get image path (for images located in a template directory)
static prepareFormOutput($a_str, $a_strip=false)
prepares string output for html forms @access public
$_POST['username']
Definition: cron.php:12
Interface ilGuiAnswerScoringAdjustable.
Interface ilGuiQuestionScoringAdjustable.