ILIAS  trunk Revision v11.0_alpha-1753-gb21ca8c4367
All Data Structures Namespaces Files Functions Variables Enumerations Enumerator Modules Pages
class.assOrderingQuestionGUI.php
Go to the documentation of this file.
1 <?php
2 
35 {
36  public const CMD_EDIT_NESTING = 'editNesting';
37  public const CMD_SAVE_NESTING = 'saveNesting';
38  public const CMD_SWITCH_TO_TERMS = 'changeToText';
39  public const CMD_SWITCH_TO_PICTURESS = 'changeToPictures';
40 
41  public const TAB_EDIT_QUESTION = 'edit_question';
42  public const TAB_EDIT_NESTING = 'edit_nesting';
43 
44  public const F_USE_NESTED = 'nested_answers';
45  public const F_NESTED_ORDER = 'order_elems';
46  public const F_NESTED_ORDER_ORDER = 'content';
47  public const F_NESTED_ORDER_INDENT = 'indentation';
49 
51 
52  public $old_ordering_depth = [];
53  public $leveled_ordering = [];
54 
62  public function __construct($id = -1)
63  {
65  $this->object = new assOrderingQuestion();
66  if ($id >= 0) {
67  $this->object->loadFromDb($id);
68  }
69  }
70 
71  public function changeToPictures(): void
72  {
73  $this->object->setContentType($this->object::OQ_CT_PICTURES);
74  $this->object->saveToDb();
75 
76  $values = $this->request_data_collector->getParsedBody();
77  $values['thumb_geometry'] = $this->object->getThumbSize();
78  $this->buildEditFormAfterTypeChange($values);
79  }
80 
81  public function changeToText(): void
82  {
83  $ordering_element_list = $this->object->getOrderingElementList();
84  foreach ($ordering_element_list as $element) {
85  $this->object->dropImageFile($element->getContent());
86  }
87 
88  $this->object->setContentType($this->object::OQ_CT_TERMS);
89  $this->object->saveToDb();
90 
91  $this->buildEditFormAfterTypeChange($this->request_data_collector->getParsedBody());
92  }
93 
94  private function buildEditFormAfterTypeChange(array $values): void
95  {
96  $form = $this->buildEditForm();
97 
98  $ordering_element_list = $this->object->getOrderingElementList();
99  $ordering_element_list->resetElements();
100 
102  $form->setValuesByArray($values);
103  $form->getItemByPostVar(assOrderingQuestion::ORDERING_ELEMENT_FORM_FIELD_POSTVAR)->setElementList($ordering_element_list);
104  $this->renderEditForm($form);
105  $this->addEditSubtabs();
106  }
107 
108  public function saveNesting()
109  {
110  $form = $this->buildNestingForm();
111  $form->setValuesByPost();
112  if ($form->checkInput()) {
113  $post = $this->request_data_collector->raw(self::F_NESTED_ORDER);
114  $list = $this->object->getOrderingElementList();
115 
116  $ordered = [];
117  foreach (array_keys($post[self::F_NESTED_ORDER_ORDER]) as $idx => $identifier) {
118  $element_identifier = str_replace(self::F_NESTED_IDENTIFIER_PREFIX, '', $identifier);
119  $element = $list->getElementByRandomIdentifier($element_identifier);
120 
121  $ordered[] = $element
122  ->withPosition($idx)
123  ->withIndentation($post[self::F_NESTED_ORDER_INDENT][$identifier]);
124  }
125 
126  $list = $list->withElements($ordered);
127  $this->object->setOrderingElementList($list);
128  $this->tpl->setOnScreenMessage('success', $this->lng->txt('saved_successfully'), true);
129  } else {
130  $this->tpl->setOnScreenMessage('error', $this->lng->txt('form_input_not_valid'), true);
131  }
132 
133  $this->editNesting();
134  }
135 
136 
137  public function removeElementImage()
138  {
139  $this->uploadElementImage();
140  }
141 
142  public function uploadElementImage(): void
143  {
144  $form = $this->buildEditForm();
145  $form->setValuesByPost();
146 
147  $submitted_list = $this->fetchSolutionListFromSubmittedForm($form);
148 
149  $elements = [];
150  foreach ($submitted_list->getElements() as $submitted_element) {
151  if ($submitted_element->isImageUploadAvailable()) {
152  $filename = $this->object->storeImageFile(
153  $submitted_element->getUploadImageFile(),
154  $submitted_element->getUploadImageName()
155  );
156 
157  if (is_null($filename)) {
158  $this->tpl->setOnScreenMessage('failure', $this->lng->txt('file_no_valid_file_type'));
159  } else {
160  $submitted_element = $submitted_element->withContent($filename);
161  }
162  }
163 
164  if ($submitted_element->isImageRemovalRequest()) {
165  $this->object->dropImageFile($submitted_element->getContent());
166  $submitted_element = $submitted_element->withContent('');
167  }
168 
169  $elements[] = $submitted_element;
170  }
171 
172  $list = $this->object->getOrderingElementList()->withElements($elements);
173  $this->object->setOrderingElementList($list);
174 
176  $this->writeQuestionSpecificPostData($form);
177 
178  $this->editQuestion();
179  }
180 
182  {
183  $thumb_size = $this->request_data_collector->int('thumb_geometry');
184  if ($thumb_size !== 0
185  && $thumb_size !== $this->object->getThumbSize()) {
186  $this->object->setThumbSize($thumb_size);
187  $this->updateImageFiles();
188  }
189 
190  $this->object->setPoints($this->request_data_collector->float('points'));
191 
192  $use_nested = $this->request_data_collector->int(self::F_USE_NESTED) === 1;
193  $this->object->setNestingType($use_nested);
194  }
195 
196 
198  {
200  ->getElementList($this->object->getId());
201 
202  $use_nested = $this->request_data_collector->int(self::F_USE_NESTED) === 1;
203 
204  if ($use_nested) {
205  $existing_list = $this->object->getOrderingElementList();
206 
207  $nu = [];
208  $parent_indent = -1;
209  foreach ($list->getElements() as $element) {
210  $element = $list->ensureValidIdentifiers($element);
211 
212  if ($existing = $existing_list->getElementByRandomIdentifier($element->getRandomIdentifier())) {
213  if ($existing->getIndentation() == $parent_indent + 1) {
214  $element = $element
215  ->withIndentation($existing->getIndentation());
216  }
217  }
218  $parent_indent = $element->getIndentation();
219  $nu[] = $element;
220  }
221  $list = $list->withElements($nu);
222  }
223 
224  return $list;
225  }
226 
227  protected function updateImageFiles(): void
228  {
229  $element_list = $this->object->getOrderingElementList();
230  $elements = [];
231  foreach ($element_list->getElements() as $element) {
232  if ($element->getContent() === '') {
233  continue;
234  }
235  $filename = $this->object->updateImageFile(
236  $element->getContent()
237  );
238 
239  $elements[] = $element->withContent($filename);
240  }
241 
242  $list = $this->object->getOrderingElementList()->withElements($elements);
243  $this->object->setOrderingElementList($list);
244  }
245 
246  public function writeAnswerSpecificPostData(ilPropertyFormGUI $form): void
247  {
248  $this->object->setOrderingElementList(
250  );
251  }
252 
254  {
255  $header = new ilFormSectionHeaderGUI();
256  $header->setTitle($this->lng->txt('oq_header_ordering_elements'));
257  $form->addItem($header);
258 
259  $orderingElementInput = $this->object->buildOrderingElementInputGui();
260  $orderingElementInput->setStylingDisabled($this->isRenderPurposePrintPdf());
261  $this->object->initOrderingElementAuthoringProperties($orderingElementInput);
262 
263  $list = $this->object->getOrderingElementList();
264  $orderingElementInput->setElementList($list);
265  $form->addItem($orderingElementInput);
266 
267  return $form;
268  }
269 
271  {
272  if ($this->object->isImageOrderingType()) {
273  $thumb_size = new ilNumberInputGUI($this->lng->txt('thumb_size'), 'thumb_geometry');
274  $thumb_size->setValue($this->object->getThumbSize());
275  $thumb_size->setRequired(true);
276  $thumb_size->setMaxLength(6);
277  $thumb_size->setMinValue($this->object->getMinimumThumbSize());
278  $thumb_size->setMaxValue($this->object->getMaximumThumbSize());
279  $thumb_size->setSize(6);
280  $thumb_size->setInfo($this->lng->txt('thumb_size_info'));
281  $form->addItem($thumb_size);
282  }
283 
284  // points
285  $points = new ilNumberInputGUI($this->lng->txt("points"), "points");
286  $points->allowDecimals(true);
287  $points->setValue($this->object->getPoints());
288  $points->setRequired(true);
289  $points->setSize(3);
290  $points->setMinValue(0);
291  $points->setMinvalueShouldBeGreater(true);
292  $form->addItem($points);
293 
294  if (!$this->isInLearningModuleContext()) {
295  $nested_answers = new ilSelectInputGUI(
296  $this->lng->txt('qst_use_nested_answers'),
297  self::F_USE_NESTED
298  );
299  $nested_answers_options = [
300  0 => $this->lng->txt('qst_nested_nested_answers_off'),
301  1 => $this->lng->txt('qst_nested_nested_answers_on')
302  ];
303  $nested_answers->setOptions($nested_answers_options);
304  $nested_answers->setValue($this->object->isOrderingTypeNested());
305  $form->addItem($nested_answers);
306  }
307 
308  return $form;
309  }
310 
311  protected function writePostData(bool $always = false): int
312  {
313  $form = $this->buildEditForm();
314  $form->setValuesByPost();
315 
316  if (!$form->checkInput()) {
317  $this->renderEditForm($form);
318  $this->addEditSubtabs(self::TAB_EDIT_QUESTION);
319  return 1; // return 1 = something went wrong, no saving happened
320  }
321 
322  $this->saveTaxonomyAssignments();
324  $this->writeAnswerSpecificPostData($form);
325  $this->writeQuestionSpecificPostData($form);
326 
327  return 0; // return 0 = all fine, was saved either forced or validated
328  }
329 
330  protected function addEditSubtabs($active = self::TAB_EDIT_QUESTION)
331  {
332  $tabs = $this->getTabs();
333  $tabs->addSubTab(
334  self::TAB_EDIT_QUESTION,
335  $this->lng->txt('edit_question'),
336  $this->ctrl->getLinkTarget($this, 'editQuestion')
337  );
338  if ($this->object->isOrderingTypeNested() && !$this->isInLearningModuleContext()) {
339  $tabs->addSubTab(
340  self::TAB_EDIT_NESTING,
341  $this->lng->txt('tab_nest_answers'),
342  $this->ctrl->getLinkTarget($this, self::CMD_EDIT_NESTING)
343  );
344  }
345  $tabs->setTabActive('edit_question');
346  $tabs->setSubTabActive($active);
347  }
348 
349  public function editQuestion(
350  bool $checkonly = false,
351  ?bool $is_save_cmd = null
352  ): bool {
353  $this->renderEditForm($this->buildEditForm());
354  $this->addEditSubtabs(self::TAB_EDIT_QUESTION);
355  return false;
356  }
357 
358  public function editNesting()
359  {
360  $this->renderEditForm($this->buildNestingForm());
361  $this->addEditSubtabs(self::TAB_EDIT_NESTING);
362  $this->tpl->addCss(ilObjStyleSheet::getContentStylePath(0));
363  $this->tpl->addCss(ilObjStyleSheet::getSyntaxStylePath());
364  }
365 
367  {
369  $form->setFormAction($this->ctrl->getFormAction($this));
370  $form->setTitle($this->outQuestionType());
371  $form->setMultipart($this->object->isImageOrderingType());
372  $form->setTableWidth("100%");
373  $form->setId("ordering");
374 
375  $this->addBasicQuestionFormProperties($form);
376  $this->populateQuestionSpecificFormPart($form);
377  $this->populateAnswerSpecificFormPart($form);
378  $this->populateTaxonomyFormSection($form);
379 
380  $form->addSpecificOrderingQuestionCommandButtons($this->object);
381  $form->addGenericAssessmentQuestionCommandButtons($this->object);
382 
383  return $form;
384  }
385 
386  protected function buildNestingForm()
387  {
389  $form->setFormAction($this->ctrl->getFormAction($this));
390  $form->setTitle($this->outQuestionType());
391  $form->setTableWidth("100%");
392 
393  $header = new ilFormSectionHeaderGUI();
394  $header->setTitle($this->lng->txt('oq_header_ordering_elements'));
395  $form->addItem($header);
396 
397  $orderingElementInput = $this->object->buildNestedOrderingElementInputGui();
398  $orderingElementInput->setStylingDisabled($this->isRenderPurposePrintPdf());
399 
400  $this->object->initOrderingElementAuthoringProperties($orderingElementInput);
401 
402  $list = $this->object->getOrderingElementList();
403  foreach ($list->getElements() as $element) {
404  $element = $list->ensureValidIdentifiers($element);
405  }
406 
407  $orderingElementInput->setElementList($list);
408 
409  $form->addItem($orderingElementInput);
410  $form->addCommandButton(self::CMD_SAVE_NESTING, $this->lng->txt("save"));
411  return $form;
412  }
413 
415  {
416  return true;
417  }
418 
419  public function getSolutionOutput(
420  int $active_id,
421  ?int $pass = null,
422  bool $graphical_output = false,
423  bool $result_output = false,
424  bool $show_question_only = true,
425  bool $show_feedback = false,
426  bool $show_correct_solution = false,
427  bool $show_manual_scoring = false,
428  bool $show_question_text = true,
429  bool $show_inline_feedback = true
430  ): string {
431  $solution_ordering_list = $this->object->getOrderingElementListForSolutionOutput(
432  $show_correct_solution,
433  $active_id,
434  $pass
435  );
436 
437  $show_inline_feedback = false;
438  return $this->renderSolutionOutput(
439  $solution_ordering_list,
440  $active_id,
441  $pass,
442  $graphical_output,
443  $result_output,
444  $show_question_only,
445  $show_feedback,
446  $show_correct_solution,
447  $show_manual_scoring,
448  $show_question_text,
449  false,
450  $show_inline_feedback,
451  );
452  }
453 
454  public function renderSolutionOutput(
455  mixed $user_solutions,
456  int $active_id,
457  ?int $pass,
458  bool $graphical_output = false,
459  bool $result_output = false,
460  bool $show_question_only = true,
461  bool $show_feedback = false,
462  bool $show_correct_solution = false,
463  bool $show_manual_scoring = false,
464  bool $show_question_text = true,
465  bool $show_autosave_title = false,
466  bool $show_inline_feedback = false,
467  ): ?string {
468  $solution_ordering_list = ($user_solutions instanceof ilAssOrderingElementList) ?
469  $user_solutions : $this->object->getSolutionOrderingElementList(
470  $this->object->fetchIndexedValuesFromValuePairs($user_solutions)
471  );
472  $answers_gui = $this->object->buildNestedOrderingElementInputGui();
473 
474  if ($show_correct_solution) {
476  } else {
478  }
479 
480  $answers_gui->setInteractionEnabled(false);
481  $answers_gui->setElementList($solution_ordering_list);
482 
483  if ($graphical_output) {
484  $answers_gui->setShowCorrectnessIconsEnabled(true);
485  }
486  $answers_gui->setCorrectnessTrueElementList(
487  $solution_ordering_list->getParityTrueElementList($this->object->getOrderingElementList())
488  );
489  $solution_html = $answers_gui->getHTML();
490 
491  $template = new ilTemplate('tpl.il_as_qpl_nested_ordering_output_solution.html', true, true, 'components/ILIAS/TestQuestionPool');
492  $template->setVariable('SOLUTION_OUTPUT', $solution_html);
493  if ($show_question_text == true) {
494  $template->setVariable('QUESTIONTEXT', $this->object->getQuestionForHTMLOutput());
495  }
496  $questionoutput = $template->get();
497 
498  $solutiontemplate = new ilTemplate('tpl.il_as_tst_solution_output.html', true, true, 'components/ILIAS/TestQuestionPool');
499  $solutiontemplate->setVariable('SOLUTION_OUTPUT', $questionoutput);
500 
501  if ($show_feedback) {
502  $feedback = '';
503 
504  if (!$this->isTestPresentationContext()) {
505  $fb = $this->getGenericFeedbackOutput((int) $active_id, $pass);
506  $feedback .= strlen($fb) ? $fb : '';
507  }
508 
509  if ($feedback !== '') {
510  $cssClass = (
511  $this->hasCorrectSolution($active_id, $pass) ?
513  );
514 
515  $solutiontemplate->setVariable('ILC_FB_CSS_CLASS', $cssClass);
516  $solutiontemplate->setVariable('FEEDBACK', ilLegacyFormElementsUtil::prepareTextareaOutput($feedback, true));
517  }
518  }
519 
520  if ($show_question_only) {
521  return $solutiontemplate->get();
522  }
523 
524  return $this->getILIASPage($solutiontemplate->get());
525 
526  // is this template still in use? it is not used at this point any longer!
527  // $template = new ilTemplate("tpl.il_as_qpl_ordering_output_solution.html", TRUE, TRUE, "components/ILIAS/TestQuestionPool");
528  }
529 
530  public function getPreview(
531  bool $show_question_only = false,
532  bool $show_inline_feedback = false
533  ): string {
534  if ($this->getPreviewSession() && $this->getPreviewSession()->hasParticipantSolution()) {
535  $solutionOrderingElementList = unserialize(
536  $this->getPreviewSession()->getParticipantsSolution(),
537  ['allowed_classes' => true]
538  );
539  } else {
540  $solutionOrderingElementList = $this->object->getShuffledOrderingElementList();
541  }
542 
543  $answers = $this->object->buildNestedOrderingElementInputGui();
544  $answers->setNestingEnabled($this->object->isOrderingTypeNested());
546  $answers->setInteractionEnabled($this->isInteractivePresentation());
547  $answers->setElementList($solutionOrderingElementList);
548 
549  $template = new ilTemplate('tpl.il_as_qpl_ordering_output.html', true, true, 'components/ILIAS/TestQuestionPool');
550 
551  $template->setCurrentBlock('nested_ordering_output');
552  $template->setVariable('NESTED_ORDERING', $answers->getHTML());
553  $template->parseCurrentBlock();
554  $template->setVariable('QUESTIONTEXT', $this->object->getQuestionForHTMLOutput());
555 
556  if ($show_question_only) {
557  return $template->get();
558  }
559 
560  return $this->getILIASPage($template->get());
561  }
562 
563  public function getTestOutput(
564  int $active_id,
565  int $pass,
566  bool $is_question_postponed = false,
567  array|bool $user_post_solutions = false,
568  bool $show_specific_inline_feedback = false
569  ): string {
570  $user_post_solutions = is_array($user_post_solutions) ? $user_post_solutions : [];
571 
572  $ordering_gui = $this->object->buildNestedOrderingElementInputGui();
573  $ordering_gui->setNestingEnabled($this->object->isOrderingTypeNested());
574 
575  $solutionOrderingElementList = $this->object->getSolutionOrderingElementListForTestOutput(
576  $ordering_gui,
577  $user_post_solutions,
578  $active_id,
579  $pass
580  );
581 
582  $template = new ilTemplate('tpl.il_as_qpl_ordering_output.html', true, true, 'components/ILIAS/TestQuestionPool');
583 
585  $ordering_gui->setElementList($solutionOrderingElementList);
586 
587  $template->setCurrentBlock('nested_ordering_output');
588  $template->setVariable('NESTED_ORDERING', $ordering_gui->getHTML());
589  $template->parseCurrentBlock();
590 
591  $template->setVariable('QUESTIONTEXT', $this->object->getQuestionForHTMLOutput());
592 
593  $pageoutput = $this->outQuestionPage('', $is_question_postponed, $active_id, $template->get());
594 
595  return $pageoutput;
596  }
597 
598  protected function isInteractivePresentation(): bool
599  {
600  if ($this->isRenderPurposePlayback()) {
601  return true;
602  }
603 
604  if ($this->isRenderPurposeDemoplay()) {
605  return true;
606  }
607 
608  return false;
609  }
610 
611  protected function getTabs(): ilTabsGUI
612  {
613  global $DIC;
614  return $DIC['ilTabs'];
615  }
616 
617  public function getSpecificFeedbackOutput(array $userSolution): string
618  {
619  return '';
620  }
621 
632  {
633  return [];
634  }
635 
646  {
647  return [];
648  }
649 
650  protected function getAnswerStatisticOrderingElementHtml(ilAssOrderingElement $element): ?string
651  {
652  if ($this->object->isImageOrderingType()) {
653  $element->setImageThumbnailPrefix($this->object->getThumbPrefix());
654  $element->setImagePathWeb($this->object->getImagePathWeb());
655  $element->setImagePathFs($this->object->getImagePath());
656 
657  $src = $element->getPresentationImageUrl();
658  $alt = $element->getContent();
659  $content = "<img src='{$src}' alt='{$alt}' title='{$alt}'/>";
660  } else {
661  $content = $element->getContent();
662  }
663 
664  return $content;
665  }
666 
668  {
669  $html = '<ul>';
670 
671  $lastIndent = 0;
672  $firstElem = true;
673 
674  foreach ($list as $elem) {
675  if ($elem->getIndentation() > $lastIndent) {
676  $html .= '<ul><li>';
677  } elseif ($elem->getIndentation() < $lastIndent) {
678  $html .= '</li></ul><li>';
679  } elseif (!$firstElem) {
680  $html .= '</li><li>';
681  } else {
682  $html .= '<li>';
683  }
684 
685  $html .= $this->getAnswerStatisticOrderingElementHtml($elem);
686 
687  $firstElem = false;
688  $lastIndent = $elem->getIndentation();
689  }
690 
691  $html .= '</li>';
692 
693  for ($i = $lastIndent; $i > 0; $i--) {
694  $html .= '</ul></li>';
695  }
696 
697  $html .= '</ul>';
698 
699  return $html;
700  }
701 
702  public function getAnswersFrequency($relevantAnswers, $questionIndex): array
703  {
704  $answersByActiveAndPass = [];
705 
706  foreach ($relevantAnswers as $row) {
707  $key = $row['active_fi'] . ':' . $row['pass'];
708 
709  if (!isset($answersByActiveAndPass[$key])) {
710  $answersByActiveAndPass[$key] = [];
711  }
712 
713  $answersByActiveAndPass[$key][$row['value1']] = $row['value2'];
714  }
715 
716  $solutionLists = [];
717 
718  foreach ($answersByActiveAndPass as $indexedSolutions) {
719  $solutionLists[] = $this->object->getSolutionOrderingElementList($indexedSolutions);
720  }
721 
722  /* @var ilAssOrderingElementList[] $answers */
723  $answers = [];
724 
725  foreach ($solutionLists as $orderingElementList) {
726  $hash = $orderingElementList->getHash();
727 
728  if (!isset($answers[$hash])) {
729  $variantHtml = $this->getAnswerStatisticOrderingVariantHtml(
730  $orderingElementList
731  );
732 
733  $answers[$hash] = [
734  'answer' => $variantHtml, 'frequency' => 0
735  ];
736  }
737 
738  $answers[$hash]['frequency']++;
739  }
740 
741  return array_values($answers);
742  }
743 
748  {
750  $orderingInput->prepareReprintable($this->object);
751  }
752 
757  {
758  $points = new ilNumberInputGUI($this->lng->txt("points"), "points");
759  $points->allowDecimals(true);
760  $points->setValue($this->object->getPoints());
761  $points->setRequired(true);
762  $points->setSize(3);
763  $points->setMinValue(0);
764  $points->setMinvalueShouldBeGreater(true);
765  $form->addItem($points);
766 
767  $header = new ilFormSectionHeaderGUI();
768  $header->setTitle($this->lng->txt('oq_header_ordering_elements'));
769  $form->addItem($header);
770 
771  $orderingElementInput = $this->object->buildNestedOrderingElementInputGui();
772 
773  $this->object->initOrderingElementAuthoringProperties($orderingElementInput);
774 
775  $orderingElementInput->setElementList($this->object->getOrderingElementList());
776 
777  $form->addItem($orderingElementInput);
778  }
779 
784  {
785  $this->object->setPoints((float) str_replace(',', '.', $form->getInput('points')));
786 
787  $submittedElementList = $this->fetchSolutionListFromSubmittedForm($form);
788 
789  $curElementList = $this->object->getOrderingElementList();
790 
791  $newElementList = new ilAssOrderingElementList();
792  $newElementList->setQuestionId($this->object->getId());
793 
794  foreach ($submittedElementList as $submittedElement) {
795  if (!$curElementList->elementExistByRandomIdentifier($submittedElement->getRandomIdentifier())) {
796  continue;
797  }
798 
799  $curElement = $curElementList->getElementByRandomIdentifier($submittedElement->getRandomIdentifier());
800 
801  $curElement->setPosition($submittedElement->getPosition());
802 
803  if ($this->object->isOrderingTypeNested()) {
804  $curElement->setIndentation($submittedElement->getIndentation());
805  }
806 
807  $newElementList->addElement($curElement);
808  }
809 
810  $this->object->setOrderingElementList($newElementList);
811  }
812 }
__construct($id=-1)
assOrderingQuestionGUI constructor
populateQuestionSpecificFormPart(\ilPropertyFormGUI $form)
hasCorrectSolution($activeId, $passIndex)
getSpecificFeedbackOutput(array $userSolution)
prepareReprintableCorrectionsForm(ilPropertyFormGUI $form)
This class represents a selection list property in a property form.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
getAnswerStatisticOrderingVariantHtml(ilAssOrderingElementList $list)
getItemByPostVar(string $a_post_var)
populateAnswerSpecificFormPart(ilPropertyFormGUI $form)
Adds the answer specific form parts to a question property form gui.
getPreview(bool $show_question_only=false, bool $show_inline_feedback=false)
addBasicQuestionFormProperties(ilPropertyFormGUI $form)
setOptions(array $a_options)
populateTaxonomyFormSection(ilPropertyFormGUI $form)
getInput(string $a_post_var, bool $ensureValidation=true)
Returns the input of an item, if item provides getInput method and as fallback the value of the HTTP-...
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
allowDecimals(bool $a_value)
fetchSolutionListFromSubmittedForm(ilPropertyFormGUI $form)
editQuestion(bool $checkonly=false, ?bool $is_save_cmd=null)
writeAnswerSpecificPostData(ilPropertyFormGUI $form)
Extracts the answer specific values from the request and applies them to the data object...
This class represents a number property in a property form.
setValue(?string $a_value)
getAfterParticipationSuppressionAnswerPostVars()
Returns a list of postvars which will be suppressed in the form output when used in scoring adjustmen...
addEditSubtabs($active=self::TAB_EDIT_QUESTION)
global $DIC
Definition: shib_login.php:22
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
getAfterParticipationSuppressionQuestionPostVars()
Returns a list of postvars which will be suppressed in the form output when used in scoring adjustmen...
setImagePathFs(string $image_path_fs)
static getContentStylePath(int $a_style_id, bool $add_random=true, bool $add_token=true)
get content style path static (to avoid full reading)
$filename
Definition: buildRTE.php:78
getSolutionOutput(int $active_id, ?int $pass=null, bool $graphical_output=false, bool $result_output=false, bool $show_question_only=true, bool $show_feedback=false, bool $show_correct_solution=false, bool $show_manual_scoring=false, bool $show_question_text=true, bool $show_inline_feedback=true)
setImageThumbnailPrefix($imageThumbnailPrefix)
saveCorrectionsFormProperties(ilPropertyFormGUI $form)
getILIASPage(string $html="")
Returns the ILIAS Page around a question.
outQuestionPage($a_temp_var, $a_postponed=false, $active_id="", $html="", $inlineFeedbackEnabled=false)
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
__construct(Container $dic, ilPlugin $plugin)
renderSolutionOutput(mixed $user_solutions, int $active_id, ?int $pass, bool $graphical_output=false, bool $result_output=false, bool $show_question_only=true, bool $show_feedback=false, bool $show_correct_solution=false, bool $show_manual_scoring=false, bool $show_question_text=true, bool $show_autosave_title=false, bool $show_inline_feedback=false,)
Class for ordering questions.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
getAnswersFrequency($relevantAnswers, $questionIndex)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
$post
Definition: ltitoken.php:46
static prepareTextareaOutput(string $txt_output, bool $prepare_for_latex_output=false, bool $omitNl2BrWhenTextArea=false)
Prepares a string for a text area output where latex code may be in it If the text is HTML-free...
getAnswerStatisticOrderingElementHtml(ilAssOrderingElement $element)
getTestOutput(int $active_id, int $pass, bool $is_question_postponed=false, array|bool $user_post_solutions=false, bool $show_specific_inline_feedback=false)
populateCorrectionsFormProperties(ilPropertyFormGUI $form)
writeQuestionSpecificPostData(ilPropertyFormGUI $form)
Extracts the question specific values from the request and applies them to the data object...
renderEditForm(ilPropertyFormGUI $form)
getGenericFeedbackOutput(int $active_id, ?int $pass)