ILIAS  release_5-3 Revision v5.3.23-19-g915713cf615
class.assOrderingQuestionGUI.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';
7require_once './Modules/Test/classes/inc.AssessmentConstants.php';
8
24{
28 public $object;
29
30 public $old_ordering_depth = array();
31 public $leveled_ordering = array();
32
37
47 public function __construct($id = -1)
48 {
49 parent::__construct();
50 include_once "./Modules/TestQuestionPool/classes/class.assOrderingQuestion.php";
51 $this->object = new assOrderingQuestion();
52 if ($id >= 0) {
53 $this->object->loadFromDb($id);
54 }
55 $this->clearAnswersOnWritingPostDataEnabled = false;
56 }
57
62 {
63 $this->clearAnswersOnWritingPostDataEnabled = $clearAnswersOnWritingPostDataEnabled;
64 }
65
70 {
72 }
73
74 public function changeToPictures()
75 {
76 if ($this->object->getOrderingType() != OQ_NESTED_PICTURES && $this->object->getOrderingType() != OQ_PICTURES) {
78 }
79
80 $form = $this->buildEditForm();
81 $form->setValuesByPost();
83
84 $this->object->setOrderingType(OQ_PICTURES);
85 $this->object->saveToDb();
86
87 $form->ensureReprintableFormStructure($this->object);
88 $this->renderEditForm($form);
89 }
90
91 public function changeToText()
92 {
93 if ($this->object->getOrderingType() != OQ_NESTED_TERMS && $this->object->getOrderingType() != OQ_TERMS) {
95 }
96
97 $form = $this->buildEditForm();
98 $form->setValuesByPost();
100
101 $this->object->setOrderingType(OQ_TERMS);
102 $this->object->saveToDb();
103
104 $form->ensureReprintableFormStructure($this->object);
105 $this->renderEditForm($form);
106 }
107
108 public function orderNestedTerms()
109 {
110 $this->writePostData(true);
111 $this->object->setOrderingType(OQ_NESTED_TERMS);
112 $this->object->saveToDb();
113
114 $this->renderEditForm($this->buildEditForm());
115 }
116
117 public function orderNestedPictures()
118 {
119 $this->writePostData(true);
120 $this->object->setOrderingType(OQ_NESTED_PICTURES);
121 $this->object->saveToDb();
122
123 $this->renderEditForm($this->buildEditForm());
124 }
125
126 public function removeElementImage()
127 {
128 $orderingInput = $this->object->buildOrderingImagesInputGui();
129 $this->object->initOrderingElementAuthoringProperties($orderingInput);
130
131 $form = $this->buildEditForm();
132 $form->replaceFormItemByPostVar($orderingInput);
133 $form->setValuesByPost();
134
135 $replacementElemList = ilAssOrderingElementList::buildInstance(
136 $this->object->getId(),
137 array()
138 );
139
140 $storedElementList = $this->object->getOrderingElementList();
141
142 foreach ($orderingInput->getElementList($this->object->getId()) as $submittedElement) {
143 if ($submittedElement->isImageRemovalRequest()) {
144 if ($this->object->isImageFileStored($submittedElement->getContent())) {
145 $this->object->dropImageFile($submittedElement->getContent());
146 }
147
148 $submittedElement->setContent(null);
149 }
150
151 if ($storedElementList->elementExistByRandomIdentifier($submittedElement->getRandomIdentifier())) {
152 $storedElement = $storedElementList->getElementByRandomIdentifier(
153 $submittedElement->getRandomIdentifier()
154 );
155
156 $submittedElement->setSolutionIdentifier($storedElement->getSolutionIdentifier());
157 $submittedElement->setIndentation($storedElement->getIndentation());
158 }
159
160 $replacementElemList->addElement($submittedElement);
161 }
162
163 $replacementElemList->saveToDb();
164
165 $orderingInput->setElementList($replacementElemList);
166 $this->renderEditForm($form);
167 }
168
169 public function uploadElementImage()
170 {
171 $orderingInput = $this->object->buildOrderingImagesInputGui();
172 $this->object->initOrderingElementAuthoringProperties($orderingInput);
173
174 $form = $this->buildEditForm();
175 $form->replaceFormItemByPostVar($orderingInput);
176 $form->setValuesByPost();
177
178 if (!$orderingInput->checkInput()) {
179 ilUtil::sendFailure($this->lng->txt('form_input_not_valid'));
180 }
181
183 $this->object->getOrderingElementList()->saveToDb();
184 $orderingInput->setElementList($this->object->getOrderingElementList());
185
186 $this->renderEditForm($form);
187 }
188
190 {
191 $this->object->setThumbGeometry($_POST["thumb_geometry"]);
192 $this->object->setElementHeight($_POST["element_height"]);
193 //$this->object->setOrderingType( $_POST["ordering_type"] );
194 $this->object->setPoints($_POST["points"]);
195 }
196
198 {
200 throw new ilTestQuestionPoolException('form submit request missing the form submit!?');
201 }
202
203 #$submittedElementList = $this->object->fetchSolutionListFromFormSubmissionData($_POST);
204 $submittedElementList = $this->object->fetchSolutionListFromSubmittedForm($form);
205
206 $replacementElementList = new ilAssOrderingElementList();
207 $replacementElementList->setQuestionId($this->object->getId());
208
209 $currentElementList = $this->object->getOrderingElementList();
210
211 foreach ($submittedElementList as $submittedElement) {
212 if ($this->object->hasOrderingTypeUploadSupport()) {
213 if ($submittedElement->isImageUploadAvailable()) {
214 $suffix = strtolower(array_pop(explode(".", $submittedElement->getUploadImageName())));
215 if (in_array($suffix, array("jpg", "jpeg", "png", "gif"))) {
216 $submittedElement->setUploadImageName($this->object->buildHashedImageFilename(
217 $submittedElement->getUploadImageName(),
218 true
219 ));
220
221 $wasImageFileStored = $this->object->storeImageFile(
222 $submittedElement->getUploadImageFile(),
223 $submittedElement->getUploadImageName()
224 );
225
226 if ($wasImageFileStored) {
227 if ($this->object->isImageFileStored($submittedElement->getContent())) {
228 $this->object->dropImageFile($submittedElement->getContent());
229 }
230
231 $submittedElement->setContent($submittedElement->getUploadImageName());
232 }
233 }
234 }
235 }
236
237 if ($currentElementList->elementExistByRandomIdentifier($submittedElement->getRandomIdentifier())) {
238 $storedElement = $currentElementList->getElementByRandomIdentifier(
239 $submittedElement->getRandomIdentifier()
240 );
241
242 $submittedElement->setSolutionIdentifier($storedElement->getSolutionIdentifier());
243
244 if ($this->isAdjustmentEditContext() || $this->object->isOrderingTypeNested()) {
245 $submittedElement->setContent($storedElement->getContent());
246 }
247
248 if (!$this->object->isOrderingTypeNested()) {
249 $submittedElement->setIndentation($storedElement->getIndentation());
250 }
251
252 if ($this->object->isImageReplaced($submittedElement, $storedElement)) {
253 $this->object->dropImageFile($storedElement->getContent());
254 }
255 }
256
257 $replacementElementList->addElement($submittedElement);
258 }
259
260 if ($this->object->isImageOrderingType()) {
261 $this->object->handleThumbnailCreation($replacementElementList);
262 }
263
265 $replacementElementList->clearElementContents();
266 }
267
268 if ($this->object->hasOrderingTypeUploadSupport()) {
269 $obsoleteElementList = $currentElementList->getDifferenceElementList($replacementElementList);
270
271 foreach ($obsoleteElementList as $obsoleteElement) {
272 $this->object->dropImageFile($obsoleteElement->getContent());
273 }
274 }
275
276 $this->object->setOrderingElementList($replacementElementList);
277 }
278
280 {
282 $header->setTitle($this->lng->txt('oq_header_ordering_elements'));
283 $form->addItem($header);
284
285 if ($this->isAdjustmentEditContext()) {
286 $orderingElementInput = $this->object->buildNestedOrderingElementInputGui();
287 } else {
288 $orderingElementInput = $this->object->buildOrderingElementInputGui();
289 }
290
291 $orderingElementInput->setStylingDisabled($this->isRenderPurposePrintPdf());
292 $this->object->initOrderingElementAuthoringProperties($orderingElementInput);
293
294 $orderingElementInput->setElementList($this->object->getOrderingElementList());
295
296 $form->addItem($orderingElementInput);
297
298 return $form;
299 }
300
302 {
303 if (!$this->object->getSelfAssessmentEditingMode()) {
304 $element_height = new ilNumberInputGUI($this->lng->txt("element_height"), "element_height");
305 $element_height->setValue($this->object->getElementHeight());
306 $element_height->setRequired(false);
307 $element_height->setMaxLength(6);
308 $element_height->setMinValue(20);
309 $element_height->setSize(6);
310 $element_height->setInfo($this->lng->txt("element_height_info"));
311 $form->addItem($element_height);
312 }
313
314 if ($this->object->isImageOrderingType()) {
315 $geometry = new ilNumberInputGUI($this->lng->txt("thumb_geometry"), "thumb_geometry");
316 $geometry->setValue($this->object->getThumbGeometry());
317 $geometry->setRequired(true);
318 $geometry->setMaxLength(6);
319 $geometry->setMinValue(20);
320 $geometry->setSize(6);
321 $geometry->setInfo($this->lng->txt("thumb_geometry_info"));
322 $form->addItem($geometry);
323 }
324
325 // points
326 $points = new ilNumberInputGUI($this->lng->txt("points"), "points");
327 $points->allowDecimals(true);
328 $points->setValue($this->object->getPoints());
329 $points->setRequired(true);
330 $points->setSize(3);
331 $points->setMinValue(0);
332 $points->setMinvalueShouldBeGreater(true);
333 $form->addItem($points);
334
335 return $form;
336 }
337
341 protected function writePostData($forceSaving = false)
342 {
343 $savingAllowed = true; // assume saving allowed first
344
345 if (!$forceSaving) {
346 // this case seems to be a regular save call, so we consider
347 // the validation result for the decision of saving as well
348
349 // inits {this->editForm} and performs validation
350 $form = $this->buildEditForm();
351 $form->setValuesByPost(); // manipulation and distribution of values
352
353 if (!$form->checkInput()) { // manipulations regular style input propeties
354 $form->prepareValuesReprintable($this->object);
355 $this->renderEditForm($form);
356
357 // consequence of vaidation
358 $savingAllowed = false;
359 }
360 } elseif (!$this->isSaveCommand()) {
361 // this case handles form workflow actions like the mode/view switching requests,
362 // so saving must not be skipped, even for inputs invalid by business rules
363
364 $form = $this->buildEditForm();
365 $form->setValuesByPost(); // manipulation and distribution of values
366 $form->checkInput(); // manipulations regular style input propeties
367 }
368
369 if ($savingAllowed) {
371
372 return 0; // return 0 = all fine, was saved either forced or validated
373 }
374
375 return 1; // return 1 = something went wrong, no saving happened
376 }
377
381 public function editQuestion($checkonly = false)
382 {
383 $this->renderEditForm($this->buildEditForm());
384 }
385
389 protected function buildEditForm()
390 {
391 require_once 'Modules/TestQuestionPool/classes/forms/class.ilAssOrderingQuestionAuthoringFormGUI.php';
393 $this->editForm = $form;
394
395 $form->setFormAction($this->ctrl->getFormAction($this));
396 $form->setTitle($this->outQuestionType());
397 $form->setMultipart(($this->object->getOrderingType() == OQ_PICTURES) ? true : false);
398 $form->setTableWidth("100%");
399 $form->setId("ordering");
400 // title, author, description, question, working time (assessment mode)
404
406
407 $form->addSpecificOrderingQuestionCommandButtons($this->object);
408 $form->addGenericAssessmentQuestionCommandButtons($this->object);
409
410 return $form;
411 }
412
428 public function getSolutionOutput(
429 $active_id,
430 $pass = null,
431 $graphicalOutput = false,
432 $result_output = false,
433 $show_question_only = true,
434 $show_feedback = false,
435 $forceCorrectSolution = false,
436 $show_manual_scoring = false,
437 $show_question_text = true
438 ) {
439 $solutionOrderingList = $this->object->getOrderingElementListForSolutionOutput(
440 $forceCorrectSolution,
441 $active_id,
442 $pass
443 );
444
445 $answers_gui = $this->object->buildNestedOrderingElementInputGui();
446
447 if ($forceCorrectSolution) {
449 } else {
451 }
452
453 $answers_gui->setInteractionEnabled(false);
454
455 $answers_gui->setElementList($solutionOrderingList);
456
457 $answers_gui->setCorrectnessTrueElementList(
458 $solutionOrderingList->getParityTrueElementList($this->object->getOrderingElementList())
459 );
460
461 $solution_html = $answers_gui->getHTML();
462
463 $template = new ilTemplate("tpl.il_as_qpl_nested_ordering_output_solution.html", true, true, "Modules/TestQuestionPool");
464 $template->setVariable('SOLUTION_OUTPUT', $solution_html);
465 if ($show_question_text==true) {
466 $template->setVariable("QUESTIONTEXT", $this->object->prepareTextareaOutput($this->object->getQuestion(), true));
467 }
468 $questionoutput = $template->get();
469
470 $solutiontemplate = new ilTemplate("tpl.il_as_tst_solution_output.html", true, true, "Modules/TestQuestionPool");
471 $solutiontemplate->setVariable("SOLUTION_OUTPUT", $questionoutput);
472
473 if ($show_feedback) {
474 $feedback = '';
475
476 if (!$this->isTestPresentationContext()) {
477 $fb = $this->getGenericFeedbackOutput($active_id, $pass);
478 $feedback .= strlen($fb) ? $fb : '';
479 }
480
481 $fb = $this->getSpecificFeedbackOutput($active_id, $pass);
482 $feedback .= strlen($fb) ? $fb : '';
483
484 if (strlen($feedback)) {
485 $cssClass = (
486 $this->hasCorrectSolution($active_id, $pass) ?
488 );
489
490 $solutiontemplate->setVariable("ILC_FB_CSS_CLASS", $cssClass);
491 $solutiontemplate->setVariable("FEEDBACK", $this->object->prepareTextareaOutput($feedback, true));
492 }
493 }
494
495 if ($show_question_only) {
496 return $solutiontemplate->get();
497 }
498
499 return $this->getILIASPage($solutiontemplate->get());
500
501 // is this template still in use? it is not used at this point any longer!
502 // $template = new ilTemplate("tpl.il_as_qpl_ordering_output_solution.html", TRUE, TRUE, "Modules/TestQuestionPool");
503 }
504
505 public function getPreview($show_question_only = false, $showInlineFeedback = false)
506 {
507 if ($this->getPreviewSession() && $this->getPreviewSession()->hasParticipantSolution()) {
508 $solutionOrderingElementList = unserialize(
509 $this->getPreviewSession()->getParticipantsSolution()
510 );
511 } else {
512 $solutionOrderingElementList = $this->object->getShuffledOrderingElementList();
513 }
514
515 $answers = $this->object->buildNestedOrderingElementInputGui();
516 $answers->setNestingEnabled($this->object->isOrderingTypeNested());
518 $answers->setInteractionEnabled($this->isInteractivePresentation());
519 $answers->setElementList($solutionOrderingElementList);
520
521 $template = new ilTemplate("tpl.il_as_qpl_ordering_output.html", true, true, "Modules/TestQuestionPool");
522
523 $template->setCurrentBlock('nested_ordering_output');
524 $template->setVariable('NESTED_ORDERING', $answers->getHTML());
525 $template->parseCurrentBlock();
526
527 $template->setVariable("QUESTIONTEXT", $this->object->prepareTextareaOutput($this->object->getQuestion(), true));
528
529 if ($show_question_only) {
530 return $template->get();
531 }
532
533 return $this->getILIASPage($template->get());
534
535 //$this->tpl->addJavascript("./Modules/TestQuestionPool/templates/default/ordering.js");
536 }
537
538 // hey: prevPassSolutions - pass will be always available from now on
539 public function getTestOutput($activeId, $pass, $isPostponed = false, $userSolutionPost = false, $inlineFeedback = false)
540 // hey.
541 {
542 // hey: prevPassSolutions - fixed variable type, makes phpstorm stop crying
543 $userSolutionPost = is_array($userSolutionPost) ? $userSolutionPost : array();
544 // hey.
545
546 $orderingGUI = $this->object->buildNestedOrderingElementInputGui();
547 $orderingGUI->setNestingEnabled($this->object->isOrderingTypeNested());
548
549 $solutionOrderingElementList = $this->object->getSolutionOrderingElementListForTestOutput(
550 $orderingGUI,
551 $userSolutionPost,
552 $activeId,
553 $pass
554 );
555
556 $template = new ilTemplate('tpl.il_as_qpl_ordering_output.html', true, true, 'Modules/TestQuestionPool');
557
559 $orderingGUI->setElementList($solutionOrderingElementList);
560
561 $template->setCurrentBlock('nested_ordering_output');
562 $template->setVariable('NESTED_ORDERING', $orderingGUI->getHTML());
563 $template->parseCurrentBlock();
564
565 $template->setVariable('QUESTIONTEXT', $this->object->prepareTextareaOutput($this->object->getQuestion(), true));
566
567 $pageoutput = $this->outQuestionPage('', $isPostponed, $activeId, $template->get());
568
569 return $pageoutput;
570 }
571
572 protected function isInteractivePresentation()
573 {
574 if ($this->isRenderPurposePlayback()) {
575 return true;
576 }
577
578 if ($this->isRenderPurposeDemoplay()) {
579 return true;
580 }
581
582 return false;
583 }
584
592 public function setQuestionTabs()
593 {
594 global $rbacsystem, $ilTabs;
595
596 $ilTabs->clearTargets();
597
598 $this->ctrl->setParameterByClass("ilAssQuestionPageGUI", "q_id", $_GET["q_id"]);
599 include_once "./Modules/TestQuestionPool/classes/class.assQuestion.php";
600 $q_type = $this->object->getQuestionType();
601
602 if (strlen($q_type)) {
603 $classname = $q_type . "GUI";
604 $this->ctrl->setParameterByClass(strtolower($classname), "sel_question_types", $q_type);
605 $this->ctrl->setParameterByClass(strtolower($classname), "q_id", $_GET["q_id"]);
606 }
607
608 if ($_GET["q_id"]) {
609 if ($rbacsystem->checkAccess('write', $_GET["ref_id"])) {
610 // edit page
611 $ilTabs->addTarget(
612 "edit_page",
613 $this->ctrl->getLinkTargetByClass("ilAssQuestionPageGUI", "edit"),
614 array("edit", "insert", "exec_pg"),
615 "",
616 "",
617 false
618 );
619 }
620
621 $this->addTab_QuestionPreview($ilTabs);
622 }
623
624 $force_active = false;
625 if ($rbacsystem->checkAccess('write', $_GET["ref_id"])) {
626 $url = "";
627 if ($classname) {
628 $url = $this->ctrl->getLinkTargetByClass($classname, "editQuestion");
629 }
630 $commands = $_POST["cmd"];
631 if (is_array($commands)) {
632 foreach ($commands as $key => $value) {
633 if (preg_match("/^delete_.*/", $key, $matches)) {
634 $force_active = true;
635 }
636 }
637 }
638 // edit question properties
639 $ilTabs->addTarget(
640 "edit_question",
641 $url,
642 array("orderNestedTerms","orderNestedPictures","editQuestion", "save", "saveEdit", "addanswers", "removeanswers", "changeToPictures", "uploadElementImage", "changeToText", "upanswers", "downanswers", "originalSyncForm"),
643 $classname,
644 "",
645 $force_active
646 );
647 }
648
649 // add tab for question feedback within common class assQuestionGUI
650 $this->addTab_QuestionFeedback($ilTabs);
651
652 // add tab for question hint within common class assQuestionGUI
653 $this->addTab_QuestionHints($ilTabs);
654
655 // add tab for question's suggested solution within common class assQuestionGUI
656 $this->addTab_SuggestedSolution($ilTabs, $classname);
657
658 // Assessment of questions sub menu entry
659 if ($_GET["q_id"]) {
660 $ilTabs->addTarget(
661 "statistics",
662 $this->ctrl->getLinkTargetByClass($classname, "assessment"),
663 array("assessment"),
664 $classname,
665 ""
666 );
667 }
668
669 $this->addBackTab($ilTabs);
670 }
671
672 public function getSpecificFeedbackOutput($active_id, $pass)
673 {
674 if (!$this->object->feedbackOBJ->specificAnswerFeedbackExists($this->object->getOrderingElementList())) {
675 return '';
676 }
677
678 $tpl = new ilTemplate('tpl.il_as_qpl_ordering_elem_fb.html', true, true, 'Modules/TestQuestionPool');
679
680 foreach ($this->object->getOrderingElementList() as $element) {
681 $feedback = $this->object->feedbackOBJ->getSpecificAnswerFeedbackTestPresentation(
682 $this->object->getId(),
683 $element->getPosition()
684 );
685
686 if ($this->object->isImageOrderingType()) {
687 $imgSrc = $this->object->getImagePathWeb() . $element->getContent();
688 $tpl->setCurrentBlock('image');
689 $tpl->setVariable('IMG_SRC', $imgSrc);
690 } else {
691 $tpl->setCurrentBlock('text');
692 }
693 $tpl->setVariable('CONTENT', $element->getContent());
694 $tpl->parseCurrentBlock();
695
696 $tpl->setCurrentBlock('element');
697 $tpl->setVariable('FEEDBACK', $feedback);
698 $tpl->parseCurrentBlock();
699 }
700
701 return $this->object->prepareTextareaOutput($tpl->get(), true);
702 }
703
708 protected function persistAuthoringForm($form)
709 {
714 }
715
716 private function getOldLeveledOrdering()
717 {
718 global $ilDB;
719
720 $res = $ilDB->queryF(
721 'SELECT depth FROM qpl_a_ordering WHERE question_fi = %s ORDER BY solution_key ASC',
722 array('integer'),
723 array($this->object->getId())
724 );
725 while ($row = $ilDB->fetchAssoc($res)) {
726 $this->old_ordering_depth[] = $row['depth'];
727 }
729 }
730
741 {
742 return array();
743 }
744
755 {
756 return array();
757 }
758
767 public function getAggregatedAnswersView($relevant_answers)
768 {
769 $aggView = $this->aggregateAnswers(
770 $relevant_answers,
771 $this->object->getOrderingElementList()
772 );
773
774 return $this->renderAggregateView($aggView)->get();
775 }
776
777 public function aggregateAnswers($relevant_answers_chosen, $answers_defined_on_question)
778 {
779 $passdata = array(); // Regroup answers into units of passes.
780 foreach ($relevant_answers_chosen as $answer_chosen) {
781 $passdata[$answer_chosen['active_fi'] . '-' . $answer_chosen['pass']][$answer_chosen['value2']] = $answer_chosen['value1'];
782 }
783
784 $variants = array(); // Determine unique variants.
785 foreach ($passdata as $key => $data) {
786 $hash = md5(implode('-', $data));
787 $value_set = false;
788 foreach ($variants as $vkey => $variant) {
789 if ($variant['hash'] == $hash) {
790 $variant['count']++;
791 $value_set = true;
792 }
793 }
794 if (!$value_set) {
795 $variants[$key]['hash'] = $hash;
796 $variants[$key]['count'] = 1;
797 }
798 }
799
800 $aggregate = array(); // Render aggregate from variant.
801 foreach ($variants as $key => $variant_entry) {
802 $variant = $passdata[$key];
803
804 foreach ($variant as $variant_key => $variant_line) {
805 $i = 0;
806 $aggregated_info_for_answer['count'] = $variant_entry['count'];
807 foreach ($answers_defined_on_question as $element) {
808 $i++;
809
810 if ($this->object->isImageOrderingType()) {
811 $element->setImageThumbnailPrefix($this->object->getThumbPrefix());
812 $element->setImagePathWeb($this->object->getImagePathWeb());
813 $element->setImagePathFs($this->object->getImagePath());
814
815 $src = $element->getPresentationImageUrl();
816 $alt = $element->getContent();
817 $content = "<img src='{$src}' alt='{$alt}' title='{$alt}'/>";
818 } else {
819 $content = $element->getContent();
820 }
821
822 $aggregated_info_for_answer[$i . ' - ' . $content]
823 = $passdata[$key][$i];
824 }
825 }
826 $aggregate[] = $aggregated_info_for_answer;
827 }
828 return $aggregate;
829 }
830
836 public function renderAggregateView($aggregate)
837 {
838 $tpl = new ilTemplate('tpl.il_as_aggregated_answers_table.html', true, true, "Modules/TestQuestionPool");
839
840 foreach ($aggregate as $line_data) {
841 $tpl->setCurrentBlock('aggregaterow');
842 $count = array_shift($line_data);
843 $html = '<ul>';
844 foreach ($line_data as $key => $line) {
845 $html .= '<li>' . ++$line . '&nbsp;-&nbsp;' . $key . '</li>';
846 }
847 $html .= '</ul>';
848 $tpl->setVariable('COUNT', $count);
849 $tpl->setVariable('OPTION', $html);
850
851 $tpl->parseCurrentBlock();
852 }
853 return $tpl;
854 }
855}
$_GET["client_id"]
$_POST["username"]
An exception for terminatinating execution or to throw for unit testing.
Ordering question GUI representation.
setQuestionTabs()
Sets the ILIAS tabs for this question type.
getPreview($show_question_only=false, $showInlineFeedback=false)
__construct($id=-1)
assOrderingQuestionGUI constructor
getSolutionOutput( $active_id, $pass=null, $graphicalOutput=false, $result_output=false, $show_question_only=true, $show_feedback=false, $forceCorrectSolution=false, $show_manual_scoring=false, $show_question_text=true)
Get the question solution output.
writeQuestionSpecificPostData(ilPropertyFormGUI $form)
Extracts the question specific values from $_POST and applies them to the data object.
populateAnswerSpecificFormPart(ilPropertyFormGUI $form)
Adds the answer specific form parts to a question property form gui.
aggregateAnswers($relevant_answers_chosen, $answers_defined_on_question)
getSpecificFeedbackOutput($active_id, $pass)
Returns the answer specific feedback for the question.
getAfterParticipationSuppressionAnswerPostVars()
Returns a list of postvars which will be suppressed in the form output when used in scoring adjustmen...
writeAnswerSpecificPostData(ilPropertyFormGUI $form)
Extracts the answer specific values from $_POST and applies them to the data object.
populateQuestionSpecificFormPart(\ilPropertyFormGUI $form)
editQuestion($checkonly=false)
Creates an output of the edit form for the question.
setClearAnswersOnWritingPostDataEnabled($clearAnswersOnWritingPostDataEnabled)
writePostData($forceSaving=false)
{Evaluates a posted edit form and writes the form data in the question object.integer A positive valu...
getAggregatedAnswersView($relevant_answers)
Returns an html string containing a question specific representation of the answers so far given in t...
getAfterParticipationSuppressionQuestionPostVars()
Returns a list of postvars which will be suppressed in the form output when used in scoring adjustmen...
getTestOutput($activeId, $pass, $isPostponed=false, $userSolutionPost=false, $inlineFeedback=false)
Class for ordering questions.
Basic GUI class for assessment questions.
populateTaxonomyFormSection(ilPropertyFormGUI $form)
addTab_QuestionHints(ilTabsGUI $tabs)
adds the hints tab to ilTabsGUI
getILIASPage($html="")
Returns the ILIAS Page around a question.
addTab_SuggestedSolution(ilTabsGUI $tabs, $classname)
outQuestionPage($a_temp_var, $a_postponed=false, $active_id="", $html="")
output question page
addBackTab(ilTabsGUI $ilTabs)
hasCorrectSolution($activeId, $passIndex)
addTab_QuestionFeedback(ilTabsGUI $tabs)
adds the feedback tab to ilTabsGUI
addBasicQuestionFormProperties($form)
Add basic question form properties: assessment: title, author, description, question,...
addTab_QuestionPreview(ilTabsGUI $tabsGUI)
getGenericFeedbackOutput($active_id, $pass)
Returns the answer specific feedback for the question.
static buildInstance($questionId, $orderingElements=array())
This class represents a section header in a property form.
This class represents a number property in a property form.
This class represents a property form user interface.
special template class to simplify handling of ITX/PEAR
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.
$template
$key
Definition: croninfo.php:18
$i
Definition: disco.tpl.php:19
$html
Definition: example_001.php:87
if(!array_key_exists('StateId', $_REQUEST)) $id
const OQ_NESTED_PICTURES
const OQ_TERMS
const OQ_NESTED_TERMS
const OQ_PICTURES
Ordering question constants.
Interface ilGuiAnswerScoringAdjustable.
Interface ilGuiQuestionScoringAdjustable.
$url
if(isset($_POST['submit'])) $form
foreach($_POST as $key=> $value) $res
global $ilDB