ILIAS  release_8 Revision v8.24
class.ilObjTestSettingsGeneralGUI.php
Go to the documentation of this file.
1<?php
2
19use Psr\Http\Message\RequestInterface;
20use ILIAS\UI\Factory as UIFactory;
21use ILIAS\UI\Renderer as UIRenderer;
22
37{
41 public const CMD_SHOW_FORM = 'showForm';
42 public const CMD_SAVE_FORM = 'saveForm';
43 public const CMD_CONFIRMED_SAVE_FORM = 'confirmedSaveForm';
44 public const CMD_SHOW_RESET_TPL_CONFIRM = 'showResetTemplateConfirmation';
45 public const CMD_CONFIRMED_RESET_TPL = 'confirmedResetTemplate';
46
47 public const ANSWER_FIXATION_NONE = 'none';
48 public const ANSWER_FIXATION_ON_INSTANT_FEEDBACK = 'instant_feedback';
49 public const ANSWER_FIXATION_ON_FOLLOWUP_QUESTION = 'followup_question';
50 public const ANSWER_FIXATION_ON_IFB_OR_FUQST = 'ifb_or_fuqst';
51
54
57 protected ilLanguage $lng;
59 protected ilTree $tree;
60 protected ilDBInterface $db;
65 private RequestInterface $request;
66 private UIFactory $ui_factory;
67 private UIRenderer $ui_renderer;
68
69 public function __construct(
78 ) {
80 global $DIC;
81
82 $this->ctrl = $ctrl;
83 $this->access = $access;
84 $this->lng = $lng;
85 $this->tpl = $DIC->ui()->mainTemplate();
86 $this->tree = $tree;
87 $this->db = $db;
88 $this->component_repository = $component_repository;
89 $this->activeUser = $activeUser;
90
91 $this->testGUI = $testGUI;
92
93 $this->testQuestionSetConfigFactory = new ilTestQuestionSetConfigFactory(
94 $this->tree,
95 $this->db,
96 $this->component_repository,
97 $testGUI->getTestObject()
98 );
99 $this->request = $DIC->http()->request();
100 $this->ui_factory = $DIC->ui()->factory();
101 $this->ui_renderer = $DIC->ui()->renderer();
102
103 parent::__construct($testGUI->getTestObject());
104 }
105
109 public function executeCommand()
110 {
111 global $DIC; /* @var ILIAS\DI\Container $DIC */
112
113 // allow only write access
114
115 if (!$this->access->checkAccess("write", "", $this->testGUI->getRefId())) {
116 $this->tpl->setOnScreenMessage('info', $this->lng->txt("cannot_edit_test"), true);
117 $this->ctrl->redirect($this->testGUI, "infoScreen");
118 }
119
120 $DIC->tabs()->activateTab(ilTestTabsManager::TAB_ID_SETTINGS);
122
123 // process command
124
125 $nextClass = $this->ctrl->getNextClass();
126
127 switch ($nextClass) {
128 default:
129 $cmd = $this->ctrl->getCmd(self::CMD_SHOW_FORM) . 'Cmd';
130 $this->$cmd();
131 }
132 }
133
134 private function showFormCmd(ilPropertyFormGUI $form = null)
135 {
136 $this->tpl->addJavascript("./Services/JavaScript/js/Basic.js");
137
138 if ($this->testOBJ->isDynamicTest()) {
139 $this->tpl->setOnScreenMessage('info', $this->lng->txt("ctm_cannot_be_changed"));
140 return;
141 }
142
143 if ($form === null) {
144 $form = $this->buildForm();
145 }
146
147 $this->tpl->setContent($this->ctrl->getHTML($form));
149 }
150
151 private function showConfirmation(ilPropertyFormGUI $form, $oldQuestionSetType, $newQuestionSetType, $hasQuestionsWithoutQuestionpool)
152 {
153 require_once 'Modules/Test/classes/confirmations/class.ilTestSettingsChangeConfirmationGUI.php';
154 $confirmation = new ilTestSettingsChangeConfirmationGUI($this->testOBJ);
155
156 $confirmation->setFormAction($this->ctrl->getFormAction($this));
157 $confirmation->setCancel($this->lng->txt('cancel'), self::CMD_SHOW_FORM);
158 $confirmation->setConfirm($this->lng->txt('confirm'), self::CMD_CONFIRMED_SAVE_FORM);
159
160 $confirmation->setOldQuestionSetType($oldQuestionSetType);
161 $confirmation->setNewQuestionSetType($newQuestionSetType);
162 $confirmation->setQuestionLossInfoEnabled($hasQuestionsWithoutQuestionpool);
163 $confirmation->build();
164
165 $confirmation->populateParametersFromPropertyForm($form, $this->activeUser->getTimeZone());
166
167 $this->tpl->setContent($this->ctrl->getHTML($confirmation));
168 }
169
170 protected function populateSettingsTemplateMessage(): void
171 {
172 if (!$this->settingsTemplate) {
173 return;
174 }
175
176 $link = $this->ui_factory->link()->standard(
177 $this->lng->txt('test_using_template_link'),
178 $this->ctrl->getLinkTarget($this, self::CMD_SHOW_RESET_TPL_CONFIRM)
179 );
180 if ($this->settingsTemplate->isAvailable()) {
181 $title = $this->settingsTemplate->getTitle();
182 if ($this->settingsTemplate->getAutoGenerated()) {
183 $title = $this->lng->txt($title);
184 }
185
186 $message = sprintf($this->lng->txt('test_using_template'), $title, $this->ui_renderer->render($link));
187 } else {
188 $message = sprintf($this->lng->txt('test_using_removed_template'), $this->ui_renderer->render($link));
189 }
190
191 $this->tpl->setOnScreenMessage(
192 $this->settingsTemplate->isAvailable() ? 'info' : 'failure',
193 $message,
194 !$this->settingsTemplate->isAvailable()
195 );
196 }
197
198 private function confirmedSaveFormCmd(): void
199 {
200 $this->saveFormCmd(true);
201 }
202
203
204 private function saveFormCmd($isConfirmedSave = false): void
205 {
206 $form = $this->buildForm();
207
208 // form validation and initialisation
209
210 if ($isConfirmedSave) {
211 // since confirmation does only pickup POST and no FILES
212 // mocking the tile image file upload field is neccessary
213 // due to checkInput() behaviour (fixes mantis #24226)
214 $_FILES['tile_image'] = array(
215 'name' => '', 'type' => '', 'size' => '', 'tmp_name' => '', 'error' => ''
216 );
217
218 // TODO: get rid of question selection mode setting in settings form (move to creation screen)
219 }
220
221 $errors = !$form->checkInput(); // ALWAYS CALL BEFORE setValuesByPost()
222
223 $values = $this->request->getParsedBody();
224 if (!isset($values['kiosk_options'])) {
225 $values['kiosk_options'] = [];
226 }
227 if (!isset($values['instant_feedback_contents'])) {
228 $values['instant_feedback_contents'] = [];
229 }
230 if (!isset($values['list_of_questions_options'])) {
231 $values['list_of_questions_options'] = [];
232 }
233 if (!isset($values['pass_waiting'])) {
234 $values['pass_waiting'] = [];
235 }
236
237 if ($errors) {
238 $form->setValuesByArray($values);
239 $this->tpl->setOnScreenMessage('failure', $this->lng->txt('form_input_not_valid'));
240 $this->showFormCmd($form);
241 return;
242 }
243
244 // return to form when online is to be set, but no questions are configured
245 $currentQuestionSetConfig = $this->testQuestionSetConfigFactory->getQuestionSetConfig();
246 if ($form->getInput('online') && !$this->testOBJ->isComplete($currentQuestionSetConfig)) {
247 $form->setValuesByArray($values);
248 $form->getItemByPostVar('online')->setAlert(
249 $this->lng->txt("cannot_switch_to_online_no_questions_andor_no_mark_steps")
250 );
251
252 $this->tpl->setOnScreenMessage('failure', $this->lng->txt('form_input_not_valid'));
253 $this->showFormCmd($form);
254 return;
255 }
256
257 // avoid settings conflict "obligate questions" and "freeze answer"
258 if ($form->getInput('obligations_enabled') && $form->getInput('answer_fixation_handling') != self::ANSWER_FIXATION_NONE) {
259 $form->setValuesByArray($values);
260 $form->getItemByPostVar('obligations_enabled')->setAlert($this->lng->txt('tst_conflicting_setting'));
261 $form->getItemByPostVar('answer_fixation_handling')->setAlert($this->lng->txt('tst_conflicting_setting'));
262
263 $this->tpl->setOnScreenMessage('failure', $this->lng->txt('tst_settings_conflict_message'));
264 $this->showFormCmd($form);
265 return;
266 }
267
268 $conflictModes = array(self::ANSWER_FIXATION_ON_FOLLOWUP_QUESTION, self::ANSWER_FIXATION_ON_IFB_OR_FUQST);
269
270 if ($form->getInput('postpone') && in_array($form->getInput('answer_fixation_handling'), $conflictModes)) {
271 $form->setValuesByArray($values);
272 $form->getItemByPostVar('postpone')->setAlert($this->lng->txt('tst_conflicting_setting'));
273 $form->getItemByPostVar('answer_fixation_handling')->setAlert($this->lng->txt('tst_conflicting_setting'));
274
275 $this->tpl->setOnScreenMessage('failure', $this->lng->txt('tst_settings_conflict_message'));
276 $this->showFormCmd($form);
277 return;
278 }
279
280 if ($form->getInput('chb_shuffle_questions') && in_array($form->getInput('answer_fixation_handling'), $conflictModes)) {
281 $form->setValuesByArray($values);
282 $form->getItemByPostVar('chb_shuffle_questions')->setAlert($this->lng->txt('tst_conflicting_setting'));
283 $form->getItemByPostVar('answer_fixation_handling')->setAlert($this->lng->txt('tst_conflicting_setting'));
284
285 $this->tpl->setOnScreenMessage('failure', $this->lng->txt('tst_settings_conflict_message'));
286 $this->showFormCmd($form);
287 return;
288 }
289
290 $infoMsg = array();
291
292 // solve conflicts with question set type setting with confirmation screen if required
293 // determine wether question set type relating data is to be removed (questions/pools)
294
295 $questionSetTypeRelatingDataCleanupRequired = false;
296
297 $oldQuestionSetType = $this->testOBJ->getQuestionSetType();
298 if ($form->getItemByPostVar('question_set_type') instanceof ilFormPropertyGUI) {
299 $newQuestionSetType = $form->getInput('question_set_type');
300
301 if (!$this->testOBJ->participantDataExist() && $newQuestionSetType != $oldQuestionSetType) {
302 $oldQuestionSetConfig = $this->testQuestionSetConfigFactory->getQuestionSetConfigByType();
303
304 if ($oldQuestionSetConfig->doesQuestionSetRelatedDataExist()) {
305 if (!$isConfirmedSave) {
306 $form->setValuesByArray($values);
307 if ($oldQuestionSetType == ilObjTest::QUESTION_SET_TYPE_FIXED) {
308 $this->showConfirmation(
309 $form,
310 $oldQuestionSetType,
311 $newQuestionSetType,
312 $this->testOBJ->hasQuestionsWithoutQuestionpool()
313 );
314 return;
315 }
316
317 $this->showConfirmation(
318 $form,
319 $oldQuestionSetType,
320 $newQuestionSetType,
321 false
322 );
323 return;
324 }
325
326 $questionSetTypeRelatingDataCleanupRequired = true;
327 }
328
329 if ($form->getInput('online')) {
330 $form->getItemByPostVar('online')->setChecked(false);
331
332 if (!$this->testOBJ->getOfflineStatus()) {
333 $infoMsg[] = $this->lng->txt("tst_set_offline_due_to_switched_question_set_type_setting");
334 } else {
335 $infoMsg[] = $this->lng->txt("tst_cannot_online_due_to_switched_quest_set_type_setting");
336 }
337 }
338 }
339 } else {
340 $newQuestionSetType = $oldQuestionSetType;
341 }
342
343 // adjust settings due to chosen question set type
344
345 if ($newQuestionSetType != ilObjTest::QUESTION_SET_TYPE_FIXED) {
346 $form->getItemByPostVar('chb_use_previous_answers')->setChecked(false);
347 }
348
349 $ending_time = $form->getInput('ending_time');
350 $starting_time = $form->getInput('starting_time');
351 if (is_string($ending_time) && $ending_time !== ''
352 && is_string($starting_time) && $starting_time !== ''
353 && ($starting_time > $ending_time
354 || (new ilDateTime($ending_time, IL_CAL_DATETIME))->get(IL_CAL_UNIX) < (new ilDateTime($starting_time, IL_CAL_DATETIME))->get(IL_CAL_UNIX))
355 ) {
356 $this->tpl->setOnScreenMessage('failure', $this->lng->txt("tst_ending_time_before_starting_time"), true);
357 $form->setValuesByArray($values);
358 $form->getItemByPostVar('starting_time')->setDate(new ilDateTime($this->testOBJ->getStartingTime(), IL_CAL_UNIX));
359 $this->showFormCmd($form);
360 return;
361 }
362
363 // perform saving the form data
364
365 $this->performSaveForm($form);
366
367 // clean up test mode relating configuration data (questions/questionpools)
368
369 if ($questionSetTypeRelatingDataCleanupRequired) {
370 $oldQuestionSetConfig->removeQuestionSetRelatedData();
371 }
372
373 // disinvite all invited users if required
374
375 if (!$this->testOBJ->participantDataExist() && !$this->testOBJ->getFixedParticipants()) {
376 foreach ($this->testOBJ->getInvitedUsers() as $usrId => $usrData) {
377 $this->testOBJ->disinviteUser($usrId);
378 }
379 }
380
381 // redirect to form output
382
383 if (count($infoMsg)) {
384 $this->tpl->setOnScreenMessage('info', implode('<br />', $infoMsg), true);
385 }
386
387 $this->tpl->setOnScreenMessage('success', $this->lng->txt("msg_obj_modified"), true);
388 $this->ctrl->redirect($this, self::CMD_SHOW_FORM);
389 }
390
395 {
396 $confirmationGUI = new ilConfirmationGUI();
397
398 $confirmationGUI->setFormAction($this->ctrl->getFormAction($this));
399 $confirmationGUI->setHeaderText($this->lng->txt("test_confirm_template_reset"));
400 $confirmationGUI->setCancel($this->lng->txt('cancel'), self::CMD_SHOW_FORM);
401 $confirmationGUI->setConfirm($this->lng->txt('confirm'), self::CMD_CONFIRMED_RESET_TPL);
402
403 $this->tpl->setContent($this->ctrl->getHTML($confirmationGUI));
404 }
405
409 private function confirmedResetTemplateCmd()
410 {
411 $this->testOBJ->setTemplate(null);
412 $this->testOBJ->saveToDB();
413
414 $this->tpl->setOnScreenMessage('success', $this->lng->txt("test_template_reset"), true);
415 $this->ctrl->redirect($this, self::CMD_SHOW_FORM);
416 }
417
419 {
420 if (!($form->getItemByPostVar('skill_service') instanceof ilFormPropertyGUI)) {
421 return false;
422 }
423
425 return false;
426 }
427
428 if (!$form->getInput('skill_service')) {
429 return false;
430 }
431
432 return true;
433 }
434
435 private function isCharSelectorPropertyRequired(): bool
436 {
437 global $DIC;
438 $ilSetting = $DIC['ilSetting'];
439
440 return $ilSetting->get('char_selector_availability') > 0;
441 }
442
443
444 private function buildForm(): ilPropertyFormGUI
445 {
446 require_once 'Services/Form/classes/class.ilPropertyFormGUI.php';
447 $form = new ilPropertyFormGUI();
448 $form->setFormAction($this->ctrl->getFormAction($this));
449 $form->addCommandButton(self::CMD_SAVE_FORM, $this->lng->txt("save"));
450 $form->setTableWidth("100%");
451 $form->setId("test_properties");
452
453 $this->addGeneralProperties($form);
454 $this->addAvailabilityProperties($form);
455 $this->addPresentationProperties($form);
456 $this->addTestIntroProperties($form);
457 $this->addTestAccessProperties($form);
458 $this->addTestRunProperties($form);
459 $this->addQuestionBehaviourProperties($form);
460 $this->addTestSequenceProperties($form);
461 $this->addTestFinishProperties($form);
462
463 // Edit ecs export settings
464 include_once 'Modules/Test/classes/class.ilECSTestSettings.php';
465 $ecs = new ilECSTestSettings($this->testOBJ);
466 $ecs->addSettingsToForm($form, 'tst');
467
468 // additional features
469
470 $orgunitServiceActive = ilOrgUnitGlobalSettings::getInstance()->getObjectPositionSettingsByType(
471 $this->testOBJ->getType()
472 )->isActive();
473
474 $skillServiceActive = ilObjTest::isSkillManagementGloballyActivated();
475
476
477 if ($orgunitServiceActive || $skillServiceActive) {
478 $otherHead = new ilFormSectionHeaderGUI();
479 $otherHead->setTitle($this->lng->txt('obj_features'));
480 $form->addItem($otherHead);
481 }
482
483 require_once 'Services/Object/classes/class.ilObjectServiceSettingsGUI.php';
484 ilObjectServiceSettingsGUI::initServiceSettingsForm($this->testOBJ->getId(), $form, array(
486 ));
487
488 // skill service activation for FIXED tests only
489 if ($skillServiceActive) {
490 $skillService = new ilCheckboxInputGUI($this->lng->txt('tst_activate_skill_service'), 'skill_service');
491 $skillService->setInfo($this->lng->txt('tst_activate_skill_service_desc'));
492 $skillService->setChecked($this->testOBJ->isSkillServiceEnabled());
493 if ($this->testOBJ->participantDataExist()) {
494 $skillService->setDisabled(true);
495 }
496 $form->addItem($skillService);
497 }
498
499 // remove items when using template
500 $this->removeHiddenItems($form);
501
502 return $form;
503 }
504
505 private function performSaveForm(ilPropertyFormGUI $form)
506 {
507 $this->saveGeneralProperties($form);
508 $this->savePresentationProperties($form);
509 $this->saveAvailabilityProperties($form);
510 $this->saveTestIntroProperties($form);
511 $this->saveTestAccessProperties($form);
512 $this->saveTestRunProperties($form);
514 $this->saveTestSequenceSettings($form);
515 $this->saveTestFinishProperties($form);
516
517 if (!$this->testOBJ->participantDataExist()) {
518 // skill service
519 if (ilObjTest::isSkillManagementGloballyActivated() && $form->getItemByPostVar('skill_service') instanceof ilFormPropertyGUI) {
520 $this->testOBJ->setSkillServiceEnabled((bool) $form->getInput('skill_service'));
521 }
522 }
523
524 require_once 'Services/Object/classes/class.ilObjectServiceSettingsGUI.php';
525 ilObjectServiceSettingsGUI::updateServiceSettingsForm($this->testOBJ->getId(), $form, array(
527 ));
528
529 // store settings to db
530 $this->testOBJ->saveToDb(true);
531
532 // Update ecs export settings
533 include_once 'Modules/Test/classes/class.ilECSTestSettings.php';
534 $ecs = new ilECSTestSettings($this->testOBJ);
535 $ecs->handleSettingsUpdate();
536 }
537
542 {
543 $header = new ilFormSectionHeaderGUI();
544 $header->setTitle($this->lng->txt("tst_general_properties"));
545 $form->addItem($header);
546
547 // title & description (meta data)
548
549 include_once 'Services/MetaData/classes/class.ilMD.php';
550 $md_obj = new ilMD($this->testOBJ->getId(), 0, "tst");
551 $md_section = $md_obj->getGeneral();
552
553 $title = new ilTextInputGUI($this->lng->txt("title"), "title");
554 $title->setRequired(true);
555 $title->setMaxLength(255);
556 if ($md_section !== null) {
557 $title->setValue($md_section->getTitle());
558 }
559 $form->addItem($title);
560
561 if ($md_section !== null) {
562 $ids = $md_section->getDescriptionIds();
563 } else {
564 $ids = array();
565 }
566
567 $desc = new ilTextAreaInputGUI($this->lng->txt("description"), "description");
568 $desc->setCols(50);
569 $desc->setRows(4);
570
571 if ($ids) {
572 $desc_obj = $md_section->getDescription(array_pop($ids));
573
574 if ($desc_obj !== null) {
575 $desc->setValue($desc_obj->getDescription());
576 }
577 }
578 $form->addItem($desc);
579
580 $question_set_type = new ilRadioGroupInputGUI($this->lng->txt('test_question_set_type'), 'question_set_type');
581
582 $fixed = new ilRadioOption($this->lng->txt('test_question_set_type_fixed'), ilObjTest::QUESTION_SET_TYPE_FIXED);
583 $fixed->setInfo($this->lng->txt('test_question_set_type_fixed_info'));
584 $question_set_type->addOption($fixed);
585
586 $random = new ilRadioOption($this->lng->txt('test_question_set_type_random'), ilObjTest::QUESTION_SET_TYPE_RANDOM);
587 $random->setInfo($this->lng->txt('test_question_set_type_random_info'));
588 $question_set_type->addOption($random);
589 if ($this->testOBJ->participantDataExist()) {
590 $question_set_type->setDisabled(true);
591 }
592
593 $question_set_type->setValue($this->testOBJ->getQuestionSetType());
594 $form->addItem($question_set_type);
595
596 // anonymity
597 $anonymity = new ilRadioGroupInputGUI($this->lng->txt('tst_anonymity'), 'anonymity');
598 if ($this->testOBJ->participantDataExist()) {
599 $anonymity->setDisabled(true);
600 }
601 $rb = new ilRadioOption($this->lng->txt('tst_anonymity_no_anonymization'), 0);
602 $anonymity->addOption($rb);
603 $rb = new ilRadioOption($this->lng->txt('tst_anonymity_anonymous_test'), 1);
604 $anonymity->addOption($rb);
605 $anonymity->setValue($this->testOBJ->getAnonymity());
606 $form->addItem($anonymity);
607 }
608
613 {
614 $md_obj = new ilMD($this->testOBJ->getId(), 0, "tst");
615 $md_section = $md_obj->getGeneral();
616
617 if ($md_section === null) {
618 $md_section = $md_obj->addGeneral();
619 $md_section->save();
620 }
621
622 $md_section->setTitle(ilUtil::stripSlashes($form->getInput('title')));
623 $md_section->update();
624
625 $md_desc_ids = $md_section->getDescriptionIds();
626 if ($md_desc_ids) {
627 $md_desc = $md_section->getDescription(array_pop($md_desc_ids));
628 $md_desc->setDescription(ilUtil::stripSlashes($form->getInput('description')));
629 $md_desc->update();
630 } else {
631 $md_desc = $md_section->addDescription();
632 $md_desc->setDescription(ilUtil::stripSlashes($form->getInput('description')));
633 $md_desc->save();
634 }
635
636 $this->testOBJ->setTitle(ilUtil::stripSlashes($form->getInput('title')));
637 $this->testOBJ->setDescription(ilUtil::stripSlashes($form->getInput('description')));
638 $this->testOBJ->setOfflineStatus(!$form->getInput('online'));
639 $this->testOBJ->update();
640
641 if (!$this->testOBJ->participantDataExist()) {
642 // question set type
643 if ($form->getItemByPostVar('question_set_type') instanceof ilFormPropertyGUI) {
644 $this->testOBJ->setQuestionSetType($form->getInput('question_set_type'));
645 }
646 }
647
648 // anonymity setting
649 if (!$this->testOBJ->participantDataExist() && $this->formPropertyExists($form, 'anonymity')) {
650 $this->testOBJ->setAnonymity((int) $form->getInput('anonymity'));
651 }
652 }
653
658 {
659 include_once "Services/Object/classes/class.ilObjectActivation.php";
660 $this->lng->loadLanguageModule('rep');
661
662 $section = new ilFormSectionHeaderGUI();
663 $section->setTitle($this->lng->txt('rep_activation_availability'));
664 $form->addItem($section);
665
666 // additional info only with multiple references
667 $act_obj_info = $act_ref_info = "";
668 if (sizeof(ilObject::_getAllReferences($this->testOBJ->getId())) > 1) {
669 $act_obj_info = ' ' . $this->lng->txt('rep_activation_online_object_info');
670 $act_ref_info = $this->lng->txt('rep_activation_access_ref_info');
671 }
672
673 $online = new ilCheckboxInputGUI($this->lng->txt('rep_activation_online'), 'online');
674 $online->setChecked(!$this->testOBJ->getOfflineStatus());
675 $online->setInfo($this->lng->txt('tst_activation_online_info') . $act_obj_info);
676 $form->addItem($online);
677
678 $act_type = new ilCheckboxInputGUI($this->lng->txt('rep_visibility_until'), 'activation_type');
679 $act_type->setChecked($this->testOBJ->isActivationLimited());
680
681 include_once "Services/Form/classes/class.ilDateDurationInputGUI.php";
682 $dur = new ilDateDurationInputGUI($this->lng->txt("rep_time_period"), "access_period");
683 $dur->setRequired(true);
684 $dur->setShowTime(true);
685 $start_date = $this->testOBJ->getActivationStartingTime();
686 $dur->setStart(new ilDateTime($start_date ? $start_date : time(), IL_CAL_UNIX));
687 $dur->setStartText($this->lng->txt('rep_activation_limited_start'));
688 $end_date = $this->testOBJ->getActivationEndingTime();
689 $dur->setEnd(new ilDateTime($end_date ? $end_date : time(), IL_CAL_UNIX));
690 $dur->setEndText($this->lng->txt('rep_activation_limited_end'));
691 $act_type->addSubItem($dur);
692
693 $visible = new ilCheckboxInputGUI($this->lng->txt('rep_activation_limited_visibility'), 'activation_visibility');
694 $visible->setInfo($this->lng->txt('tst_activation_limited_visibility_info'));
695 $visible->setChecked((bool) $this->testOBJ->getActivationVisibility());
696 $act_type->addSubItem($visible);
697
698 $form->addItem($act_type);
699 }
700
705 {
706 // activation
707 if ($form->getInput('activation_type')) {
708 $this->testOBJ->setActivationLimited(true);
709 $this->testOBJ->setActivationVisibility($form->getInput('activation_visibility'));
710
711 $period = $form->getItemByPostVar("access_period");
712 $this->testOBJ->setActivationStartingTime($period->getStart()->get(IL_CAL_UNIX));
713 $this->testOBJ->setActivationEndingTime($period->getEnd()->get(IL_CAL_UNIX));
714 } else {
715 $this->testOBJ->setActivationLimited(false);
716 }
717 }
718
723 {
724 global $DIC; /* @var ILIAS\DI\Container $DIC */
725
726 $section = new ilFormSectionHeaderGUI();
727 $section->setTitle($this->lng->txt('tst_presentation_settings_section'));
728 $form->addItem($section);
729
730 $DIC->object()->commonSettings()->legacyForm($form, $this->testOBJ)->addTileImage();
731 }
732
737 {
738 global $DIC; /* @var ILIAS\DI\Container $DIC */
739
740 $DIC->object()->commonSettings()->legacyForm($form, $this->testOBJ)->saveTileImage();
741 }
742
747 {
748 $section = new ilFormSectionHeaderGUI();
749 $section->setTitle($this->lng->txt('tst_settings_header_intro'));
750 $form->addItem($section);
751
752 // introduction
753 $introEnabled = new ilCheckboxInputGUI($this->lng->txt("tst_introduction"), 'intro_enabled');
754 $introEnabled->setChecked($this->testOBJ->isIntroductionEnabled());
755 $introEnabled->setInfo($this->lng->txt('tst_introduction_desc'));
756 $form->addItem($introEnabled);
757 $intro = new ilTextAreaInputGUI($this->lng->txt("tst_introduction_text"), "introduction");
758 $intro->setRequired(true);
759 $intro->setValue((string) $this->testOBJ->prepareTextareaOutput($this->testOBJ->getIntroduction(), false, true));
760 $intro->setRows(10);
761 $intro->setCols(80);
762 $intro->setUseRte(true);
763 $intro->addPlugin("latex");
764 $intro->addButton("latex");
765 $intro->setRTESupport($this->testOBJ->getId(), "tst", "assessment");
766 $intro->setRteTagSet('full');
767 $introEnabled->addSubItem($intro);
768
769 // showinfo
770 $showinfo = new ilCheckboxInputGUI($this->lng->txt("showinfo"), "showinfo");
771 $showinfo->setValue(1);
772 $showinfo->setChecked($this->testOBJ->getShowInfo());
773 $showinfo->setInfo($this->lng->txt("showinfo_desc"));
774 $form->addItem($showinfo);
775 }
776
781 {
782 if ($form->getItemByPostVar('intro_enabled') instanceof ilFormPropertyGUI) {
783 $this->testOBJ->setIntroductionEnabled($form->getInput('intro_enabled'));
784
785 if ($form->getItemByPostVar('intro_enabled')->getChecked()) {
786 $this->testOBJ->setIntroduction($form->getInput('introduction'));
787 } else {
788 $this->testOBJ->setIntroduction('');
789 }
790 }
791
792 if ($form->getItemByPostVar('showinfo') instanceof ilFormPropertyGUI) {
793 $this->testOBJ->setShowInfo($form->getInput('showinfo'));
794 }
795 }
796
801 {
802 $header = new ilFormSectionHeaderGUI();
803 $header->setTitle($this->lng->txt("tst_settings_header_execution"));
804 $form->addItem($header);
805
806 // starting time
807 $startingtime = new ilDateTimeInputGUI($this->lng->txt("tst_starting_time"), 'starting_time');
808 $startingtime->setInfo($this->lng->txt("tst_starting_time_desc"));
809 $startingtime->setShowTime(true);
810 if ((int) $this->testOBJ->getStartingTime() !== 0) {
811 $startingtime->setDate(new ilDateTime($this->testOBJ->getStartingTime(), IL_CAL_UNIX));
812 } else {
813 $startingtime->setDate(null);
814 }
815 $form->addItem($startingtime);
816 if ($this->testOBJ->participantDataExist()) {
817 $startingtime->setDisabled(true);
818 }
819
820 // ending time
821 $endingtime = new ilDateTimeInputGUI($this->lng->txt("tst_ending_time"), 'ending_time');
822 $endingtime->setInfo($this->lng->txt("tst_ending_time_desc"));
823 $endingtime->setShowTime(true);
824 if ((int) $this->testOBJ->getEndingTime() !== 0) {
825 $endingtime->setDate(new ilDateTime($this->testOBJ->getEndingTime(), IL_CAL_UNIX));
826 } else {
827 $endingtime->setDate(null);
828 }
829 $form->addItem($endingtime);
830
831
832 // test password
833 $pwEnabled = new ilCheckboxInputGUI($this->lng->txt('tst_password'), 'password_enabled');
834 $pwEnabled->setChecked((bool) $this->testOBJ->isPasswordEnabled());
835 $pwEnabled->setInfo($this->lng->txt("tst_password_details"));
836 $password = new ilTextInputGUI($this->lng->txt("tst_password_enter"), "password");
837 $password->setRequired(true);
838 $password->setSize(20);
839 $password->setMaxLength(20);
840 $password->setValue($this->testOBJ->getPassword());
841 $pwEnabled->addSubItem($password);
842 $form->addItem($pwEnabled);
843
844 // fixed participants
845 $fixedparticipants = new ilCheckboxInputGUI($this->lng->txt('participants_invitation'), "fixedparticipants");
846 $fixedparticipants->setValue(1);
847 $fixedparticipants->setChecked($this->testOBJ->getFixedParticipants());
848 $fixedparticipants->setInfo($this->lng->txt("participants_invitation_description"));
849 if ($this->testOBJ->participantDataExist()) {
850 $fixedparticipants->setDisabled(true);
851 }
852 $form->addItem($fixedparticipants);
853
854 // simultaneous users
855 $simulLimited = new ilCheckboxInputGUI($this->lng->txt("tst_allowed_users"), 'limitUsers');
856 $simulLimited->setInfo($this->lng->txt("tst_allowed_users_desc"));
857 $simulLimited->setChecked((bool) $this->testOBJ->isLimitUsersEnabled());
858
859 // allowed simultaneous users
860 $simul = new ilNumberInputGUI($this->lng->txt("tst_allowed_users_max"), "allowedUsers");
861 $simul->setRequired(true);
862 $simul->allowDecimals(false);
863 $simul->setMinValue(1);
864 $simul->setMinvalueShouldBeGreater(false);
865 $simul->setSize(4);
866 $simul->setValue(($this->testOBJ->getAllowedUsers()) ? $this->testOBJ->getAllowedUsers() : '');
867 $simulLimited->addSubItem($simul);
868
869 // idle time
870 $idle = new ilNumberInputGUI($this->lng->txt("tst_allowed_users_time_gap"), "allowedUsersTimeGap");
871 $idle->setInfo($this->lng->txt("tst_allowed_users_time_gap_desc"));
872 $idle->setSize(4);
873 $idle->setSuffix($this->lng->txt("seconds"));
874 $idle->setValue(($this->testOBJ->getAllowedUsersTimeGap()) ? $this->testOBJ->getAllowedUsersTimeGap() : 300);
875 $simulLimited->addSubItem($idle);
876
877 $form->addItem($simulLimited);
878 return $header;
879 }
880
885 {
886 if (!$this->testOBJ->participantDataExist()) {
887 $starting_time = $form->getInput('starting_time');
888 if (is_string($starting_time) && $starting_time !== '') {
889 $this->testOBJ->setStartingTime((new ilDateTime($starting_time, IL_CAL_DATETIME))->get(IL_CAL_UNIX));
890 $this->testOBJ->setStartingTimeEnabled(true);
891 } else {
892 $this->testOBJ->setStartingTime(null);
893 $this->testOBJ->setStartingTimeEnabled(false);
894 }
895 }
896
897 $ending_time = $form->getInput('ending_time');
898 if (is_string($ending_time) && $ending_time !== '') {
899 $this->testOBJ->setEndingTime((new ilDateTime($ending_time, IL_CAL_DATETIME))->get(IL_CAL_UNIX));
900 $this->testOBJ->setEndingTimeEnabled(true);
901 } else {
902 $this->testOBJ->setEndingTime(null);
903 $this->testOBJ->setEndingTimeEnabled(false);
904 }
905
906 if ($this->formPropertyExists($form, 'password_enabled')) {
907 $this->testOBJ->setPasswordEnabled((bool) $form->getInput('password_enabled'));
908
909 if ($form->getInput('password_enabled')) {
910 $this->testOBJ->setPassword($form->getInput('password'));
911 } else {
912 $this->testOBJ->setPassword(''); // otherwise test will still respect value
913 }
914 }
915
916 if ($this->formPropertyExists($form, 'fixedparticipants') && !$this->testOBJ->participantDataExist()) {
917 $this->testOBJ->setFixedParticipants((bool) $form->getInput('fixedparticipants'));
918 }
919
920 if ($this->formPropertyExists($form, 'limitUsers')) {
921 $this->testOBJ->setLimitUsersEnabled((bool) $form->getInput('limitUsers'));
922
923 if ($form->getInput('limitUsers')) {
924 $this->testOBJ->setAllowedUsers($form->getInput('allowedUsers'));
925 $this->testOBJ->setAllowedUsersTimeGap($form->getInput('allowedUsersTimeGap'));
926 } else {
927 $this->testOBJ->setAllowedUsers(''); // otherwise test will still respect value
928 }
929 }
930 }
931
936 {
937 // section header test run
938 $header = new ilFormSectionHeaderGUI();
939 $header->setTitle($this->lng->txt("tst_settings_header_test_run"));
940 $form->addItem($header);
941
942 // max. number of passes
943 $limitPasses = new ilCheckboxInputGUI($this->lng->txt("tst_limit_nr_of_tries"), 'limitPasses');
944 $limitPasses->setInfo($this->lng->txt("tst_nr_of_tries_desc"));
945 $limitPasses->setChecked($this->testOBJ->getNrOfTries() > 0);
946 $nr_of_tries = new ilNumberInputGUI($this->lng->txt("tst_nr_of_tries"), "nr_of_tries");
947 $nr_of_tries->setSize(3);
948 $nr_of_tries->allowDecimals(false);
949 $nr_of_tries->setMinValue(1);
950 $nr_of_tries->setMinvalueShouldBeGreater(false);
951 $nr_of_tries->setValue($this->testOBJ->getNrOfTries() ? $this->testOBJ->getNrOfTries() : 1);
952 $nr_of_tries->setRequired(true);
953 $limitPasses->addSubItem($nr_of_tries);
954 $blockAfterPassed = new ilCheckboxInputGUI(
955 $this->lng->txt('tst_block_passes_after_passed'),
956 'block_after_passed'
957 );
958 $blockAfterPassed->setInfo($this->lng->txt('tst_block_passes_after_passed_info'));
959 $blockAfterPassed->setChecked($this->testOBJ->isBlockPassesAfterPassedEnabled());
960 $limitPasses->addSubItem($blockAfterPassed);
961 if ($this->testOBJ->participantDataExist()) {
962 $limitPasses->setDisabled(true);
963 $blockAfterPassed->setDisabled(true);
964 $nr_of_tries->setDisabled(true);
965 }
966 $form->addItem($limitPasses);
967
968 // pass_waiting time between testruns
969 $pass_waiting_enabled = new ilCheckboxInputGUI($this->lng->txt('tst_pass_waiting_enabled'), 'pass_waiting_enabled');
970 $pass_waiting_enabled->setInfo($this->lng->txt('tst_pass_waiting_info'));
971 $pass_waiting_enabled->setChecked($this->testOBJ->isPassWaitingEnabled());
972
973 // pass_waiting
974 $duration = new ilDurationInputGUI($this->lng->txt("tst_pass_waiting_time"), "pass_waiting");
975
976 $duration->setShowMonths(true);
977 $duration->setShowDays(true);
978 $duration->setShowHours(true);
979 $duration->setShowMinutes(true);
980
981 $pw_time_array = ["00", "000", "00", "00", "00"];
982 if ($this->testOBJ->getPassWaiting() !== '') {
983 $pw_time_array = explode(':', $this->testOBJ->getPassWaiting());
984 }
985
986 $duration->setMonths((int) $pw_time_array[0]);
987 $duration->setDays((int) $pw_time_array[1]);
988 $duration->setHours((int) $pw_time_array[2]);
989 $duration->setMinutes((int) $pw_time_array[3]);
990 $duration->setRequired(false);
991 $pass_waiting_enabled->addSubItem($duration);
992
993 $form->addItem($pass_waiting_enabled);
994
995 // enable max. processing time
996 $processing = new ilCheckboxInputGUI($this->lng->txt("tst_processing_time"), "chb_processing_time");
997 $processing->setInfo($this->lng->txt("tst_processing_time_desc"));
998 $processing->setValue(1);
999
1000 if ($this->settingsTemplate && $this->getTemplateSettingValue('chb_processing_time')) {
1001 $processing->setChecked(true);
1002 } else {
1003 $processing->setChecked($this->testOBJ->getEnableProcessingTime());
1004 }
1005
1006 // max. processing time
1007 $processingtime = new ilNumberInputGUI($this->lng->txt("tst_processing_time_duration"), 'processing_time');
1008 $processingtime->allowDecimals(false);
1009 $processingtime->setMinValue(1);
1010 $processingtime->setMinvalueShouldBeGreater(false);
1011 $processingtime->setValue($this->testOBJ->getProcessingTimeAsMinutes());
1012 $processingtime->setSize(5);
1013 $processingtime->setSuffix($this->lng->txt('minutes'));
1014 $processingtime->setInfo($this->lng->txt("tst_processing_time_duration_desc"));
1015 $processing->addSubItem($processingtime);
1016
1017 // reset max. processing time
1018 $resetprocessing = new ilCheckboxInputGUI('', "chb_reset_processing_time");
1019 $resetprocessing->setValue(1);
1020 $resetprocessing->setOptionTitle($this->lng->txt("tst_reset_processing_time"));
1021 $resetprocessing->setChecked($this->testOBJ->getResetProcessingTime());
1022 $resetprocessing->setInfo($this->lng->txt("tst_reset_processing_time_desc"));
1023 $processing->addSubItem($resetprocessing);
1024 $form->addItem($processing);
1025
1026 if ($this->testOBJ->participantDataExist()) {
1027 $processing->setDisabled(true);
1028 $processingtime->setDisabled(true);
1029 $resetprocessing->setDisabled(true);
1030
1031 $duration->setDisabled(true);
1032 $pass_waiting_enabled->setDisabled(true);
1033 }
1034
1035 // kiosk mode
1036 $kiosk = new ilCheckboxInputGUI($this->lng->txt("kiosk"), "kiosk");
1037 $kiosk->setValue(1);
1038 $kiosk->setChecked($this->testOBJ->getKioskMode());
1039 $kiosk->setInfo($this->lng->txt("kiosk_description"));
1040
1041 // kiosk mode options
1042 $kiosktitle = new ilCheckboxGroupInputGUI($this->lng->txt("kiosk_options"), "kiosk_options");
1043 $kiosktitle->addOption(new ilCheckboxOption($this->lng->txt("kiosk_show_title"), 'kiosk_title', ''));
1044 $kiosktitle->addOption(new ilCheckboxOption($this->lng->txt("kiosk_show_participant"), 'kiosk_participant', ''));
1045 $values = array();
1046 if ($this->testOBJ->getShowKioskModeTitle()) {
1047 array_push($values, 'kiosk_title');
1048 }
1049 if ($this->testOBJ->getShowKioskModeParticipant()) {
1050 array_push($values, 'kiosk_participant');
1051 }
1052 $kiosktitle->setValue($values);
1053 $kiosktitle->setInfo($this->lng->txt("kiosk_options_desc"));
1054 $kiosk->addSubItem($kiosktitle);
1055
1056 $form->addItem($kiosk);
1057
1058 $examIdInPass = new ilCheckboxInputGUI($this->lng->txt('examid_in_test_pass'), 'examid_in_test_pass');
1059 $examIdInPass->setInfo($this->lng->txt('examid_in_test_pass_desc'));
1060 $examIdInPass->setChecked($this->testOBJ->isShowExamIdInTestPassEnabled());
1061 $form->addItem($examIdInPass);
1062 }
1063
1068 {
1069 if (!$this->testOBJ->participantDataExist()) {
1070 // nr of tries (max passes)
1071 if ($form->getItemByPostVar('limitPasses') instanceof ilFormPropertyGUI) {
1072 if ($form->getInput('limitPasses')) {
1073 $this->testOBJ->setNrOfTries($form->getInput('nr_of_tries'));
1074
1075 $this->testOBJ->setBlockPassesAfterPassedEnabled(
1076 (bool) $form->getInput('block_after_passed')
1077 );
1078 } else {
1079 $this->testOBJ->setNrOfTries(0);
1080 $this->testOBJ->setBlockPassesAfterPassedEnabled(false);
1081 }
1082 }
1083
1084 // pass_waiting
1085 if ($form->getItemByPostVar('pass_waiting_enabled') instanceof ilFormPropertyGUI) {
1086 if ($form->getInput('pass_waiting_enabled')) {
1087 $pass_waiting_values = $form->getInput('pass_waiting');
1088
1089 $pass_waiting_duration[] = sprintf("%'.02d", $pass_waiting_values['MM'] ?? 0);
1090 $pass_waiting_duration[] = sprintf("%'.03d", $pass_waiting_values['dd'] ?? 0);
1091 $pass_waiting_duration[] = sprintf("%'.02d", $pass_waiting_values['hh'] ?? 0);
1092 $pass_waiting_duration[] = sprintf("%'.02d", $pass_waiting_values['mm'] ?? 0);
1093 $pass_waiting_duration[] = sprintf("%'.02d", $pass_waiting_values['ss'] ?? 0);
1094
1095 $pass_waiting_string = implode(':', $pass_waiting_duration);
1096 $this->testOBJ->setPassWaiting($pass_waiting_string);
1097 } else {
1098 $this->testOBJ->setPassWaiting("00:000:00:00:00");
1099 }
1100 }
1101
1102 $this->testOBJ->setEnableProcessingTime($form->getInput('chb_processing_time'));
1103 if ($this->testOBJ->getEnableProcessingTime()) {
1104 $this->testOBJ->setProcessingTimeByMinutes($form->getInput('processing_time'));
1105 $this->testOBJ->setResetProcessingTime($form->getInput('chb_reset_processing_time'));
1106 } else {
1107 $this->testOBJ->setProcessingTime('');
1108 $this->testOBJ->setResetProcessingTime(false);
1109 }
1110 }
1111
1112 if ($form->getItemByPostVar('kiosk') instanceof ilFormPropertyGUI) {
1113 $this->testOBJ->setKioskMode($form->getInput('kiosk'));
1114 $kioskOptions = $form->getInput('kiosk_options');
1115 if (is_array($kioskOptions)) {
1116 $this->testOBJ->setShowKioskModeTitle(in_array('kiosk_title', $kioskOptions, true));
1117 $this->testOBJ->setShowKioskModeParticipant(in_array('kiosk_participant', $kioskOptions, true));
1118 } else {
1119 $this->testOBJ->setShowKioskModeTitle(false);
1120 $this->testOBJ->setShowKioskModeParticipant(false);
1121 }
1122 }
1123
1124 if ($form->getItemByPostVar('examid_in_test_pass') instanceof ilFormPropertyGUI) {
1125 $this->testOBJ->setShowExamIdInTestPassEnabled((bool) $form->getInput('examid_in_test_pass'));
1126 }
1127 }
1128
1133 {
1134 $fields = array(
1135 'title_output', 'autosave', 'chb_shuffle_questions', 'chb_shuffle_questions',
1136 'offer_hints', 'instant_feedback_contents', 'instant_feedback_trigger',
1137 'answer_fixation_handling', 'obligations_enabled'
1138 );
1139
1140 if ($this->isSectionHeaderRequired($fields) || $this->isCharSelectorPropertyRequired()) {
1141 // sequence properties
1142 $seqheader = new ilFormSectionHeaderGUI();
1143 $seqheader->setTitle($this->lng->txt("tst_presentation_properties"));
1144 $form->addItem($seqheader);
1145 }
1146
1147 // question title output
1148 $title_output = new ilRadioGroupInputGUI($this->lng->txt("tst_title_output"), "title_output");
1149 $title_output->addOption(new ilRadioOption($this->lng->txt("tst_title_output_full"), 0, ''));
1150 $title_output->addOption(new ilRadioOption($this->lng->txt("tst_title_output_hide_points"), 1, ''));
1151 $title_output->addOption(new ilRadioOption($this->lng->txt("tst_title_output_no_title"), 2, ''));
1152 $title_output->setValue($this->testOBJ->getTitleOutput());
1153 $form->addItem($title_output);
1154
1155 // Autosave
1156 $autosave_output = new ilCheckboxInputGUI($this->lng->txt('autosave'), 'autosave');
1157 $autosave_output->setValue(1);
1158 $autosave_output->setChecked($this->testOBJ->getAutosave());
1159 $autosave_output->setInfo($this->lng->txt('autosave_info'));
1160 $autosave_interval = new ilTextInputGUI($this->lng->txt('autosave_ival'), 'autosave_ival');
1161 $autosave_interval->setSize(10);
1162 $autosave_interval->setValue($this->testOBJ->getAutosaveIval() / 1000);
1163 $autosave_interval->setSuffix($this->lng->txt('seconds'));
1164 $autosave_output->addSubItem($autosave_interval);
1165 $form->addItem($autosave_output);
1166
1167 // shuffle questions
1168 $shuffle = new ilCheckboxInputGUI($this->lng->txt("tst_shuffle_questions"), "chb_shuffle_questions");
1169 $shuffle->setValue(1);
1170 $shuffle->setChecked($this->testOBJ->getShuffleQuestions());
1171 $shuffle->setInfo($this->lng->txt("tst_shuffle_questions_description"));
1172 $form->addItem($shuffle);
1173
1174 // offer hints
1175 $checkBoxOfferHints = new ilCheckboxInputGUI($this->lng->txt('tst_setting_offer_hints_label'), 'offer_hints');
1176 $checkBoxOfferHints->setChecked((bool) $this->testOBJ->isOfferingQuestionHintsEnabled());
1177 $checkBoxOfferHints->setInfo($this->lng->txt('tst_setting_offer_hints_info'));
1178 $form->addItem($checkBoxOfferHints);
1179
1180 // instant feedback
1181 $instant_feedback_enabled = new ilCheckboxInputGUI($this->lng->txt('tst_instant_feedback'), 'instant_feedback_enabled');
1182 $instant_feedback_enabled->setInfo($this->lng->txt('tst_instant_feedback_desc'));
1183 $instant_feedback_enabled->setChecked($this->testOBJ->isAnyInstantFeedbackOptionEnabled());
1184 $form->addItem($instant_feedback_enabled);
1185 $instant_feedback_contents = new ilCheckboxGroupInputGUI($this->lng->txt('tst_instant_feedback_contents'), 'instant_feedback_contents');
1186 $instant_feedback_contents->setRequired(true);
1187 $instant_feedback_contents->addOption(new ilCheckboxOption(
1188 $this->lng->txt('tst_instant_feedback_results'),
1189 'instant_feedback_points',
1190 $this->lng->txt('tst_instant_feedback_results_desc')
1191 ));
1192 $instant_feedback_contents->addOption(new ilCheckboxOption(
1193 $this->lng->txt('tst_instant_feedback_answer_generic'),
1194 'instant_feedback_generic',
1195 $this->lng->txt('tst_instant_feedback_answer_generic_desc')
1196 ));
1197 $instant_feedback_contents->addOption(new ilCheckboxOption(
1198 $this->lng->txt('tst_instant_feedback_answer_specific'),
1199 'instant_feedback_specific',
1200 $this->lng->txt('tst_instant_feedback_answer_specific_desc')
1201 ));
1202 $instant_feedback_contents->addOption(new ilCheckboxOption(
1203 $this->lng->txt('tst_instant_feedback_solution'),
1204 'instant_feedback_solution',
1205 $this->lng->txt('tst_instant_feedback_solution_desc')
1206 ));
1207 $instant_feedback_contents->setValue($this->testOBJ->getInstantFeedbackOptionsAsArray());
1208 $instant_feedback_enabled->addSubItem($instant_feedback_contents);
1209 $instant_feedback_trigger = new ilRadioGroupInputGUI(
1210 $this->lng->txt('tst_instant_feedback_trigger'),
1211 'instant_feedback_trigger'
1212 );
1213 $ifbTriggerOpt = new ilRadioOption(
1214 $this->lng->txt('tst_instant_feedback_trigger_manual'),
1215 self::INSTANT_FEEDBACK_TRIGGER_MANUAL
1216 );
1217 $ifbTriggerOpt->setInfo($this->lng->txt('tst_instant_feedback_trigger_manual_desc'));
1218 $instant_feedback_trigger->addOption($ifbTriggerOpt);
1219 $ifbTriggerOpt = new ilRadioOption(
1220 $this->lng->txt('tst_instant_feedback_trigger_forced'),
1221 self::INSTANT_FEEDBACK_TRIGGER_FORCED
1222 );
1223 $ifbTriggerOpt->setInfo($this->lng->txt('tst_instant_feedback_trigger_forced_desc'));
1224 $instant_feedback_trigger->addOption($ifbTriggerOpt);
1225 $instant_feedback_trigger->setValue($this->testOBJ->isForceInstantFeedbackEnabled() ? 1 : 0);
1226 $instant_feedback_enabled->addSubItem($instant_feedback_trigger);
1227
1228 $answerFixation = new ilRadioGroupInputGUI(
1229 $this->lng->txt('tst_answer_fixation_handling'),
1230 'answer_fixation_handling'
1231 );
1232 $radioOption = new ilRadioOption(
1233 $this->lng->txt('tst_answer_fixation_none'),
1234 self::ANSWER_FIXATION_NONE
1235 );
1236 $radioOption->setInfo($this->lng->txt('tst_answer_fixation_none_desc'));
1237 $answerFixation->addOption($radioOption);
1238 $radioOption = new ilRadioOption(
1239 $this->lng->txt('tst_answer_fixation_on_instant_feedback'),
1240 self::ANSWER_FIXATION_ON_INSTANT_FEEDBACK
1241 );
1242 $radioOption->setInfo($this->lng->txt('tst_answer_fixation_on_instant_feedback_desc'));
1243 $answerFixation->addOption($radioOption);
1244 $radioOption = new ilRadioOption(
1245 $this->lng->txt('tst_answer_fixation_on_followup_question'),
1246 self::ANSWER_FIXATION_ON_FOLLOWUP_QUESTION
1247 );
1248 $radioOption->setInfo($this->lng->txt('tst_answer_fixation_on_followup_question_desc'));
1249 $answerFixation->addOption($radioOption);
1250 $radioOption = new ilRadioOption(
1251 $this->lng->txt('tst_answer_fixation_on_instantfb_or_followupqst'),
1252 self::ANSWER_FIXATION_ON_IFB_OR_FUQST
1253 );
1254 $radioOption->setInfo($this->lng->txt('tst_answer_fixation_on_instantfb_or_followupqst_desc'));
1255 $answerFixation->addOption($radioOption);
1256 $answerFixation->setValue($this->getAnswerFixationSettingsAsFormValue());
1257 $form->addItem($answerFixation);
1258
1259 // enable obligations
1260 $checkBoxEnableObligations = new ilCheckboxInputGUI($this->lng->txt('tst_setting_enable_obligations_label'), 'obligations_enabled');
1261 $checkBoxEnableObligations->setChecked($this->testOBJ->areObligationsEnabled());
1262 $checkBoxEnableObligations->setInfo($this->lng->txt('tst_setting_enable_obligations_info'));
1263 $form->addItem($checkBoxEnableObligations);
1264
1265 // selector for unicode characters
1266 if ($this->isCharSelectorPropertyRequired()) {
1267 require_once 'Services/UIComponent/CharSelector/classes/class.ilCharSelectorGUI.php';
1269 $char_selector->getConfig()->setAvailability((int) $this->testOBJ->getCharSelectorAvailability());
1270 $char_selector->getConfig()->setDefinition((string) $this->testOBJ->getCharSelectorDefinition());
1271 $char_selector->addFormProperties($form);
1272 $char_selector->setFormValues($form);
1273 }
1274
1275 if ($this->testOBJ->participantDataExist()) {
1276 $checkBoxOfferHints->setDisabled(true);
1277 $instant_feedback_enabled->setDisabled(true);
1278 $instant_feedback_trigger->setDisabled(true);
1279 $instant_feedback_contents->setDisabled(true);
1280 $answerFixation->setDisabled(true);
1281 $checkBoxEnableObligations->setDisabled(true);
1282 }
1283 }
1284
1289 {
1290 if ($form->getItemByPostVar('title_output') instanceof ilFormPropertyGUI) {
1291 $this->testOBJ->setTitleOutput($form->getInput('title_output'));
1292 }
1293
1294 if ($form->getItemByPostVar('autosave') instanceof ilFormPropertyGUI) {
1295 $this->testOBJ->setAutosave((bool) $form->getInput('autosave'));
1296 $this->testOBJ->setAutosaveIval($form->getInput('autosave_ival') * 1000);
1297 }
1298
1299 if ($form->getItemByPostVar('chb_shuffle_questions') instanceof ilFormPropertyGUI) {
1300 $this->testOBJ->setShuffleQuestions((bool) $form->getInput('chb_shuffle_questions'));
1301 }
1302
1303 if (!$this->testOBJ->participantDataExist() && $this->formPropertyExists($form, 'offer_hints')) {
1304 $this->testOBJ->setOfferingQuestionHintsEnabled((bool) $form->getInput('offer_hints'));
1305 }
1306
1307 if (!$this->testOBJ->participantDataExist() && $this->formPropertyExists($form, 'instant_feedback_enabled')) {
1308 if ($form->getInput('instant_feedback_enabled')) {
1309 if ($this->formPropertyExists($form, 'instant_feedback_contents')) {
1310 $this->testOBJ->setInstantFeedbackOptionsByArray(
1311 $form->getInput('instant_feedback_contents')
1312 );
1313 }
1314 if ($this->formPropertyExists($form, 'instant_feedback_trigger')) {
1315 $this->testOBJ->setForceInstantFeedbackEnabled(
1316 (bool) $form->getInput('instant_feedback_trigger')
1317 );
1318 }
1319 } else {
1320 $this->testOBJ->setInstantFeedbackOptionsByArray(array());
1321 $this->testOBJ->setForceInstantFeedbackEnabled(false);
1322 }
1323 }
1324
1325 if (!$this->testOBJ->participantDataExist() && $this->formPropertyExists($form, 'answer_fixation_handling')) {
1326 $this->setAnswerFixationSettingsByFormValue($form->getInput('answer_fixation_handling'));
1327 }
1328
1329 if (!$this->testOBJ->participantDataExist() && $this->formPropertyExists($form, 'obligations_enabled')) {
1330 $this->testOBJ->setObligationsEnabled((bool) $form->getInput('obligations_enabled'));
1331 }
1332
1333 if ($this->isCharSelectorPropertyRequired()) {
1334 require_once 'Services/UIComponent/CharSelector/classes/class.ilCharSelectorGUI.php';
1336 $char_selector->addFormProperties($form);
1337 $char_selector->getFormValues($form);
1338 $this->testOBJ->setCharSelectorAvailability($char_selector->getConfig()->getAvailability());
1339 $this->testOBJ->setCharSelectorDefinition($char_selector->getConfig()->getDefinition());
1340 }
1341 }
1342
1347 {
1348 // sequence properties
1349 $seqheader = new ilFormSectionHeaderGUI();
1350 $seqheader->setTitle($this->lng->txt("tst_sequence_properties"));
1351 $form->addItem($seqheader);
1352
1353 // use previous answers
1354 $prevanswers = new ilCheckboxInputGUI($this->lng->txt("tst_use_previous_answers"), "chb_use_previous_answers");
1355 $prevanswers->setValue(1);
1356 $prevanswers->setChecked($this->testOBJ->getUsePreviousAnswers());
1357 $prevanswers->setInfo($this->lng->txt("tst_use_previous_answers_description"));
1358 $form->addItem($prevanswers);
1359
1360 // show suspend test
1361 $cancel = new ilCheckboxInputGUI($this->lng->txt("tst_show_cancel"), "chb_show_cancel");
1362 $cancel->setValue(1);
1363 $cancel->setChecked($this->testOBJ->getShowCancel());
1364 $cancel->setInfo($this->lng->txt("tst_show_cancel_description"));
1365 $form->addItem($cancel);
1366
1367 // postpone questions
1368 $postpone = new ilRadioGroupInputGUI($this->lng->txt("tst_postpone"), "postpone");
1369 $postpone->addOption(new ilRadioOption(
1370 $this->lng->txt("tst_postpone_off"),
1371 0,
1372 $this->lng->txt("tst_postpone_off_desc")
1373 ));
1374 $postpone->addOption(new ilRadioOption(
1375 $this->lng->txt("tst_postpone_on"),
1376 1,
1377 $this->lng->txt("tst_postpone_on_desc")
1378 ));
1379 $postpone->setValue($this->testOBJ->getSequenceSettings());
1380 $form->addItem($postpone);
1381
1382 // show list of questions
1383 $list_of_questions = new ilCheckboxInputGUI($this->lng->txt("tst_show_summary"), "list_of_questions");
1384 //$list_of_questions->setOptionTitle($this->lng->txt("tst_show_summary"));
1385 $list_of_questions->setValue(1);
1386 $list_of_questions->setChecked($this->testOBJ->getListOfQuestions());
1387 $list_of_questions->setInfo($this->lng->txt("tst_show_summary_description"));
1388
1389 $list_of_questions_options = new ilCheckboxGroupInputGUI('', "list_of_questions_options");
1390 $list_of_questions_options->addOption(new ilCheckboxOption($this->lng->txt("tst_list_of_questions_start"), 'chb_list_of_questions_start', ''));
1391 $list_of_questions_options->addOption(new ilCheckboxOption($this->lng->txt("tst_list_of_questions_end"), 'chb_list_of_questions_end', ''));
1392 $list_of_questions_options->addOption(new ilCheckboxOption($this->lng->txt("tst_list_of_questions_with_description"), 'chb_list_of_questions_with_description', ''));
1393 $values = array();
1394 if ($this->testOBJ->getListOfQuestionsStart()) {
1395 array_push($values, 'chb_list_of_questions_start');
1396 }
1397 if ($this->testOBJ->getListOfQuestionsEnd()) {
1398 array_push($values, 'chb_list_of_questions_end');
1399 }
1400 if ($this->testOBJ->getListOfQuestionsDescription()) {
1401 array_push($values, 'chb_list_of_questions_with_description');
1402 }
1403 $list_of_questions_options->setValue($values);
1404
1405 $list_of_questions->addSubItem($list_of_questions_options);
1406 $form->addItem($list_of_questions);
1407
1408 // show question marking
1409 $marking = new ilCheckboxInputGUI($this->lng->txt("question_marking"), "chb_show_marker");
1410 $marking->setValue(1);
1411 $marking->setChecked($this->testOBJ->getShowMarker());
1412 $marking->setInfo($this->lng->txt("question_marking_description"));
1413 $form->addItem($marking);
1414 }
1415
1420 {
1421 if ($this->formPropertyExists($form, 'chb_use_previous_answers')) {
1422 $this->testOBJ->setUsePreviousAnswers($form->getInput('chb_use_previous_answers'));
1423 }
1424
1425 if ($this->formPropertyExists($form, 'chb_show_cancel')) {
1426 $this->testOBJ->setShowCancel((bool) $form->getInput('chb_show_cancel'));
1427 }
1428
1429 if ($this->formPropertyExists($form, 'postpone')) {
1430 $this->testOBJ->setPostponingEnabled((bool) $form->getInput('postpone'));
1431 }
1432
1433 $this->testOBJ->setListOfQuestions((bool) $form->getInput('list_of_questions'));
1434 $listOfQuestionsOptions = $form->getInput('list_of_questions_options');
1435 if (is_array($listOfQuestionsOptions)) {
1436 $this->testOBJ->setListOfQuestionsStart(in_array('chb_list_of_questions_start', $listOfQuestionsOptions));
1437 $this->testOBJ->setListOfQuestionsEnd(in_array('chb_list_of_questions_end', $listOfQuestionsOptions));
1438 $this->testOBJ->setListOfQuestionsDescription(in_array('chb_list_of_questions_with_description', $listOfQuestionsOptions));
1439 } else {
1440 $this->testOBJ->setListOfQuestionsStart(0);
1441 $this->testOBJ->setListOfQuestionsEnd(0);
1442 $this->testOBJ->setListOfQuestionsDescription(0);
1443 }
1444
1445 if ($this->formPropertyExists($form, 'chb_show_marker')) {
1446 $this->testOBJ->setShowMarker((bool) $form->getInput('chb_show_marker'));
1447 }
1448 }
1449
1454 {
1455 $testFinishHeader = new ilFormSectionHeaderGUI();
1456 $testFinishHeader->setTitle($this->lng->txt("tst_final_information"));
1457 $form->addItem($testFinishHeader);
1458
1459 // examview
1460 $enable_examview = new ilCheckboxInputGUI($this->lng->txt("enable_examview"), 'enable_examview');
1461 $enable_examview->setValue(1);
1462 $enable_examview->setChecked($this->testOBJ->getEnableExamview());
1463 $enable_examview->setInfo($this->lng->txt("enable_examview_desc"));
1464 $show_examview_pdf = new ilCheckboxInputGUI('', 'show_examview_pdf');
1465 $show_examview_pdf->setValue(1);
1466 $show_examview_pdf->setChecked($this->testOBJ->getShowExamviewPdf());
1467 $show_examview_pdf->setOptionTitle($this->lng->txt("show_examview_pdf"));
1468 $enable_examview->addSubItem($show_examview_pdf);
1469 $form->addItem($enable_examview);
1470
1471 // show final statement
1472 $showfinal = new ilCheckboxInputGUI($this->lng->txt("final_statement"), "showfinalstatement");
1473 $showfinal->setChecked($this->testOBJ->getShowFinalStatement());
1474 $showfinal->setInfo($this->lng->txt("final_statement_show_desc"));
1475 $form->addItem($showfinal);
1476 // final statement
1477 $finalstatement = new ilTextAreaInputGUI($this->lng->txt("final_statement"), "finalstatement");
1478 $finalstatement->setRequired(true);
1479 $finalstatement->setValue((string) $this->testOBJ->prepareTextareaOutput($this->testOBJ->getFinalStatement(), false, true));
1480 $finalstatement->setRows(10);
1481 $finalstatement->setCols(80);
1482 $finalstatement->setUseRte(true);
1483 $finalstatement->addPlugin("latex");
1484 $finalstatement->addButton("latex");
1485 $finalstatement->setRTESupport($this->testOBJ->getId(), "tst", "assessment");
1486 $finalstatement->setRteTagSet('full');
1487 $showfinal->addSubItem($finalstatement);
1488
1489 $redirection_mode = $this->testOBJ->getRedirectionMode();
1490 $rm_enabled = new ilCheckboxInputGUI($this->lng->txt('redirect_after_finishing_tst'), 'redirection_enabled');
1491 $rm_enabled->setInfo($this->lng->txt('redirect_after_finishing_tst_desc'));
1492 $rm_enabled->setChecked($redirection_mode == '0' ? false : true);
1493 $radio_rm = new ilRadioGroupInputGUI($this->lng->txt('redirect_after_finishing_rule'), 'redirection_mode');
1494 $always = new ilRadioOption($this->lng->txt('redirect_always'), REDIRECT_ALWAYS);
1495 $radio_rm->addOption($always);
1496 $kiosk = new ilRadioOption($this->lng->txt('redirect_in_kiosk_mode'), REDIRECT_KIOSK);
1497 $radio_rm->addOption($kiosk);
1498 $radio_rm->setValue(in_array($redirection_mode, array(REDIRECT_ALWAYS, REDIRECT_KIOSK)) ? $redirection_mode : REDIRECT_ALWAYS);
1499 $rm_enabled->addSubItem($radio_rm);
1500 $redirection_url = new ilTextInputGUI($this->lng->txt('redirection_url'), 'redirection_url');
1501 $redirection_url->setValue((string) $this->testOBJ->getRedirectionUrl());
1502 $redirection_url->setRequired(true);
1503 $redirection_url->setMaxLength(128);
1504 $rm_enabled->addSubItem($redirection_url);
1505
1506 $form->addItem($rm_enabled);
1507
1508 // Sign submission
1509 $sign_submission = $this->testOBJ->getSignSubmission();
1510 $sign_submission_enabled = new ilCheckboxInputGUI($this->lng->txt('sign_submission'), 'sign_submission');
1511 $sign_submission_enabled->setChecked($sign_submission);
1512 $sign_submission_enabled->setInfo($this->lng->txt('sign_submission_info'));
1513 $form->addItem($sign_submission_enabled);
1514
1515 // mail notification
1516 $mailnotification = new ilCheckboxInputGUI($this->lng->txt("tst_finish_notification"), "mailnotification");
1517 $mailnotification->setInfo($this->lng->txt("tst_finish_notification_desc"));
1518 $mailnotification->setChecked($this->testOBJ->getMailNotification() > 0);
1519 $form->addItem($mailnotification);
1520
1521 $mailnotificationContent = new ilRadioGroupInputGUI($this->lng->txt("tst_finish_notification_content"), "mailnotification_content");
1522 $mailnotificationContent->addOption(new ilRadioOption($this->lng->txt("tst_finish_notification_simple"), 1, ''));
1523 $mailnotificationContent->addOption(new ilRadioOption($this->lng->txt("tst_finish_notification_advanced"), 2, ''));
1524 $mailnotificationContent->setValue($this->testOBJ->getMailNotification() ? $this->testOBJ->getMailNotification() : 1);
1525 $mailnotificationContent->setRequired(true);
1526 $mailnotification->addSubItem($mailnotificationContent);
1527
1528 $mailnottype = new ilCheckboxInputGUI('', "mailnottype");
1529 $mailnottype->setValue(1);
1530 $mailnottype->setOptionTitle($this->lng->txt("mailnottype"));
1531 $mailnottype->setInfo($this->lng->txt("mailnottype_desc"));
1532 $mailnottype->setChecked($this->testOBJ->getMailNotificationType());
1533 $mailnotification->addSubItem($mailnottype);
1534 }
1535
1540 {
1541 if ($this->formPropertyExists($form, 'enable_examview')) {
1542 $this->testOBJ->setEnableExamview((bool) $form->getInput('enable_examview'));
1543 $this->testOBJ->setShowExamviewPdf((bool) $form->getInput('show_examview_pdf'));
1544 }
1545
1546 $this->testOBJ->setShowFinalStatement((bool) $form->getInput('showfinalstatement'));
1547 $this->testOBJ->setFinalStatement($form->getInput('finalstatement') ?? '');
1548
1549 if ($this->formPropertyExists($form, 'redirection_enabled')) {
1550 if (empty($form->getInput('redirection_enabled'))) {
1551 $this->testOBJ->setRedirectionMode(REDIRECT_NONE);
1552 } else {
1553 $this->testOBJ->setRedirectionMode(($form->getInput('redirection_mode')));
1554 }
1555 } else {
1556 $this->testOBJ->setRedirectionMode(REDIRECT_NONE);
1557 }
1558 if ($this->formPropertyExists($form, 'redirection_url')) {
1559 $this->testOBJ->setRedirectionUrl($form->getInput('redirection_url'));
1560 } else {
1561 $this->testOBJ->setRedirectionUrl(null);
1562 }
1563
1564 if ($this->formPropertyExists($form, 'sign_submission')) {
1565 $this->testOBJ->setSignSubmission((bool) $form->getInput('sign_submission'));
1566 }
1567
1568 if ($this->formPropertyExists($form, 'mailnotification') && $form->getInput('mailnotification')) {
1569 $this->testOBJ->setMailNotification($form->getInput('mailnotification_content'));
1570 $this->testOBJ->setMailNotificationType($form->getInput('mailnottype'));
1571 } else {
1572 $this->testOBJ->setMailNotification(0);
1573 $this->testOBJ->setMailNotificationType(false);
1574 }
1575 }
1576
1577 protected function setAnswerFixationSettingsByFormValue($formValue)
1578 {
1579 switch ($formValue) {
1581 $this->testOBJ->setInstantFeedbackAnswerFixationEnabled(false);
1582 $this->testOBJ->setFollowupQuestionAnswerFixationEnabled(false);
1583 break;
1585 $this->testOBJ->setInstantFeedbackAnswerFixationEnabled(true);
1586 $this->testOBJ->setFollowupQuestionAnswerFixationEnabled(false);
1587 break;
1589 $this->testOBJ->setInstantFeedbackAnswerFixationEnabled(false);
1590 $this->testOBJ->setFollowupQuestionAnswerFixationEnabled(true);
1591 break;
1593 $this->testOBJ->setInstantFeedbackAnswerFixationEnabled(true);
1594 $this->testOBJ->setFollowupQuestionAnswerFixationEnabled(true);
1595 break;
1596 }
1597 }
1598
1599 protected function getAnswerFixationSettingsAsFormValue(): string
1600 {
1601 if ($this->testOBJ->isInstantFeedbackAnswerFixationEnabled() && $this->testOBJ->isFollowupQuestionAnswerFixationEnabled()) {
1603 }
1604
1605 if ($this->testOBJ->isFollowupQuestionAnswerFixationEnabled()) {
1607 }
1608
1609 if ($this->testOBJ->isInstantFeedbackAnswerFixationEnabled()) {
1611 }
1612
1614 }
1615}
const IL_CAL_UNIX
const IL_CAL_DATETIME
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This class represents a checkbox property in a property form.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
@classDescription Date and time handling
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This class represents a property in a property form.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
language handling
This class represents a number property in a property form.
Class ilObjTestGUI.
saveQuestionBehaviourProperties(ilPropertyFormGUI $form)
confirmedResetTemplateCmd()
Enable all settings - remove template.
showResetTemplateConfirmationCmd()
Enable all settings - Confirmation.
isSkillServiceSettingToBeAdjusted(ilPropertyFormGUI $form)
showConfirmation(ilPropertyFormGUI $form, $oldQuestionSetType, $newQuestionSetType, $hasQuestionsWithoutQuestionpool)
ilTestQuestionSetConfigFactory $testQuestionSetConfigFactory
addQuestionBehaviourProperties(ilPropertyFormGUI $form)
const QUESTION_SET_TYPE_RANDOM
const QUESTION_SET_TYPE_FIXED
static isSkillManagementGloballyActivated()
User class.
static updateServiceSettingsForm(int $obj_id, ilPropertyFormGUI $form, array $services)
static initServiceSettingsForm(int $obj_id, ilPropertyFormGUI $form, array $services)
static _getAllReferences(int $id)
get all reference ids for object ID
This class represents a property form user interface.
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-...
getItemByPostVar(string $a_post_var)
This class represents a property in a property form.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
formPropertyExists(ilPropertyFormGUI $form, $propertyId)
getTemplateSettingValue($settingName)
removeHiddenItems(ilPropertyFormGUI $form)
__construct(ilObjTest $testOBJ)
This class represents a text area property in a property form.
This class represents a text property in a property form.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static stripSlashes(string $a_str, bool $a_strip_html=true, string $a_allow="")
global $DIC
Definition: feed.php:28
$errors
Definition: imgupload.php:65
const REDIRECT_NONE
Redirect after finishing test constants.
const REDIRECT_ALWAYS
const REDIRECT_KIOSK
This is how the factory for UI elements looks.
Definition: Factory.php:38
An entity that renders components to a string output.
Definition: Renderer.php:31
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Readable part of repository interface to ilComponentDataDB.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Interface ilDBInterface.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
global $ilSetting
Definition: privfeed.php:17
$message
Definition: xapiexit.php:32