ILIAS  trunk Revision v12.0_alpha-377-g3641b37b9db
class.ilObjCourseGUI.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=0);
20
23use ILIAS\News\Service as News;
25use ILIAS\Data\Factory as ilDataFactory;
27
50{
51 public const BREADCRUMB_DEFAULT = 0;
52 public const BREADCRUMB_CRS_ONLY = 1;
53 public const BREADCRUMB_FULL_PATH = 2;
54 protected News $news;
55
58
61 protected Factory $refinery;
62 protected ilHelpGUI $help;
64 protected ilDataFactory $data_factory;
65
66 public function __construct($a_data, int $a_id, bool $a_call_by_reference = true, bool $a_prepare_output = true)
67 {
68 global $DIC;
69
70 $this->type = "crs";
71 parent::__construct($a_data, $a_id, $a_call_by_reference, $a_prepare_output);
72
73 $this->help = $DIC->help();
74 $this->logger = $DIC->logger()->crs();
75 $this->navigation_history = $DIC['ilNavigationHistory'];
76 $this->ctrl->saveParameter($this, ['ref_id']);
77 $this->lng->loadLanguageModule('crs');
78 $this->lng->loadLanguageModule('cert');
79 $this->lng->loadLanguageModule('obj');
80 $this->data_factory = new ilDataFactory();
81 $this->http = $DIC->http();
82 $this->refinery = $DIC->refinery();
83 $this->news = $DIC->news();
84 }
85
89 public function gatewayObject(): void
90 {
91 $this->viewObject();
92 }
93
94 protected function afterImport(ilObject $new_object): void
95 {
97 $part->add($this->user->getId(), ilCourseConstants::CRS_ADMIN);
98 $part->updateNotification(
99 $this->user->getId(),
100 (bool) $this->settings->get('mail_crs_admin_notification', '1')
101 );
102 parent::afterImport($new_object);
103 }
104
105 public function renderObject(): void
106 {
107 $this->viewObject();
108 }
109
110 public function viewObject(): void
111 {
112 if (strtolower($this->std_request->getBaseClass()) === "iladministrationgui") {
113 parent::viewObject();
114 return;
115 }
116
117 $this->tabs_gui->setTabActive('view_content');
118 $this->checkPermission('read', 'view');
119
120 if (strtolower($this->std_request->getBaseClass()) === "iladministrationgui") {
121 parent::viewObject();
122 return;
123 }
124
125 // Trac access
126 if ($this->ctrl->getNextClass() != "ilcolumngui") {
128 $this->user->getId(),
129 $this->object->getId(),
130 $this->object->getRefId(),
131 'crs'
132 );
133 }
134
135 if (!$this->checkAgreement()) {
136 $this->ctrl->redirectByClass(ilMemberAgreementGUI::class);
137 }
138
139 if (!$this->__checkStartObjects()) {
141 $obj = $this->object;
142 $stgui = new ilContainerStartObjectsContentGUI($this, $obj);
143 $stgui->enableDesktop($this->object->getAboStatus(), $this);
144 $stgui->getHTML();
145 return;
146 }
147 // views handled by general container logic
148 if (
149 $this->object->getViewMode() == ilContainer::VIEW_SIMPLE ||
150 $this->object->getViewMode() == ilContainer::VIEW_BY_TYPE ||
151 $this->object->getViewMode() == ilContainer::VIEW_SESSIONS ||
152 $this->object->getViewMode() == ilContainer::VIEW_TIMING ||
153 $this->object->getViewMode() == ilContainer::VIEW_OBJECTIVE
154 ) {
155 parent::renderObject();
156 }
157
158 if ($this->isActiveAdministrationPanel()) {
160 }
161 }
162
163 public function deleteObject(bool $error = false): void
164 {
165 $this->tabs_gui->activateTab('view_content');
166 parent::deleteObject($error);
167 }
168
169 public function renderContainer(): void
170 {
171 parent::renderObject();
172 }
173
180 public function infoScreenObject(): void
181 {
182 $this->ctrl->redirectByClass([
183 static::class,
184 ilInfoScreenGUI::class
185 ]);
186 }
187
188 public function infoScreen(): void
189 {
190 if (!$this->checkPermissionBool('read')) {
191 $this->checkPermission('visible');
192 }
193
194 $this->tabs_gui->setTabActive('info_short');
195 $files = ilCourseFile::_readFilesByCourse($this->object->getId());
196
197 $info = new ilInfoScreenGUI($this);
198 $info->enablePrivateNotes();
199 $info->enableFeedback();
200 $info->enableNews();
201 $info->enableBookingInfo(true);
202 if ($this->access->checkAccess("write", "", $this->ref_id)) {
203 $info->enableNewsEditing();
204 }
205
206 if (
207 strlen($this->object->getImportantInformation()) ||
208 strlen($this->object->getSyllabus()) ||
209 strlen((string) $this->object->getTargetGroup()) ||
210 count($files)) {
211 $info->addSection($this->lng->txt('crs_general_informations'));
212 }
213
214 if (strlen($this->object->getImportantInformation())) {
215 $info->addProperty(
216 $this->lng->txt('crs_important_info'),
217 "<strong>" . nl2br(
218 ilUtil::makeClickable($this->object->getImportantInformation(), true) . "</strong>"
219 )
220 );
221 }
222 if (strlen($this->object->getSyllabus())) {
223 $info->addProperty($this->lng->txt('crs_syllabus'), nl2br(
224 ilUtil::makeClickable($this->object->getSyllabus(), true)
225 ));
226 }
227 if (strlen((string) $this->object->getTargetGroup())) {
228 $info->addProperty(
229 $this->lng->txt('crs_target_group'),
230 nl2br(
231 \ilUtil::makeClickable($this->object->getTargetGroup(), true)
232 )
233 );
234 }
235 // files
236 if ($files !== []) {
237 $tpl = new ilTemplate('tpl.event_info_file.html', true, true, 'components/ILIAS/Course');
238
239 foreach ($files as $file) {
240 $tpl->setCurrentBlock("files");
241 $this->ctrl->setParameter($this, 'file_id', $file->getFileId());
242 $tpl->setVariable("DOWN_LINK", $this->ctrl->getLinkTarget($this, 'sendfile'));
243 $tpl->setVariable("DOWN_NAME", $file->getFileName());
244 $tpl->setVariable("DOWN_INFO_TXT", $this->lng->txt('crs_file_size_info'));
245 $tpl->setVariable("DOWN_SIZE", $file->getFileSize());
246 $tpl->setVariable("TXT_BYTES", $this->lng->txt('bytes'));
248 }
249 $info->addProperty(
250 $this->lng->txt('crs_file_download'),
251 $tpl->get()
252 );
253 }
254
255 $record_gui = new ilAdvancedMDRecordGUI(ilAdvancedMDRecordGUI::MODE_INFO, 'crs', $this->object->getId());
256 $record_gui->setInfoObject($info);
258
259 // meta data
260 $info->addMetaDataSections($this->object->getId(), 0, $this->object->getType());
261
262 // contact
263 if ($this->object->hasContactData()) {
264 $info->addSection($this->lng->txt("crs_contact"));
265 }
266 if (strlen($this->object->getContactName())) {
267 $info->addProperty(
268 $this->lng->txt("crs_contact_name"),
269 $this->object->getContactName()
270 );
271 }
272 if (strlen($this->object->getContactResponsibility())) {
273 $info->addProperty(
274 $this->lng->txt("crs_contact_responsibility"),
275 $this->object->getContactResponsibility()
276 );
277 }
278 if (strlen($this->object->getContactPhone())) {
279 $info->addProperty(
280 $this->lng->txt("crs_contact_phone"),
281 $this->object->getContactPhone()
282 );
283 }
284 if ($this->object->getContactEmail()) {
285 /* needs to be rbacsystem, does not work with ilAccess */
286 $has_mail_access = $this->rbacsystem->checkAccessOfUser(
287 $this->user->getId(),
288 'internal_mail',
290 );
291 $emails = explode(",", $this->object->getContactEmail());
292 $mailString = '';
293 foreach ($emails as $email) {
294 $email = trim($email);
295 if (!$has_mail_access) {
296 $mailString .= $email . "<br />";
297 continue;
298 }
299 $etpl = new ilTemplate("tpl.crs_contact_email.html", true, true, 'components/ILIAS/Course');
300 $etpl->setVariable(
301 "EMAIL_LINK",
303 $info,
304 'showSummary',
305 array(),
306 array(
307 'type' => 'new',
308 'rcp_to' => $email,
309 'sig' => $this->createMailSignature()
310 ),
311 array(
313 'ref_id' => $this->object->getRefId(),
314 'ts' => time()
315 )
316 )
317 );
318 $etpl->setVariable("CONTACT_EMAIL", $email);
319 $mailString .= $etpl->get() . "<br />";
320 }
321 $info->addProperty($this->lng->txt("crs_contact_email"), $mailString);
322 }
323 if (strlen($this->object->getContactConsultation())) {
324 $info->addProperty(
325 $this->lng->txt("crs_contact_consultation"),
326 nl2br($this->object->getContactConsultation())
327 );
328 }
329 // support contacts
331 $conts = $parts->getContacts();
332 if ($conts !== []) {
333 $info->addSection($this->lng->txt("crs_mem_contacts"));
334 foreach ($conts as $c) {
335 $pgui = new PublicProfileGUI($c);
336 $pgui->setBackUrl($this->ctrl->getLinkTargetByClass("ilinfoscreengui"));
337 $pgui->setEmbedded(true);
338 $info->addProperty("", $pgui->getHTML());
339 }
340 }
341
342 // #10360
343 $info->enableAvailability(false);
344 $this->lng->loadLanguageModule("rep");
345 $info->addSection($this->lng->txt("rep_activation_availability"));
346 $info->showLDAPRoleGroupMappingInfo();
347
348 // activation
349 $info->addAccessPeriodProperty();
350
351 $txt = '';
352 switch ($this->object->getSubscriptionLimitationType()) {
354 $txt = $this->lng->txt("crs_info_reg_deactivated");
355 break;
356
357 default:
358 switch ($this->object->getSubscriptionType()) {
360 $txt = $this->lng->txt("crs_info_reg_confirmation");
361 break;
363 $txt = $this->lng->txt("crs_info_reg_direct");
364 break;
366 $txt = $this->lng->txt("crs_info_reg_password");
367 break;
368 }
369 }
370
371 // subscription
372 $info->addProperty($this->lng->txt("crs_info_reg"), $txt);
373 if ($this->object->getSubscriptionLimitationType() != ilCourseConstants::IL_CRS_SUBSCRIPTION_DEACTIVATED) {
374 if ($this->object->getSubscriptionUnlimitedStatus()) {
375 $info->addProperty(
376 $this->lng->txt("crs_reg_until"),
377 $this->lng->txt('crs_unlimited')
378 );
379 } elseif ($this->object->getSubscriptionStart() < time()) {
380 $info->addProperty(
381 $this->lng->txt("crs_reg_until"),
382 $this->lng->txt('crs_to') . ' ' .
383 ilDatePresentation::formatDate(new ilDateTime($this->object->getSubscriptionEnd(), IL_CAL_UNIX))
384 );
385 } elseif ($this->object->getSubscriptionStart() > time()) {
386 $info->addProperty(
387 $this->lng->txt("crs_reg_until"),
388 $this->lng->txt('crs_from') . ' ' .
389 ilDatePresentation::formatDate(new ilDateTime($this->object->getSubscriptionStart(), IL_CAL_UNIX))
390 );
391 }
392 if ($this->object->isSubscriptionMembershipLimited()) {
393 if ($this->object->getSubscriptionMinMembers()) {
394 $info->addProperty(
395 $this->lng->txt("mem_min_users"),
396 $this->object->getSubscriptionMinMembers()
397 );
398 }
399 if ($this->object->getSubscriptionMaxMembers()) {
400 $reg_info = ilObjCourseAccess::lookupRegistrationInfo($this->object->getId());
401 $info->addProperty(
402 $this->lng->txt('mem_free_places'),
403 (string) ($reg_info['reg_info_free_places'] ?? '0')
404 );
405 }
406 }
407 }
408
409 if ($this->object->getCancellationEnd()) {
410 $info->addProperty(
411 $this->lng->txt('crs_cancellation_end'),
412 ilDatePresentation::formatDate($this->object->getCancellationEnd())
413 );
414 }
415
416 if (
417 $this->object->getCourseStart() instanceof ilDateTime &&
418 !$this->object->getCourseStart()->isNull()
419 ) {
420 $info->addProperty(
421 $this->lng->txt('crs_period'),
423 $this->object->getCourseStart(),
424 $this->object->getCourseEnd()
425 )
426 );
427 }
428
429 // Confirmation
431
432 if ($privacy->courseConfirmationRequired() || ilCourseDefinedFieldDefinition::_getFields($this->object->getId()) || $privacy->enabledCourseExport()) {
433 $field_info = ilExportFieldsInfo::_getInstanceByType($this->object->getType());
434
435 $this->lng->loadLanguageModule('ps');
436 $info->addSection($this->lng->txt('crs_user_agreement_info'));
437 $info->addProperty($this->lng->txt('ps_export_data'), $field_info->exportableFieldsToInfoString());
438
439 if ($fields = ilCourseDefinedFieldDefinition::_fieldsToInfoString($this->object->getId())) {
440 $info->addProperty($this->lng->txt('ps_crs_user_fields'), $fields);
441 }
442 }
443 $info->enableLearningProgress(true);
444
445 // forward the command
446 $this->ctrl->forwardCommand($info);
447 }
448
449 public function saveNotificationObject(): void
450 {
451 $noti = new ilMembershipNotifications($this->ref_id);
452 if ($noti->canCurrentUserEdit()) {
453 $crs_ntf = false;
454 if ($this->http->wrapper()->query()->has('crs_ntf')) {
455 $crs_ntf = $this->http->wrapper()->query()->retrieve(
456 'crs_ntf',
457 $this->refinery->kindlyTo()->bool()
458 );
459 }
460 if ($crs_ntf) {
461 $noti->activateUser();
462 } else {
463 $noti->deactivateUser();
464 }
465 }
466 $this->tpl->setOnScreenMessage('success', $this->lng->txt("settings_saved"), true);
467 $this->ctrl->redirect($this, "");
468 }
469
470 public function editInfoObject(?ilPropertyFormGUI $a_form = null): void
471 {
472 $this->checkPermission('write');
473 $this->setSubTabs('properties');
474 $this->tabs_gui->setTabActive('settings');
475 $this->tabs_gui->setSubTabActive('crs_info_settings');
476
477 if (!$a_form) {
478 $a_form = $this->initInfoEditor();
479 }
480 $this->tpl->addBlockFile('ADM_CONTENT', 'adm_content', 'tpl.edit_info.html', 'components/ILIAS/Course');
481 $this->tpl->setVariable('INFO_TABLE', $a_form->getHTML());
482
484 $course = $this->object;
485 $data_retrieval = new ilCourseInfoFileTableDataRetrieval($course);
486 $data_retrieval->init();
487 $table = new ilCourseInfoFileTableGUI(
488 $data_retrieval,
489 $this->lng,
490 $this->ui,
491 $this->http,
492 $this->refinery,
493 $this->ctrl,
494 $this->data_factory
495 );
496 $table->handleCommands();
497 $this->tpl->setVariable('INFO_FILE_TABLE', $table->getHTML());
498 }
499
501 {
502 $form = new ilPropertyFormGUI();
503 $form->setFormAction($this->ctrl->getFormAction($this, 'updateInfo'));
504 $form->setMultipart(true);
505 $form->setTitle($this->lng->txt('crs_general_info'));
506 $form->addCommandButton('updateInfo', $this->lng->txt('save'));
507 $form->addCommandButton('cancel', $this->lng->txt('cancel'));
508
509 $area = new ilTextAreaInputGUI($this->lng->txt('crs_important_info'), 'important');
510 $area->setValue($this->object->getImportantInformation());
511 $area->setRows(6);
512 $area->setCols(80);
513 $form->addItem($area);
514
515 $area = new ilTextAreaInputGUI($this->lng->txt('crs_syllabus'), 'syllabus');
516 $area->setValue($this->object->getSyllabus());
517 $area->setRows(6);
518 $area->setCols(80);
519 $form->addItem($area);
520
521 $tg = new \ilTextAreaInputGUI($this->lng->txt('crs_target_group'), 'target_group');
522 $tg->setValue($this->object->getTargetGroup() ?? "");
523 $tg->setRows(6);
524 $form->addItem($tg);
525
526 $section = new ilFormSectionHeaderGUI();
527 $section->setTitle($this->lng->txt('crs_info_download'));
528 $form->addItem($section);
529
530 $file = new ilFileInputGUI($this->lng->txt('crs_file'), 'file');
531 $file->enableFileNameSelection('file_name');
532 $form->addItem($file);
533
534 $section = new ilFormSectionHeaderGUI();
535 $section->setTitle($this->lng->txt('crs_contact'));
536 $form->addItem($section);
537
538 $text = new ilTextInputGUI($this->lng->txt('crs_contact_name'), 'contact_name');
539 $text->setValue($this->object->getContactName());
540 $text->setSize(40);
541 $text->setMaxLength(70);
543
544 $text = new ilTextInputGUI($this->lng->txt('crs_contact_responsibility'), 'contact_responsibility');
545 $text->setValue($this->object->getContactResponsibility());
546 $text->setSize(40);
547 $text->setMaxLength(70);
549
550 $text = new ilTextInputGUI($this->lng->txt('crs_contact_phone'), 'contact_phone');
551 $text->setValue($this->object->getContactPhone());
552 $text->setSize(40);
553 $text->setMaxLength(40);
555
556 $text = new ilTextInputGUI($this->lng->txt('crs_contact_email'), 'contact_email');
557 $text->setValue($this->object->getContactEmail());
558 $text->setInfo($this->lng->txt('crs_contact_email_info'));
559 $text->setSize(40);
560 $text->setMaxLength(255);
562
563 $area = new ilTextAreaInputGUI($this->lng->txt('crs_contact_consultation'), 'contact_consultation');
564 $area->setValue($this->object->getContactConsultation());
565 $area->setRows(6);
566 $area->setCols(80);
567 $form->addItem($area);
568
569 $this->record_gui = new ilAdvancedMDRecordGUI(
571 'crs',
572 $this->object->getId()
573 );
574 $this->record_gui->setPropertyForm($form);
575 $this->record_gui->parse();
576 return $form;
577 }
578
582 public function updateInfoObject(): void
583 {
584 $this->checkPermission('write');
585
586 $form = $this->initInfoEditor();
587 if ($form->checkInput()) {
588 $this->object->setImportantInformation((string) $form->getInput('important'));
589 $this->object->setSyllabus((string) $form->getInput('syllabus'));
590 $this->object->setTargetGroup((string) $form->getInput('target_group'));
591 $this->object->setContactName((string) $form->getInput('contact_name'));
592 $this->object->setContactResponsibility((string) $form->getInput('contact_responsibility'));
593 $this->object->setContactPhone((string) $form->getInput('contact_phone'));
594 $this->object->setContactEmail((string) $form->getInput('contact_email'));
595 $this->object->setContactConsultation((string) $form->getInput('contact_consultation'));
596
597 $file_info = $form->getInput('file');
598 $file_name = $form->getItemByPostVar('file')->getFilename();
599 $file_name = ilFileUtils::getValidFilename($file_name);
600
601 $file_obj = new ilCourseFile();
602 $file_obj->setCourseId($this->object->getId());
603 $file_obj->setFileName((string) $file_name);
604 $file_obj->setFileSize((int) $file_info['size']);
605 $file_obj->setFileType((string) $file_info['type']);
606 $file_obj->setTemporaryName((string) $file_info['tmp_name']);
607 $file_obj->setErrorCode((int) $file_info['error']);
608
609 $error = false;
610 $this->error->setMessage('');
611 $file_obj->validate();
612 $this->object->validateInfoSettings();
613 if (strlen($this->error->getMessage())) {
614 $error = $this->error->getMessage();
615 }
616 if (!$this->record_gui->importEditFormPostValues()) {
617 $error = true;
618 }
619 if ($error) {
620 if ($error !== true) {
621 $this->tpl->setOnScreenMessage('failure', $this->error->getMessage());
622 }
624 $this->editInfoObject($form);
625 return;
626 }
627 $this->object->update();
628 $file_obj->create();
629 $this->record_gui->writeEditForm();
630
631 // Update ecs content
632 $ecs = new ilECSCourseSettings($this->object);
633 $ecs->handleContentUpdate();
634
635 $this->tpl->setOnScreenMessage('success', $this->lng->txt("crs_settings_saved"));
636 $this->editInfoObject();
637 } else {
638 $this->tpl->setOnScreenMessage(
640 $this->lng->txt('settings_saved')
641 );
642 }
643 }
644
645 public function updateObject(): void
646 {
647 $obj_service = $this->getObjectService();
648 $setting = $this->settings;
649
650 $form = $this->initEditForm();
651
652 if (!$form->checkInput()) {
654 $this->tpl->setOnScreenMessage('failure', $GLOBALS['DIC']->language()->txt('err_check_input'));
655 $this->editObject($form);
656 return;
657 }
658
659 // Additional checks: subsription min/max
660 if (
661 $form->getInput('subscription_max') &&
662 $form->getInput('subscription_min') &&
663 ($form->getInput('subscription_max') < $form->getInput('subscription_min'))
664 ) {
665 $min = $form->getItemByPostVar('subscription_min');
666 $min->setAlert($this->lng->txt('crs_subscription_min_members_err'));
667 $this->tpl->setOnScreenMessage('failure', $GLOBALS['DIC']->language()->txt('err_check_input'));
668 $this->editObject($form);
669 return;
670 }
671
672 // Additional checks: both tile and objective view activated (not supported)
673 if (
674 $form->getInput('list_presentation') == "tile" &&
676 $this->tpl->setOnScreenMessage(
677 'failure',
678 $GLOBALS['DIC']->language()->txt('crs_tile_and_objective_view_not_supported')
679 );
680 $this->editObject($form);
681 return;
682 }
683
684 // Additional checks: both tile and session limitation activated (not supported)
685 if ($form->getInput('sl') == "1" &&
686 $form->getInput('list_presentation') == "tile") {
687 $this->tpl->setOnScreenMessage(
688 'failure',
689 $GLOBALS['DIC']->language()->txt('crs_tile_and_session_limit_not_supported')
690 );
691 $this->editObject($form);
692 return;
693 }
694
695 // check successful
696 // title/desc
697 $this->object->setTitle($form->getInput('title'));
698 $this->object->setDescription($form->getInput('desc'));
699
700 // period
701 $crs_period = $form->getItemByPostVar("period");
702
703 $this->object->setCoursePeriod(
704 $crs_period->getStart(),
705 $crs_period->getEnd()
706 );
707
708 // activation period
709 $period = $form->getItemByPostVar("access_period");
710 if ($period->getStart() && $period->getEnd()) {
711 $this->object->setActivationStart($period->getStart()->get(IL_CAL_UNIX));
712 $this->object->setActivationEnd($period->getEnd()->get(IL_CAL_UNIX));
713 $this->object->setActivationVisibility((int) $form->getInput('activation_visibility'));
714 } else {
715 $this->object->setActivationStart(0);
716 $this->object->setActivationEnd(0);
717 }
718
719 // subscription settings
720 $this->object->setSubscriptionPassword($form->getInput('subscription_password'));
721 $this->object->setSubscriptionStart(0);
722 $this->object->setSubscriptionEnd(0);
723
724 $sub_type = (int) $form->getInput('subscription_type');
725 $sub_reg_type = (int) $form->getInput('subscription_limitation_type');
726 $sub_period = $form->getItemByPostVar('subscription_period');
727
728 $this->object->setSubscriptionType(
730 ? $sub_type
732 );
734 if ($sub_period->getStart() && $sub_period->getEnd()) {
735 $this->object->setSubscriptionLimitationType(ilCourseConstants::IL_CRS_SUBSCRIPTION_LIMITED);
736 $this->object->setSubscriptionStart($sub_period->getStart()->get(IL_CAL_UNIX));
737 $this->object->setSubscriptionEnd($sub_period->getEnd()->get(IL_CAL_UNIX));
738 } else {
739 $this->object->setSubscriptionLimitationType(ilCourseConstants::IL_CRS_SUBSCRIPTION_UNLIMITED);
740 }
741 } else {
742 $this->object->setSubscriptionType(ilCourseConstants::IL_CRS_SUBSCRIPTION_DIRECT);
743 $this->object->setSubscriptionLimitationType(ilCourseConstants::IL_CRS_SUBSCRIPTION_DEACTIVATED);
744 }
745
746 // registration code
747 $this->object->enableRegistrationAccessCode((bool) $form->getInput('reg_code_enabled'));
748 $this->object->setRegistrationAccessCode($form->getInput('reg_code'));
749
750 // cancellation end
751 $this->object->setCancellationEnd($form->getItemByPostVar("cancel_end")->getDate());
752
753 // waiting list
754 $this->object->enableSubscriptionMembershipLimitation((bool) $form->getInput('subscription_membership_limitation'));
755 $this->object->setSubscriptionMaxMembers((int) $form->getInput('subscription_max'));
756 $this->object->setSubscriptionMinMembers((int) $form->getInput('subscription_min'));
757 switch ((int) $form->getInput('waiting_list')) {
758 case 2:
759 $this->object->enableWaitingList(true);
760 $this->object->setWaitingListAutoFill(true);
761 break;
762
763 case 1:
764 $this->object->enableWaitingList(true);
765 $this->object->setWaitingListAutoFill(false);
766 break;
767
768 default:
769 $this->object->enableWaitingList(false);
770 $this->object->setWaitingListAutoFill(false);
771 break;
772 }
773 $this->object->handleAutoFill();
774
775 $property_online = $this->object->getObjectProperties()->getPropertyIsOnline();
776 $online = $form->getInput('activation_online') ? $property_online->withOnline() : $property_online->withOffline();
777 $this->object->getObjectProperties()->storePropertyIsOnline($online);
778
779 $obj_service->commonSettings()->legacyForm($form, $this->object)->saveTitleIconVisibility();
780 $obj_service->commonSettings()->legacyForm($form, $this->object)->saveTopActionsVisibility();
781 ilContainer::_writeContainerSetting($this->object->getId(), "rep_breacrumb", $form->getInput('rep_breacrumb'));
782 $obj_service->commonSettings()->legacyForm($form, $this->object)->saveIcon();
783 $obj_service->commonSettings()->legacyForm($form, $this->object)->saveTileImage();
785
786 $this->object->setViewMode((int) $form->getInput('view_mode'));
787 if ($this->object->getViewMode() == ilCourseConstants::IL_CRS_VIEW_TIMING) {
788 $this->object->setOrderType(ilContainer::SORT_ACTIVATION);
789 $this->object->setTimingMode((int) $form->getInput('timing_mode'));
790 }
791 $this->object->setTimingMode((int) $form->getInput('timing_mode'));
792 $this->object->setOrderType((int) $form->getInput('sorting'));
794
795 $this->log->debug(
796 "\n\n\nValue: " . (int) $form->getInput('tutorial_support_block_checkbox') . "\n\n\n"
797 );
798 $this->object->setTutorialSupportBlockSettingValue(
799 (int) $form->getInput('tutorial_support_block_checkbox')
800 );
801
802 $this->object->setAboStatus((bool) $form->getInput('abo'));
803 $this->object->setShowMembers((bool) $form->getInput('show_members'));
804
805 if (\ilPrivacySettings::getInstance()->participantsListInCoursesEnabled()) {
806 $this->object->setShowMembersExport((bool) $form->getInput('show_members_export'));
807 }
808 $this->object->setMailToMembersType((int) $form->getInput('mail_type'));
809
810 $this->object->enableSessionLimit((int) $form->getInput('sl'));
811
812 $session_sp = $form->getInput('sp');
813 $this->object->setNumberOfPreviousSessions(is_numeric($session_sp) ? (int) $session_sp : -1);
814 $session_sn = $form->getInput('sn');
815 $this->object->setNumberOfnextSessions(is_numeric($session_sn) ? (int) $session_sn : -1);
816 $this->object->setAutoNotification($form->getInput('auto_notification') == 1 ? true : false);
817
818 // lp sync
819 $show_lp_sync_confirmation = false;
820
821 // could be hidden in form
822 if ($this->http->wrapper()->post()->has('status_dt')) {
823 $status_dt = $this->http->wrapper()->post()->retrieve(
824 'status_dt',
825 $this->refinery->kindlyTo()->int()
826 );
827 if (
828 $this->object->getStatusDetermination() != ilObjCourse::STATUS_DETERMINATION_LP &&
830 ) {
831 $show_lp_sync_confirmation = true;
832 } else {
833 $this->object->setStatusDetermination($status_dt);
834 }
835 }
836
837 $this->object->update();
838
840 $this->object->getId(),
841 $form,
842 $this->getSubServices()
843 );
844
845 ilChangeEvent::_recordWriteEvent($this->object->getId(), $this->user->getId(), 'update');
846
847 // lp sync confirmation required
848 if ($show_lp_sync_confirmation) {
849 $this->confirmLPSync();
850 return;
851 }
852
853 // Update ecs export settings
854 $ecs = new ilECSCourseSettings($this->object);
855 if (!$ecs->handleSettingsUpdate($form)) {
857 $this->tpl->setOnScreenMessage('failure', $GLOBALS['DIC']->language()->txt('err_check_input'));
858 $this->editObject($form);
859 return;
860 }
861
862 // 29589
863 if (
865 (
866 !is_null($sub_period->getStart()) ||
867 !is_null($sub_period->getEnd())
868 )
869 ) {
870 $this->tpl->setOnScreenMessage(
871 'failure',
872 $this->lng->txt('crs_msg_no_self_registration_period_if_self_enrolment_disabled'),
873 true
874 );
876 $this->tpl->setOnScreenMessage('failure', $GLOBALS['DIC']->language()->txt('err_check_input'));
877 $this->editObject($form);
878 return;
879 }
880
881 $this->afterUpdate();
882 }
883
884 protected function getSubServices(): array
885 {
886 $subs = array(
896 );
897 if ($this->news->isGloballyActivated()) {
899 }
900
901 return $subs;
902 }
903
904 protected function confirmLPSync(): void
905 {
906 $cgui = new ilConfirmationGUI();
907 $cgui->setFormAction($this->ctrl->getFormAction($this, "setLPSync"));
908 $cgui->setHeaderText($this->lng->txt("crs_status_determination_sync"));
909 $cgui->setCancel($this->lng->txt("cancel"), "edit");
910 $cgui->setConfirm($this->lng->txt("confirm"), "setLPSync");
911 $this->tpl->setContent($cgui->getHTML());
912 }
913
914 protected function setLPSyncObject(): void
915 {
916 $this->object->setStatusDetermination(ilObjCourse::STATUS_DETERMINATION_LP);
917 $this->object->update();
918 $this->object->syncMembersStatusWithLP();
919 $this->tpl->setOnScreenMessage('success', $this->lng->txt("settings_saved"), true);
920 $this->ctrl->redirect($this, "edit");
921 }
922
923 public function editObject(?ilPropertyFormGUI $form = null): void
924 {
925 $this->setSubTabs('properties');
926 $this->tabs_gui->setSubTabActive('general');
927
928 if ($form instanceof ilPropertyFormGUI) {
929 $GLOBALS['DIC']['tpl']->setContent($form->getHTML());
930 } else {
931 parent::editObject();
932 }
933 }
934
939 protected function getEditFormValues(): array
940 {
941 return [];
942 }
943
944 protected function initEditForm(): ilPropertyFormGUI
945 {
946 $obj_service = $this->getObjectService();
947 $setting = $this->settings;
948
949 $form = new ilPropertyFormGUI();
950 $form->setTitle($this->lng->txt('crs_edit'));
951
952 $form->addCommandButton('update', $this->lng->txt('save'));
953 $form->addCommandButton('cancel', $this->lng->txt('cancel'));
954
955 $form->setFormAction($this->ctrl->getFormAction($this, 'update'));
956
957 // title and description
958 $this->initFormTitleDescription($form);
959
960 // Show didactic template type
962
963 // period
964 $cdur = new ilDateDurationInputGUI($this->lng->txt('crs_period'), 'period');
965 $this->lng->loadLanguageModule('mem');
966 $cdur->enableToggleFullTime(
967 $this->lng->txt('mem_period_without_time'),
968 !$this->object->getCourseStartTimeIndication()
969 );
970 $cdur->setShowTime(true);
971 $cdur->setInfo($this->lng->txt('crs_period_info'));
972 $cdur->setStart($this->object->getCourseStart());
973 $cdur->setEnd($this->object->getCourseEnd());
974 $form->addItem($cdur);
975
976 // activation/availability
977
978 $this->lng->loadLanguageModule('rep');
979
980 $section = new ilFormSectionHeaderGUI();
981 $section->setTitle($this->lng->txt('rep_activation_availability'));
982 $form->addItem($section);
983
984 $online = new ilCheckboxInputGUI($this->lng->txt('rep_activation_online'), 'activation_online');
985 $online->setChecked(!$this->object->getOfflineStatus());
986 $online->setInfo($this->lng->txt('crs_activation_online_info'));
987 $form->addItem($online);
988
989 $dur = new ilDateDurationInputGUI($this->lng->txt('rep_time_period'), "access_period");
990 $dur->setShowTime(true);
991 $dur->setStart(new ilDateTime($this->object->getActivationStart(), IL_CAL_UNIX));
992 $dur->setEnd(new ilDateTime($this->object->getActivationEnd(), IL_CAL_UNIX));
993 $form->addItem($dur);
994
995 $visible = new ilCheckboxInputGUI(
996 $this->lng->txt('rep_activation_limited_visibility'),
997 'activation_visibility'
998 );
999 $visible->setInfo($this->lng->txt('crs_activation_limited_visibility_info'));
1000 $visible->setChecked((bool) $this->object->getActivationVisibility());
1001 $dur->addSubItem($visible);
1002
1003 $section = new ilFormSectionHeaderGUI();
1004 $section->setTitle($this->lng->txt('crs_reg'));
1005 $form->addItem($section);
1006
1007 // time limit
1008 $sdur = new ilDateDurationInputGUI($this->lng->txt('crs_registration_limited'), "subscription_period");
1009 $sdur->setShowTime(true);
1010 if ($this->object->getSubscriptionStart()) {
1011 $sdur->setStart(new ilDateTime($this->object->getSubscriptionStart(), IL_CAL_UNIX));
1012 }
1013 if ($this->object->getSubscriptionEnd()) {
1014 $sdur->setEnd(new ilDateTime($this->object->getSubscriptionEnd(), IL_CAL_UNIX));
1015 }
1016
1017 $reg_proc = new ilRadioGroupInputGUI('', 'subscription_type');
1018 $reg_proc->setValue(
1019 ($this->object->getSubscriptionLimitationType() != ilCourseConstants::IL_CRS_SUBSCRIPTION_DEACTIVATED)
1020 ? (string) $this->object->getSubscriptionType()
1022 );
1023
1024 $opt = new ilRadioOption(
1025 $this->lng->txt('crs_subscription_options_direct'),
1026 (string) ilCourseConstants::IL_CRS_SUBSCRIPTION_DIRECT
1027 );
1028 $reg_proc->addOption($opt);
1029
1030 $opt = new ilRadioOption(
1031 $this->lng->txt('crs_subscription_options_password'),
1033 );
1034
1035 $pass = new ilTextInputGUI($this->lng->txt("password"), 'subscription_password');
1036 $pass->setRequired(true);
1037 $pass->setInfo($this->lng->txt('crs_reg_password_info'));
1038 $pass->setSubmitFormOnEnter(true);
1039 $pass->setSize(32);
1040 $pass->setMaxLength(32);
1041 $pass->setValue($this->object->getSubscriptionPassword());
1042
1043 $opt->addSubItem($pass);
1044 $reg_proc->addOption($opt);
1045
1046 $opt = new ilRadioOption(
1047 $this->lng->txt('crs_subscription_options_confirmation'),
1049 );
1050 $opt->setInfo($this->lng->txt('crs_registration_confirmation_info'));
1051 $reg_proc->addOption($opt);
1052
1053 $opt_self_enrollment_enabled = new ilRadioOption(
1054 $this->lng->txt('crs_reg_selfreg'),
1056 );
1057 $opt_self_enrollment_enabled->addSubItem($reg_proc);
1058 $opt_self_enrollment_enabled->addSubItem($sdur);
1059 $opt_self_enrollment_disabled = new ilRadioOption(
1060 $this->lng->txt('crs_reg_no_selfreg'),
1062 );
1063 $opt_self_enrollment_disabled->setInfo($this->lng->txt('crs_registration_deactivated'));
1064 $reg_proc_subscription_reg_type = new ilRadioGroupInputGUI(
1065 $this->lng->txt('crs_registration_type'),
1066 'subscription_limitation_type'
1067 );
1068 $reg_proc_subscription_reg_type->setValue(
1069 $this->object->getSubscriptionLimitationType() !== ilCourseConstants::IL_CRS_SUBSCRIPTION_DEACTIVATED
1072 );
1073 $reg_proc_subscription_reg_type->addOption($opt_self_enrollment_enabled);
1074 $reg_proc_subscription_reg_type->addOption($opt_self_enrollment_disabled);
1075 $form->addItem($reg_proc_subscription_reg_type);
1076
1077 // Registration codes
1078 $reg_code = new ilCheckboxInputGUI($this->lng->txt('crs_reg_code'), 'reg_code_enabled');
1079 $reg_code->setChecked($this->object->isRegistrationAccessCodeEnabled());
1080 $reg_code->setValue('1');
1081 $reg_code->setInfo($this->lng->txt('crs_reg_code_enabled_info'));
1082
1083 // Create default access code
1084 if (!$this->object->getRegistrationAccessCode()) {
1085 $this->object->setRegistrationAccessCode(ilMembershipRegistrationCodeUtils::generateCode());
1086 }
1087 $reg_link = new ilHiddenInputGUI('reg_code');
1088 $reg_link->setValue($this->object->getRegistrationAccessCode());
1089 $form->addItem($reg_link);
1090
1091 $link = new ilCustomInputGUI($this->lng->txt('crs_reg_code_link'));
1092 $val = ilLink::_getLink(
1093 $this->object->getRefId(),
1094 $this->object->getType(),
1095 array(),
1096 'rcode' . $this->object->getRegistrationAccessCode()
1097 );
1098 $link->setHtml('<span class="small">' . $val . '</span>');
1099 $reg_code->addSubItem($link);
1100
1101 $form->addItem($reg_code);
1102
1103 // cancellation limit
1104 $cancel = new ilDateTimeInputGUI($this->lng->txt('crs_cancellation_end'), 'cancel_end');
1105 $cancel->setInfo($this->lng->txt('crs_cancellation_end_info'));
1106 $cancel_end = $this->object->getCancellationEnd();
1107 if ($cancel_end) {
1108 $cancel->setDate($cancel_end);
1109 }
1110 $form->addItem($cancel);
1111
1112 // Max members
1113 $lim = new ilCheckboxInputGUI(
1114 $this->lng->txt('crs_subscription_max_members_short'),
1115 'subscription_membership_limitation'
1116 );
1117 $lim->setInfo($this->lng->txt('crs_subscription_max_members_short_info'));
1118 $lim->setValue((string) 1);
1119 $lim->setChecked($this->object->isSubscriptionMembershipLimited());
1120
1121 $min = new ilTextInputGUI('', 'subscription_min');
1122 $min->setSubmitFormOnEnter(true);
1123 $min->setSize(4);
1124 $min->setMaxLength(4);
1125 $min->setValue($this->object->getSubscriptionMinMembers() ?: '');
1126 $min->setTitle($this->lng->txt('crs_subscription_min_members'));
1127 $min->setInfo($this->lng->txt('crs_subscription_min_members_info'));
1128 $lim->addSubItem($min);
1129
1130 $max = new ilTextInputGUI('', 'subscription_max');
1131 $max->setSubmitFormOnEnter(true);
1132 $max->setSize(4);
1133 $max->setMaxLength(4);
1134 $max->setValue($this->object->getSubscriptionMaxMembers() ?: '');
1135 $max->setTitle($this->lng->txt('crs_subscription_max_members'));
1136 $max->setInfo($this->lng->txt('crs_reg_max_info'));
1137
1138 $lim->addSubItem($max);
1139
1140 $wait = new ilRadioGroupInputGUI($this->lng->txt('crs_waiting_list'), 'waiting_list');
1141 $option = new ilRadioOption($this->lng->txt('none'), '0');
1142 $wait->addOption($option);
1143
1144 $option = new ilRadioOption($this->lng->txt('crs_waiting_list_no_autofill'), '1');
1145 $option->setInfo($this->lng->txt('crs_wait_info'));
1146 $wait->addOption($option);
1147
1148 $option = new ilRadioOption($this->lng->txt('crs_waiting_list_autofill'), '2');
1149 $option->setInfo($this->lng->txt('crs_waiting_list_autofill_info'));
1150 $wait->addOption($option);
1151
1152 if ($this->object->hasWaitingListAutoFill()) {
1153 $wait->setValue('2');
1154 } elseif ($this->object->enabledWaitingList()) {
1155 $wait->setValue('1');
1156 } else {
1157 $wait->setValue('0');
1158 }
1159 $lim->addSubItem($wait);
1160 $form->addItem($lim);
1161 $pres = new ilFormSectionHeaderGUI();
1162 $pres->setTitle($this->lng->txt('crs_view_mode'));
1163
1164 $form->addItem($pres);
1165
1166 // title and icon visibility
1167 $form = $obj_service->commonSettings()->legacyForm($form, $this->object)->addTitleIconVisibility();
1168
1169 // top actions visibility
1170 $form = $obj_service->commonSettings()->legacyForm($form, $this->object)->addTopActionsVisibility();
1171
1172 // breadcrumbs
1173 if ($setting->get("rep_breadcr_crs") && $setting->get("rep_breadcr_crs_overwrite")) {
1174 $add = $setting->get("rep_breadcr_crs_default")
1175 ? " (" . $this->lng->txt("crs_breadcrumb_crs_only") . ")"
1176 : " (" . $this->lng->txt("crs_breadcrumb_full_path") . ")";
1177 $options = array(
1178 self::BREADCRUMB_DEFAULT => $this->lng->txt("crs_sys_default") . $add,
1179 self::BREADCRUMB_CRS_ONLY => $this->lng->txt("crs_breadcrumb_crs_only"),
1180 self::BREADCRUMB_FULL_PATH => $this->lng->txt("crs_breadcrumb_full_path")
1181 );
1182 $si = new ilSelectInputGUI($this->lng->txt("crs_shorten_breadcrumb"), "rep_breacrumb");
1183 $si->setValue((int) ilContainer::_lookupContainerSetting($this->object->getId(), "rep_breacrumb"));
1184 $si->setOptions($options);
1185 $form->addItem($si);
1186 }
1187
1188 // custom icon
1189 $form = $obj_service->commonSettings()->legacyForm($form, $this->object)->addIcon();
1190
1191 // tile image
1192 $form = $obj_service->commonSettings()->legacyForm($form, $this->object)->addTileImage();
1193
1194 // list presentation
1196
1197 // presentation type
1198 $view_type = new ilRadioGroupInputGUI($this->lng->txt('crs_presentation_type'), 'view_mode');
1199 $view_type->setValue($this->object->getViewMode());
1200
1201 $opts = new ilRadioOption(
1202 $this->lng->txt('cntr_view_sessions'),
1204 );
1205 $opts->setInfo($this->lng->txt('cntr_view_info_sessions'));
1206 $view_type->addOption($opts);
1207
1208 // Limited sessions
1209 $sess = new ilCheckboxInputGUI($this->lng->txt('sess_limit'), 'sl');
1210 $sess->setValue('1');
1211 $sess->setChecked($this->object->isSessionLimitEnabled());
1212 $sess->setInfo($this->lng->txt('sess_limit_info'));
1213
1214 $prev = new ilNumberInputGUI($this->lng->txt('sess_num_prev'), 'sp');
1215 #$prev->setSubmitFormOnEnter(true);
1216 $prev->setMinValue(0);
1217 $prev->setValue(
1218 $this->object->getNumberOfPreviousSessions() == -1 ?
1219 '' :
1220 $this->object->getNumberOfPreviousSessions()
1221 );
1222 $prev->setSize(2);
1223 $prev->setMaxLength(3);
1224 $sess->addSubItem($prev);
1225
1226 $next = new ilNumberInputGUI($this->lng->txt('sess_num_next'), 'sn');
1227 #$next->setSubmitFormOnEnter(true);
1228 $next->setMinValue(0);
1229 $next->setValue(
1230 $this->object->getNumberOfNextSessions() == -1 ?
1231 '' :
1232 $this->object->getNumberOfnextSessions()
1233 );
1234 $next->setSize(2);
1235 $next->setMaxLength(3);
1236 $sess->addSubItem($next);
1237
1238 $opts->addSubItem($sess);
1239
1240 $optsi = new ilRadioOption($this->lng->txt('cntr_view_simple'), (string) ilCourseConstants::IL_CRS_VIEW_SIMPLE);
1241 $optsi->setInfo($this->lng->txt('cntr_view_info_simple'));
1242 $view_type->addOption($optsi);
1243
1244 $optbt = new ilRadioOption(
1245 $this->lng->txt('cntr_view_by_type'),
1247 );
1248 $optbt->setInfo($this->lng->txt('cntr_view_info_by_type'));
1249 $view_type->addOption($optbt);
1250
1251 $opto = new ilRadioOption(
1252 $this->lng->txt('crs_view_objective'),
1254 );
1255 $opto->setInfo($this->lng->txt('crs_view_info_objective'));
1256 $view_type->addOption($opto);
1257
1258 $optt = new ilRadioOption($this->lng->txt('crs_view_timing'), (string) ilCourseConstants::IL_CRS_VIEW_TIMING);
1259 $optt->setInfo($this->lng->txt('crs_view_info_timing'));
1260
1261 // cognos-blu-patch: begin
1262 $timing = new ilRadioGroupInputGUI($this->lng->txt('crs_view_timings'), "timing_mode");
1263 $timing->setValue($this->object->getTimingMode());
1264
1265 $absolute = new ilRadioOption(
1266 $this->lng->txt('crs_view_timing_absolute'),
1268 );
1269 $absolute->setInfo($this->lng->txt('crs_view_info_timing_absolute'));
1270 $timing->addOption($absolute);
1271
1272 $relative = new ilRadioOption(
1273 $this->lng->txt('crs_view_timing_relative'),
1275 );
1276 $relative->setInfo($this->lng->txt('crs_view_info_timing_relative'));
1277 $timing->addOption($relative);
1278
1279 $optt->addSubItem($timing);
1280 // cognos-blu-patch: end
1281
1282 $view_type->addOption($optt);
1283
1284 $form->addItem($view_type);
1285
1286 $this->initSortingForm(
1287 $form,
1288 array(
1293 )
1294 );
1295
1296 $tutorial_support_panel_checkbox = new ilCheckboxInputGUI(
1297 $this->lng->txt('tutorial_support_block_setting_title'),
1298 'tutorial_support_block_checkbox'
1299 );
1300 //$tutorial_support_panel_checkbox->setValue($this->object->getTutorialSupportBlockSettingValue());
1301 $tutorial_support_panel_checkbox->setChecked((bool) $this->object->getTutorialSupportBlockSettingValue());
1302 $tutorial_support_panel_checkbox->setInfo($this->lng->txt('tutorial_support_block_byline'));
1303 $form->addItem($tutorial_support_panel_checkbox);
1304
1305 // lp vs. course status
1307 $olp = ilObjectLP::getInstance($this->object->getId());
1308 if ($olp->getCurrentMode()) {
1309 $lp_status = new ilFormSectionHeaderGUI();
1310 $lp_status->setTitle($this->lng->txt('crs_course_status_of_users'));
1311 $form->addItem($lp_status);
1312
1313 $lp_status_options = new ilRadioGroupInputGUI($this->lng->txt('crs_status_determination'), "status_dt");
1314 // $lp_status_options->setRequired(true);
1315 $lp_status_options->setValue($this->object->getStatusDetermination());
1316
1317 $lp_option = new ilRadioOption(
1318 $this->lng->txt('crs_status_determination_lp'),
1320 $this->lng->txt('crs_status_determination_lp_info')
1321 );
1322 $lp_status_options->addOption($lp_option);
1323 $lp_status_options->addOption(new ilRadioOption(
1324 $this->lng->txt('crs_status_determination_manual'),
1326 ));
1327
1328 $form->addItem($lp_status_options);
1329 }
1330 }
1331
1332 // additional features
1333 $feat = new ilFormSectionHeaderGUI();
1334 $feat->setTitle($this->lng->txt('obj_features'));
1335 $form->addItem($feat);
1336
1338 $this->object->getId(),
1339 $form,
1340 $this->getSubServices()
1341 );
1342
1343 $mem = new ilCheckboxInputGUI($this->lng->txt('crs_show_members'), 'show_members');
1344 $mem->setChecked($this->object->getShowMembers());
1345 $mem->setInfo($this->lng->txt('crs_show_members_info'));
1346 $form->addItem($mem);
1347
1348 // check privacy
1349 if (\ilPrivacySettings::getInstance()->participantsListInCoursesEnabled()) {
1350 $part_list = new ilCheckboxInputGUI($this->lng->txt('crs_show_member_export'), 'show_members_export');
1351 $part_list->setChecked($this->object->getShowMembersExport());
1352 $part_list->setInfo($this->lng->txt('crs_show_member_export_info'));
1353 $mem->addSubItem($part_list);
1354 }
1355
1356 // Show members type
1357 $mail_type = new ilRadioGroupInputGUI($this->lng->txt('crs_mail_type'), 'mail_type');
1358 $mail_type->setValue($this->object->getMailToMembersType());
1359
1360 $mail_tutors = new ilRadioOption(
1361 $this->lng->txt('crs_mail_tutors_only'),
1363 $this->lng->txt('crs_mail_tutors_only_info')
1364 );
1365 $mail_type->addOption($mail_tutors);
1366
1367 $mail_all = new ilRadioOption(
1368 $this->lng->txt('crs_mail_all'),
1370 $this->lng->txt('crs_mail_all_info')
1371 );
1372 $mail_type->addOption($mail_all);
1373 $form->addItem($mail_type);
1374
1375 // Notification Settings
1376 /*$notification = new ilFormSectionHeaderGUI();
1377 $notification->setTitle($this->lng->txt('crs_notification'));
1378 $form->addItem($notification);*/
1379
1380 // Self notification
1381 $not = new ilCheckboxInputGUI($this->lng->txt('crs_auto_notification'), 'auto_notification');
1382 $not->setValue('1');
1383 $not->setInfo($this->lng->txt('crs_auto_notification_info'));
1384 $not->setChecked($this->object->getAutoNotification());
1385 $form->addItem($not);
1386
1387 $desk = new ilCheckboxInputGUI($this->lng->txt('crs_add_remove_from_desktop'), 'abo');
1388 $desk->setChecked($this->object->getAboStatus());
1389 $desk->setInfo($this->lng->txt('crs_add_remove_from_desktop_info'));
1390 $form->addItem($desk);
1391
1392 // Edit ecs export settings
1393 $ecs = new ilECSCourseSettings($this->object);
1394 $ecs->addSettingsToForm($form, 'crs');
1395 return $form;
1396 }
1397
1398 public function sendFileObject(): void
1399 {
1400 $file_id = 0;
1401 if ($this->http->wrapper()->query()->has('file_id')) {
1402 $file_id = $this->http->wrapper()->query()->retrieve(
1403 'file_id',
1404 $this->refinery->kindlyTo()->int()
1405 );
1406 }
1407 $file = new ilCourseFile($file_id);
1408 ilFileDelivery::deliverFileLegacy($file->getAbsolutePath(), $file->getFileName(), $file->getFileType());
1409 }
1410
1411 public function setSubTabs(string $a_tab): void
1412 {
1413 switch ($a_tab) {
1414 case "properties":
1415 $this->tabs_gui->addSubTabTarget(
1416 "crs_settings",
1417 $this->ctrl->getLinkTarget($this, 'edit'),
1418 "edit",
1419 get_class($this)
1420 );
1421
1422 $this->tabs_gui->addSubTabTarget(
1423 "crs_info_settings",
1424 $this->ctrl->getLinkTarget($this, 'editInfo'),
1425 "editInfo",
1426 get_class($this)
1427 );
1428
1429 $this->tabs_gui->addSubTabTarget(
1430 "preconditions",
1431 $this->ctrl->getLinkTargetByClass('ilConditionHandlerGUI', 'listConditions'),
1432 "",
1433 "ilConditionHandlerGUI"
1434 );
1435
1436 $this->tabs_gui->addSubTabTarget(
1437 "crs_start_objects",
1438 $this->ctrl->getLinkTargetByClass('ilContainerStartObjectsGUI', 'listStructure'),
1439 "listStructure",
1440 get_class($this)
1441 );
1442
1443 $this->tabs_gui->addSubTabTarget(
1444 'groupings',
1445 $this->ctrl->getLinkTargetByClass('ilobjcoursegroupinggui', 'listGroupings'),
1446 'listGroupings',
1447 get_class($this)
1448 );
1449 $lti_settings = new ilLTIProviderObjectSettingGUI($this->object->getRefId());
1450 if ($lti_settings->hasSettingsAccess()) {
1451 $this->tabs_gui->addSubTabTarget(
1452 'lti_provider',
1453 $this->ctrl->getLinkTargetByClass(ilLTIProviderObjectSettingGUI::class)
1454 );
1455 }
1456
1457 // map settings
1458 if (ilMapUtil::isActivated()) {
1459 $this->tabs_gui->addSubTabTarget(
1460 "crs_map_settings",
1461 $this->ctrl->getLinkTarget($this, 'editMapSettings'),
1462 "editMapSettings",
1463 get_class($this)
1464 );
1465 }
1466
1467 // only show if export permission is granted
1468 if (ilPrivacySettings::getInstance()->checkExportAccess($this->object->getRefId()) || ilCourseDefinedFieldDefinition::_hasFields($this->object->getId())) {
1469 $this->tabs_gui->addSubTabTarget(
1470 'crs_custom_user_fields',
1471 $this->ctrl->getLinkTargetByClass('ilobjectcustomuserfieldsgui'),
1472 '',
1473 'ilobjectcustomuserfieldsgui'
1474 );
1475 }
1476
1477 // certificates
1478 $validator = new ilCertificateActiveValidator();
1479 if (true === $validator->validate()) {
1480 $this->tabs_gui->addSubTabTarget(
1481 "certificate",
1482 $this->ctrl->getLinkTargetByClass("ilcertificategui", "certificateeditor"),
1483 "",
1484 "ilcertificategui"
1485 );
1486 }
1487 // news settings
1488 if ($this->object->getUseNews()) {
1489 $this->tabs_gui->addSubTab(
1490 'obj_news_settings',
1491 $this->lng->txt("cont_news_settings"),
1492 $this->ctrl->getLinkTargetByClass('ilcontainernewssettingsgui')
1493 );
1494 }
1495 if ($this->object->getShowMembersExport()) {
1496 $this->tabs_gui->addSubTab(
1497 'export_members',
1498 $this->lng->txt('crs_show_member_export_settings'),
1499 $this->ctrl->getLinkTargetByClass('ilmemberexportsettingsgui', '')
1500 );
1501 }
1502 $this->tabs_gui->addSubTabTarget(
1503 "obj_multilinguality",
1504 $this->ctrl->getLinkTargetByClass(TranslationGUI::class, ""),
1505 "",
1506 TranslationGUI::class
1507 );
1508 break;
1509 }
1510 }
1511
1515 protected function showPossibleSubObjects(): void
1516 {
1517 if (
1518 $this->object->getViewMode() == ilContainer::VIEW_OBJECTIVE &&
1519 !$this->isActiveAdministrationPanel()) {
1520 return;
1521 }
1522 $this->renderAddNewItem();
1523 }
1524
1525 public function renderAddNewItem(string ...$disabled_object_types): void
1526 {
1527 $createble_object_types = $this->getCreatableObjectTypes();
1528
1529 foreach ($disabled_object_types as $type) {
1530 unset($createble_object_types[$type]);
1531 }
1532
1534 $this->buildAddNewItemElements($createble_object_types)
1535 );
1536 $gui->render();
1537 }
1538
1542 protected function afterSave(ilObject $new_object): void
1543 {
1544 $new_object->getMemberObject()->add($this->user->getId(), ilParticipants::IL_CRS_ADMIN);
1545 $new_object->getMemberObject()->updateNotification(
1546 $this->user->getId(),
1547 $this->settings->get('mail_crs_admin_notification', '1')
1548 );
1549 $new_object->getMemberObject()->updateContact($this->user->getId(), 1);
1550 $new_object->update();
1551
1552 ilChangeEvent::_recordWriteEvent($new_object->getId(), $this->user->getId(), 'create');
1553 // END ChangeEvent: Record write event.
1554
1555 // always send a message
1556 $this->tpl->setOnScreenMessage('success', $this->lng->txt("crs_added"), true);
1557 $this->ctrl->setParameter($this, "ref_id", $new_object->getRefId());
1559 "save",
1560 $this->ctrl->getLinkTarget($this, "edit", "")
1561 ));
1562 }
1563
1564 public function readMemberData(array $ids, ?array $selected_columns = null, bool $skip_names = false): array
1565 {
1566 $show_tracking =
1567 (
1570 );
1571 if ($show_tracking) {
1572 $olp = ilObjectLP::getInstance($this->object->getId());
1573 $show_tracking = $olp->isActive();
1574 }
1575
1576 if ($show_tracking) {
1577 $completed = ilLPStatusWrapper::_lookupCompletedForObject($this->object->getId());
1578 $in_progress = ilLPStatusWrapper::_lookupInProgressForObject($this->object->getId());
1579 $failed = ilLPStatusWrapper::_lookupFailedForObject($this->object->getId());
1580 }
1581 $privacy = ilPrivacySettings::getInstance();
1582
1583 if ($privacy->enabledCourseAccessTimes()) {
1584 $progress = ilLearningProgress::_lookupProgressByObjId($this->object->getId());
1585 }
1586
1587 $do_prtf = (is_array($selected_columns) &&
1588 in_array('prtf', $selected_columns) &&
1589 is_array($ids));
1590 if ($do_prtf) {
1592 $ids
1593 );
1594 }
1595
1596 $members = [];
1597 foreach ($ids as $usr_id) {
1605 if (!$skip_names) {
1606 $name = ilObjUser::_lookupName($usr_id);
1607 $tmp_data['firstname'] = $name['firstname'];
1608 $tmp_data['lastname'] = $name['lastname'];
1609 $tmp_data['login'] = $name['login'];
1610 }
1611 $tmp_data['passed'] = $this->object->getMembersObject()->hasPassed($usr_id) ? 1 : 0;
1612 if ($this->object->getStatusDetermination() == ilObjCourse::STATUS_DETERMINATION_LP) {
1613 $tmp_data['passed_info'] = $this->object->getMembersObject()->getPassedInfo($usr_id);
1614 }
1615 $tmp_data['notification'] = $this->object->getMembersObject()->isNotificationEnabled($usr_id) ? 1 : 0;
1616 $tmp_data['blocked'] = $this->object->getMembersObject()->isBlocked($usr_id) ? 1 : 0;
1617 $tmp_data['contact'] = $this->object->getMembersObject()->isContact($usr_id) ? 1 : 0;
1618
1619 $tmp_data['usr_id'] = $usr_id;
1620
1621 if ($show_tracking) {
1622 if (in_array($usr_id, $completed)) {
1623 $tmp_data['progress'] = ilLPStatus::LP_STATUS_COMPLETED;
1624 } elseif (in_array($usr_id, $in_progress)) {
1625 $tmp_data['progress'] = ilLPStatus::LP_STATUS_IN_PROGRESS;
1626 } elseif (in_array($usr_id, $failed)) {
1627 $tmp_data['progress'] = ilLPStatus::LP_STATUS_FAILED;
1628 } else {
1629 $tmp_data['progress'] = ilLPStatus::LP_STATUS_NOT_ATTEMPTED;
1630 }
1631 }
1632
1633 if ($privacy->enabledCourseAccessTimes()) {
1634 if (isset($progress[$usr_id]['ts']) && $progress[$usr_id]['ts']) {
1635 $tmp_data['access_ut'] = $progress[$usr_id]['ts'];
1636 $tmp_data['access_time'] = ilDatePresentation::formatDate(new ilDateTime(
1637 $progress[$usr_id]['ts'],
1639 ));
1640 } else {
1641 $tmp_data['access_ut'] = 0;
1642 $tmp_data['access_time'] = $this->lng->txt('no_date');
1643 }
1644 }
1645
1646 if ($do_prtf) {
1647 $tmp_data['prtf'] = $all_prtf[$usr_id] ?? null;
1648 }
1649
1650 $members[$usr_id] = $tmp_data;
1651 }
1652 return $members;
1653 }
1654
1658 public function updateLPFromStatus(int $a_member_id, bool $a_has_passed): void
1659 {
1661 $this->object->getStatusDetermination() == ilObjCourse::STATUS_DETERMINATION_LP) {
1662 $olp = ilObjectLP::getInstance($this->object->getId());
1663 if ($olp->getCurrentMode() == ilLPObjSettings::LP_MODE_MANUAL_BY_TUTOR) {
1664 $marks = new ilLPMarks($this->object->getId(), $a_member_id);
1665
1666 // only if status has changed
1667 if ($marks->getCompleted() !== $a_has_passed) {
1668 $marks->setCompleted($a_has_passed);
1669 $marks->update();
1670
1671 // as course is origin of LP status change, block syncing
1673 ilLPStatusWrapper::_updateStatus($this->object->getId(), $a_member_id);
1674 }
1675 }
1676 }
1677 }
1678
1679 public function autoFillObject(): bool
1680 {
1681 $this->checkPermission('write');
1682 if (
1683 $this->object->isSubscriptionMembershipLimited() &&
1684 $this->object->getSubscriptionMaxMembers() &&
1685 $this->object->getSubscriptionMaxMembers() <= $this->object->getMembersObject()->getCountMembers()
1686 ) {
1687 $this->tpl->setOnScreenMessage('failure', $this->lng->txt("crs_max_members_reached"));
1688 $this->membersObject();
1689 return false;
1690 }
1691 if ($number = $this->object->getMembersObject()->autoFillSubscribers()) {
1692 $this->tpl->setOnScreenMessage('success', $this->lng->txt("crs_number_users_added") . " " . $number);
1693 } else {
1694 $this->tpl->setOnScreenMessage('failure', $this->lng->txt("crs_no_users_added"));
1695 }
1696 $this->membersObject();
1697 return true;
1698 }
1699
1700 public function leaveObject(): void
1701 {
1702 $this->checkPermission('leave');
1703
1704 if ($this->object->getMembersObject()->isLastAdmin($this->user->getId())) {
1705 $this->tpl->setOnScreenMessage('failure', $this->lng->txt('crs_min_one_admin'));
1706 $this->viewObject();
1707 return;
1708 }
1709
1710 $this->tabs_gui->setTabActive('crs_unsubscribe');
1711 $cgui = new ilConfirmationGUI();
1712 $cgui->setHeaderText($this->lng->txt('crs_unsubscribe_sure'));
1713 $cgui->setFormAction($this->ctrl->getFormAction($this));
1714 $cgui->setCancel($this->lng->txt("cancel"), "cancel");
1715 $cgui->setConfirm($this->lng->txt("crs_unsubscribe"), "performUnsubscribe");
1716 $this->tpl->setContent($cgui->getHTML());
1717 }
1718
1719 public function unsubscribeObject(): void
1720 {
1721 $this->leaveObject();
1722 }
1723
1725 {
1726 $this->checkPermission('leave');
1727 $this->getObject()->getMembersObject()->delete($this->user->getId());
1728 $this->getObject()->getMembersObject()->sendUnsubscribeNotificationToAdmins($this->user->getId());
1729 $this->getObject()->getMembersObject()->sendNotification(
1731 $this->user->getId()
1732 );
1733 $this->tpl->setOnScreenMessage('success', $this->lng->txt('crs_unsubscribed_from_crs'), true);
1734
1735 $this->ctrl->setParameterByClass("ilrepositorygui", "ref_id", $this->tree->getParentId($this->ref_id));
1736 $this->ctrl->redirectByClass("ilrepositorygui", "");
1737 }
1738
1739
1740 protected function getAgreementTabs(): void
1741 {
1742 if ($this->access->checkAccess('visible', '', $this->ref_id)) {
1743 $this->tabs->addTarget(
1744 "info_short",
1745 $this->ctrl->getLinkTargetByClass(
1746 array("ilobjcoursegui", "ilinfoscreengui"),
1747 "showSummary"
1748 ),
1749 "infoScreen"
1750 );
1751 }
1752 if (
1753 $this->access->checkAccess('leave', '', $this->object->getRefId()) &&
1754 $this->object->getMemberObject()->isMember()
1755 ) {
1756 $this->tabs->addTarget(
1757 "crs_unsubscribe",
1758 $this->ctrl->getLinkTarget($this, "unsubscribe"),
1759 'leave',
1760 ""
1761 );
1762 }
1763 }
1764
1765 public function addContentTab(): void
1766 {
1767 $this->tabs_gui->addTab(
1768 "view_content",
1769 $this->lng->txt("content"),
1770 $this->ctrl->getLinkTarget($this, "view")
1771 );
1772 }
1773
1774 protected function getTabs(): void
1775 {
1776 $this->help->setScreenIdComponent("crs");
1777 $this->ctrl->setParameter($this, "ref_id", $this->ref_id);
1778
1779 if ($this->access->checkAccess('read', '', $this->ref_id)) {
1780 // default activation
1781 $this->tabs_gui->activateTab('view_content');
1782 if ($this->object->isNewsTimelineEffective()) {
1783 if (!$this->object->isNewsTimelineLandingPageEffective()) {
1784 $this->addContentTab();
1785 }
1786 $this->tabs_gui->addTab(
1787 "news_timeline",
1788 $this->lng->txt("cont_news_timeline_tab"),
1789 $this->ctrl->getLinkTargetByClass(ilNewsTimelineGUI::class, "show")
1790 );
1791 if ($this->object->isNewsTimelineLandingPageEffective()) {
1792 $this->addContentTab();
1793 }
1794 } else {
1795 $this->addContentTab();
1796 }
1797 }
1798
1799 if ($this->object->getViewMode() == ilCourseConstants::IL_CRS_VIEW_TIMING && $this->access->checkAccess('write', '', $this->ref_id)
1800 ) {
1801 $this->tabs->addTab(
1802 'timings_timings',
1803 $this->lng->txt('timings_timings'),
1804 $this->ctrl->getLinkTargetByClass('ilcoursecontentgui', 'manageTimings')
1805 );
1806 } elseif (
1807 $this->object->getViewMode() == ilCourseConstants::IL_CRS_VIEW_TIMING && $this->object->getMemberObject()->isParticipant() && $this->access->checkAccess('read', '', $this->ref_id)) {
1808 $this->tabs->addTab(
1809 'timings_timings',
1810 $this->lng->txt('timings_timings'),
1811 $this->ctrl->getLinkTargetByClass('ilcoursecontentgui', 'managePersonalTimings')
1812 );
1813 }
1814
1815 // learning objectives
1816 if ($this->access->checkAccess('write', '', $this->ref_id)) {
1817 if ($this->object->getViewMode() == ilCourseConstants::IL_CRS_VIEW_OBJECTIVE or ilCourseObjective::_getCountObjectives($this->object->getId())) {
1818 $this->tabs_gui->addTarget(
1819 'crs_objectives',
1820 $this->ctrl->getLinkTargetByClass('illoeditorgui', ''),
1821 'illoeditorgui'
1822 );
1823 }
1824 }
1825
1826 if (
1827 $this->access->checkAccess('visible', '', $this->ref_id) ||
1828 $this->access->checkAccess('join', '', $this->ref_id) ||
1829 $this->access->checkAccess('read', '', $this->ref_id)
1830 ) {
1831 $force_active =
1832 strcasecmp($this->ctrl->getCmdClass(), ilInfoScreenGUI::class) === 0 ||
1833 strcasecmp($this->ctrl->getCmdClass(), ilNoteGUI::class) === 0;
1834 $this->tabs_gui->addTarget(
1835 "info_short",
1836 $this->ctrl->getLinkTargetByClass(
1837 array("ilobjcoursegui", "ilinfoscreengui"),
1838 "showSummary"
1839 ),
1840 "infoScreen",
1841 "",
1842 "",
1843 $force_active
1844 );
1845 }
1846 if ($this->access->checkAccess('write', '', $this->ref_id)) {
1847 $force_active =
1848 strcasecmp($this->ctrl->getCmdClass(), ilConditionHandlerGUI::class) &&
1849 !$this->http->wrapper()->query()->has('item_id');
1850 $this->tabs_gui->addTarget(
1851 "settings",
1852 $this->ctrl->getLinkTarget($this, "edit"),
1853 array("edit", "editMapSettings", "editCourseIcons", "listStructure"),
1854 "",
1855 "",
1856 $force_active
1857 );
1858 }
1859
1860 $is_participant = ilCourseParticipants::_isParticipant($this->ref_id, $this->user->getId());
1861 $mail = new ilMail($this->user->getId());
1862
1863 $membership_gui = new ilCourseMembershipGUI($this, $this->object);
1864 $membership_gui->addMemberTab($this->tabs_gui, $is_participant);
1865
1866 // badges
1867 if ($this->access->checkAccess('write', '', $this->ref_id)) {
1868 if (ilBadgeHandler::getInstance()->isObjectActive($this->object->getId())) {
1869 $this->tabs_gui->addTarget(
1870 "obj_tool_setting_badges",
1871 $this->ctrl->getLinkTargetByClass("ilbadgemanagementgui", ""),
1872 "",
1873 "ilbadgemanagementgui"
1874 );
1875 }
1876 }
1877
1878 // skills
1879 if (ilContSkillPresentationGUI::isAccessible($this->ref_id)) {
1880 $this->tabs_gui->addTarget(
1881 "obj_tool_setting_skills",
1882 $this->ctrl->getLinkTargetByClass(array("ilcontainerskillgui", "ilcontskillpresentationgui"), ""),
1883 "",
1884 array("ilcontainerskillgui", "ilcontskillpresentationgui", "ilcontskilladmingui")
1885 );
1886 }
1887
1888 // booking
1889 if ($this->access->checkAccess('write', '', $this->ref_id) && ilContainer::_lookupContainerSetting(
1890 $this->object->getId(),
1892 '0'
1893 )) {
1894 $this->tabs_gui->addTarget(
1895 "obj_tool_setting_booking",
1896 $this->ctrl->getLinkTargetByClass(array("ilbookinggatewaygui"), "")
1897 );
1898 }
1899
1900 // learning progress
1901 if (ilLearningProgressAccess::checkAccess($this->object->getRefId(), $is_participant)) {
1902 $this->tabs_gui->addTarget(
1903 'learning_progress',
1904 $this->ctrl->getLinkTargetByClass(array('ilobjcoursegui', 'illearningprogressgui'), ''),
1905 '',
1906 array('illplistofobjectsgui', 'illplistofsettingsgui', 'illearningprogressgui', 'illplistofprogressgui')
1907 );
1908 }
1909
1910 // meta data
1911 if ($this->access->checkAccess('write', '', $this->ref_id)) {
1912 $mdgui = new ilObjectMetaDataGUI($this->object);
1913 $mdtab = $mdgui->getTab();
1914 if ($mdtab) {
1915 $this->tabs_gui->addTarget(
1916 "meta_data",
1917 $mdtab,
1918 "",
1919 "ilobjectmetadatagui"
1920 );
1921 }
1922 }
1923
1924 if ($this->access->checkAccess('write', '', $this->object->getRefId())) {
1925 $this->tabs_gui->addTarget(
1926 'export',
1927 $this->ctrl->getLinkTargetByClass('ilexportgui', ''),
1928 'export',
1929 'ilexportgui'
1930 );
1931 }
1932
1933 if ($this->access->checkAccess('edit_permission', '', $this->ref_id)) {
1934 $this->tabs_gui->addTarget(
1935 "perm_settings",
1936 $this->ctrl->getLinkTargetByClass(array(get_class($this), 'ilpermissiongui'), "perm"),
1937 array("perm", "info", "owner"),
1938 'ilpermissiongui'
1939 );
1940 }
1941
1942 // Join/Leave
1943 if ($this->access->checkAccess('join', '', $this->ref_id) && !$this->object->getMemberObject()->isAssigned()) {
1944 if (ilCourseWaitingList::_isOnList($this->user->getId(), $this->object->getId())) {
1945 $this->tabs_gui->addTab(
1946 'leave',
1947 $this->lng->txt('membership_leave'),
1948 $this->ctrl->getLinkTargetByClass('ilcourseregistrationgui', 'show', '')
1949 );
1950 } else {
1951 $this->tabs_gui->addTarget(
1952 "join",
1953 $this->ctrl->getLinkTargetByClass('ilcourseregistrationgui', "show"),
1954 'show',
1955 ""
1956 );
1957 }
1958 }
1959 if ($this->access->checkAccess('leave', '', $this->object->getRefId()) && $this->object->getMemberObject()->isMember()) {
1960 $this->tabs_gui->addTarget(
1961 "crs_unsubscribe",
1962 $this->ctrl->getLinkTarget($this, "unsubscribe"),
1963 'leave',
1964 ""
1965 );
1966 }
1967 }
1968
1969 public function executeCommand(): void
1970 {
1971 $next_class = $this->ctrl->getNextClass($this);
1972 $cmd = $this->ctrl->getCmd();
1973
1974 $this->prepareOutput();
1975
1976 // add entry to navigation history
1977 if (!$this->getCreationMode() &&
1978 $this->access->checkAccess('read', '', $this->ref_id)) {
1979 $this->navigation_history->addItem(
1980 $this->ref_id,
1981 ilLink::_getLink($this->ref_id, "crs"),
1982 "crs"
1983 );
1984 }
1985 $header_action = true;
1986 switch ($next_class) {
1987 case strtolower(ilRepositoryTrashGUI::class):
1988 $ru = new \ilRepositoryTrashGUI($this);
1989 $this->ctrl->setReturn($this, 'trash');
1990 $this->ctrl->forwardCommand($ru);
1991 break;
1992
1993 case 'illtiproviderobjectsettinggui':
1994
1995 $this->setSubTabs('properties');
1996 $this->tabs_gui->activateTab('settings');
1997 $this->tabs_gui->activateSubTab('lti_provider');
1998 $lti_gui = new ilLTIProviderObjectSettingGUI($this->object->getRefId());
1999 $lti_gui->setCustomRolesForSelection($GLOBALS['DIC']->rbac()->review()->getLocalRoles($this->object->getRefId()));
2000 $lti_gui->offerLTIRolesForSelection(false);
2001 $this->ctrl->forwardCommand($lti_gui);
2002 break;
2003
2004 case 'ilcoursemembershipgui':
2005
2006 $this->tabs_gui->activateTab('members');
2007
2008 $mem_gui = new ilCourseMembershipGUI($this, $this->object);
2009 $this->ctrl->forwardCommand($mem_gui);
2010 break;
2011
2012 case "ilinfoscreengui":
2013 $this->infoScreen(); // forwards command
2014 break;
2015
2016 case 'ilobjectmetadatagui':
2017 if (!$this->access->checkAccess('write', '', $this->object->getRefId())) {
2018 $this->error->raiseError($this->lng->txt('permission_denied'), $this->error->WARNING);
2019 }
2020 $this->tabs_gui->setTabActive('meta_data');
2021 $md_gui = new ilObjectMetaDataGUI($this->object);
2022 $this->ctrl->forwardCommand($md_gui);
2023 break;
2024
2025 case 'ilcourseregistrationgui':
2026 $this->ctrl->setReturn($this, '');
2027 $this->tabs_gui->setTabActive('join');
2028 $registration = new ilCourseRegistrationGUI($this->object, $this);
2029 $this->ctrl->forwardCommand($registration);
2030 break;
2031
2032 case 'ilobjectcustomuserfieldsgui':
2033 $cdf_gui = new ilObjectCustomUserFieldsGUI($this->object->getId());
2034 $this->setSubTabs('properties');
2035 $this->tabs_gui->activateTab('settings');
2036 $this->tabs_gui->activateSubTab('crs_custom_user_fields');
2037 $this->ctrl->forwardCommand($cdf_gui);
2038 break;
2039
2040 case "ilcourseobjectivesgui":
2041
2042 $this->ctrl->setReturn($this, "");
2043 $reg_gui = new ilCourseObjectivesGUI($this->object->getRefId());
2044 $this->ctrl->forwardCommand($reg_gui);
2045 break;
2046
2047 case 'ilobjcoursegroupinggui':
2048
2049 $this->ctrl->setReturn($this, 'edit');
2050 $this->setSubTabs('properties');
2051 $this->tabs_gui->activateTab('settings');
2052 $this->tabs_gui->activateSubTab('groupings');
2053
2054 $grouping_id = 0;
2055 if ($this->http->wrapper()->query()->has('obj_id')) {
2056 $grouping_id = $this->http->wrapper()->query()->retrieve(
2057 'obj_id',
2058 $this->refinery->kindlyTo()->int()
2059 );
2060 }
2061 $crs_grp_gui = new ilObjCourseGroupingGUI($this->object, $grouping_id);
2062 $this->ctrl->forwardCommand($crs_grp_gui);
2063 break;
2064
2065 case "ilpropertyformgui":
2066 // only case is currently adv metadata internal link in info settings, see #24497
2067 $form = $this->initInfoEditor();
2068 $this->ctrl->forwardCommand($form);
2069 break;
2070
2071 case "ilcolumngui":
2072 $this->ctrl->setReturn($this, "");
2073 $this->tabs_gui->setTabActive('none');
2074 $this->checkPermission("read");
2075 //$this->prepareOutput();
2076 //$this->tpl->setVariable("LOCATION_CONTENT_STYLESHEET",
2077 // ilObjStyleSheet::getContentStylePath(0));
2078 //$this->renderObject();
2079 $this->viewObject();
2080 break;
2081
2082 case "ilconditionhandlergui":
2083 // preconditions for whole course
2084 $this->setSubTabs("properties");
2085 $this->tabs_gui->activateTab('settings');
2086 $this->tabs_gui->activateSubTab('preconditions');
2087 $new_gui = new ilConditionHandlerGUI($this->object->getRefId());
2088 $this->ctrl->forwardCommand($new_gui);
2089 break;
2090
2091 case "illearningprogressgui":
2092
2093 $user_id = $this->user->getId();
2094 if ($this->http->wrapper()->query()->has('user_id')) {
2095 $user_id = $this->http->wrapper()->query()->retrieve(
2096 'user_id',
2097 $this->refinery->kindlyTo()->int()
2098 );
2099 }
2100 $new_gui = new ilLearningProgressGUI(
2102 $this->object->getRefId(),
2103 $user_id
2104 );
2105 $this->ctrl->forwardCommand($new_gui);
2106 $this->tabs_gui->setTabActive('learning_progress');
2107 break;
2108
2109 case 'ilpermissiongui':
2110 $this->tabs_gui->setTabActive('perm_settings');
2111 $perm_gui = new ilPermissionGUI($this);
2112 $this->ctrl->forwardCommand($perm_gui);
2113 break;
2114
2115 case 'ilcalendarpresentationgui':
2116 $cal = new ilCalendarPresentationGUI($this->object->getRefId());
2117 $ret = $this->ctrl->forwardCommand($cal);
2118 $header_action = false;
2119 break;
2120
2121 case 'ilcoursecontentgui':
2122 $this->ctrl->setReturn($this, 'members');
2123 $course_content_obj = new ilCourseContentGUI($this);
2124 $this->ctrl->forwardCommand($course_content_obj);
2125 break;
2126
2127 case strtolower(PublicProfileGUI::class):
2128 $this->setSubTabs('members');
2129 $this->tabs_gui->setTabActive('members');
2130
2131 $user_id = $this->user->getId();
2132 if ($this->http->wrapper()->query()->has('user_id')) {
2133 $user_id = $this->http->wrapper()->query()->retrieve(
2134 'user_id',
2135 $this->refinery->kindlyTo()->int()
2136 );
2137 }
2138 $profile_gui = new PublicProfileGUI($user_id);
2139 $profile_gui->setBackUrl($this->ctrl->getLinkTargetByClass(["ilCourseMembershipGUI",
2140 "ilUsersGalleryGUI"
2141 ], 'view'));
2142 $this->tabs_gui->setSubTabActive('crs_members_gallery');
2143 $html = $this->ctrl->forwardCommand($profile_gui);
2144 $this->tpl->setVariable("ADM_CONTENT", $html);
2145 break;
2146
2147 case 'ilmemberagreementgui':
2148 $this->tabs_gui->clearTargets();
2149
2150 $this->ctrl->setReturn($this, '');
2151 $agreement = new ilMemberAgreementGUI($this->object->getRefId());
2152 $this->ctrl->forwardCommand($agreement);
2153 break;
2154
2155 // container page editing
2156 case "ilcontainerpagegui":
2157 $ret = $this->forwardToPageObject();
2158 if ($ret != "") {
2159 $this->tpl->setContent($ret);
2160 }
2161 $header_action = false;
2162 break;
2163
2164 case "ilcontainerstartobjectspagegui":
2165 // file downloads, etc. (currently not active)
2166 $pgui = new ilContainerStartObjectsPageGUI($this->object->getId());
2167 $ret = $this->ctrl->forwardCommand($pgui);
2168 if ($ret) {
2169 $this->tpl->setContent($ret);
2170 }
2171 break;
2172
2173 case 'ilobjectcopygui':
2174 $cp = new ilObjectCopyGUI($this);
2175 $cp->setType('crs');
2176 $this->ctrl->forwardCommand($cp);
2177 break;
2178
2179 case "ilobjectcontentstylesettingsgui":
2180
2181 global $DIC;
2182
2183 $this->checkPermission("write");
2184 $this->setTitleAndDescription();
2185 $this->showContainerPageTabs();
2186 $settings_gui = $DIC->contentStyle()->gui()
2187 ->objectSettingsGUIForRefId(
2188 null,
2189 $this->object->getRefId()
2190 );
2191 $this->ctrl->forwardCommand($settings_gui);
2192 break;
2193
2194 case 'ilexportgui':
2195 $this->tabs_gui->setTabActive('export');
2196 $exp = new ilExportGUI($this);
2197 $exp->addFormat('xml');
2198 $this->ctrl->forwardCommand($exp);
2199 break;
2200
2201 case "ilcommonactiondispatchergui":
2203 $this->ctrl->forwardCommand($gui);
2204 break;
2205
2206 case 'ildidactictemplategui':
2207 $this->ctrl->setReturn($this, 'edit');
2208 $did = new ilDidacticTemplateGUI($this, $this->getDidacticTemplateIdFromQuery());
2209 $this->ctrl->forwardCommand($did);
2210 break;
2211
2212 case "ilcertificategui":
2213 $this->tabs_gui->activateTab("settings");
2214 $this->setSubTabs("properties");
2215 $this->tabs_gui->activateSubTab('certificate');
2216
2217 $guiFactory = new ilCertificateGUIFactory();
2218 $output_gui = $guiFactory->create($this->object);
2219 $this->ctrl->forwardCommand($output_gui);
2220 break;
2221
2222 case 'illoeditorgui':
2223 #$this->tabs_gui->clearTargets();
2224 #$this->tabs_gui->setBackTarget($this->lng->txt('back'),$this->ctrl->getLinkTarget($this,''));
2225 $this->tabs_gui->activateTab('crs_objectives');
2226
2227 $editor = new ilLOEditorGUI($this);
2228 $this->ctrl->forwardCommand($editor);
2229 if (strtolower($this->ctrl->getCmdClass()) === "illopagegui") {
2230 $header_action = false;
2231 }
2232 break;
2233
2234 case 'ilcontainerstartobjectsgui':
2235 $this->ctrl->setReturn($this, 'edit');
2236 $this->tabs_gui->clearTargets();
2237 $this->tabs_gui->setBackTarget(
2238 $this->lng->txt("back_to_crs_content"),
2239 $this->ctrl->getLinkTarget($this, "edit")
2240 );
2241 $this->tabs_gui->addTab(
2242 "start",
2243 $this->lng->txt("crs_start_objects"),
2244 $this->ctrl->getLinkTargetByClass("ilcontainerstartobjectsgui", "listStructure")
2245 );
2246 $this->tabs_gui->activateTab("start");
2247 if (strtolower($this->ctrl->getCmdClass()) ==
2248 "ilcontainerstartobjectspagegui") {
2249 $header_action = false;
2250 }
2251 global $DIC;
2252
2253 $ilHelp = $DIC['ilHelp'];
2254 $this->help->setScreenIdComponent("crs");
2255 $stgui = new ilContainerStartObjectsGUI($this->object);
2256 $this->ctrl->forwardCommand($stgui);
2257 break;
2258
2259 case 'illomembertestresultgui':
2260 $GLOBALS['DIC']['ilCtrl']->setReturn($this, 'members');
2261 $GLOBALS['DIC']['ilTabs']->clearTargets();
2262 $GLOBALS['DIC']['ilTabs']->setBackTarget(
2263 $GLOBALS['DIC']['lng']->txt('back'),
2264 $GLOBALS['DIC']['ilCtrl']->getLinkTarget($this, 'members')
2265 );
2266
2267 $uid = 0;
2268 if ($this->http->wrapper()->query()->has('uid')) {
2269 $uid = $this->http->wrapper()->query()->retrieve(
2270 'uid',
2271 $this->refinery->kindlyTo()->int()
2272 );
2273 }
2274 $result_view = new ilLOMemberTestResultGUI($this, $this->object, $uid);
2275 $this->ctrl->forwardCommand($result_view);
2276 break;
2277
2278 case 'ilmailmembersearchgui':
2279 $mail = new ilMail($this->user->getId());
2280
2281 if (
2282 !($this->object->getMailToMembersType() == ilCourseConstants::MAIL_ALLOWED_ALL ||
2283 $this->access->checkAccess('manage_members', "", $this->object->getRefId())) &&
2284 $this->rbac_system->checkAccess('internal_mail', $mail->getMailObjectReferenceId())) {
2285 $this->error->raiseError($this->lng->txt("msg_no_perm_read"), $this->error->MESSAGE);
2286 }
2287
2288 $this->tabs_gui->setTabActive('members');
2289
2290 $mail_search = new ilMailMemberSearchGUI(
2291 $this,
2292 $this->object->getRefId(),
2294 );
2295 $mail_search->setObjParticipants(
2297 );
2298 $this->ctrl->forwardCommand($mail_search);
2299 break;
2300
2301 case 'ilbadgemanagementgui':
2302 $this->tabs_gui->setTabActive('obj_tool_setting_badges');
2303 $bgui = new ilBadgeManagementGUI($this->object->getRefId(), $this->object->getId(), 'crs');
2304 $this->ctrl->forwardCommand($bgui);
2305 break;
2306
2307 case "ilcontainernewssettingsgui":
2308 $this->setSubTabs("properties");
2309 $this->tabs_gui->activateTab('settings');
2310 $this->tabs_gui->activateSubTab('obj_news_settings');
2311 $news_set_gui = new ilContainerNewsSettingsGUI($this);
2312 $news_set_gui->setTimeline(true);
2313 $news_set_gui->setCronNotifications(true);
2314 $news_set_gui->setHideByDate(true);
2315 $this->ctrl->forwardCommand($news_set_gui);
2316 break;
2317
2318 case strtolower(ilNewsTimelineGUI::class):
2319 if (!$this->__checkStartObjects()) { // see #37236
2320 $this->ctrl->redirectByClass(self::class, "view");
2321 }
2322 $this->tabs_gui->setTabActive('news_timeline');
2324 $this->object->getRefId(),
2325 $this->object->getNewsTimelineAutoEntries()
2326 );
2327 $t->setUserEditAll($this->access->checkAccess('write', '', $this->object->getRefId(), 'grp'));
2328 $this->showPermanentLink();
2329 $this->ctrl->forwardCommand($t);
2331 $this->user->getId(),
2332 $this->object->getId(),
2333 $this->object->getRefId(),
2334 'crs'
2335 );
2336 break;
2337
2338 case 'ilmemberexportsettingsgui':
2339 $this->setSubTabs('properties');
2340 $this->tabs_gui->activateTab('properties');
2341 $this->tabs_gui->activateSubTab('export_members');
2342 $settings_gui = new ilMemberExportSettingsGUI($this->object->getType(), $this->object->getId());
2343 $this->ctrl->forwardCommand($settings_gui);
2344 break;
2345
2346 case "ilcontainerskillgui":
2347 $this->tabs_gui->activateTab('obj_tool_setting_skills');
2348 $gui = new ilContainerSkillGUI($this);
2349 $this->ctrl->forwardCommand($gui);
2350 break;
2351
2352 case strtolower(TranslationGUI::class):
2353 $this->checkPermissionBool("write");
2354 $this->setSubTabs("properties");
2355 $this->tabs_gui->activateTab("settings");
2356 $this->tabs_gui->activateSubTab("obj_multilinguality");
2357 $transgui = new TranslationGUI(
2358 $this->getObject(),
2359 $this->lng,
2360 $this->access,
2361 $this->user,
2362 $this->ctrl,
2363 $this->tpl,
2364 $this->ui_factory,
2365 $this->ui_renderer,
2366 $this->http,
2367 $this->refinery,
2368 $this->toolbar
2369 );
2370 $this->ctrl->forwardCommand($transgui);
2371 break;
2372
2373 case "ilbookinggatewaygui":
2374 $this->tabs_gui->activateTab('obj_tool_setting_booking');
2375 $gui = new ilBookingGatewayGUI($this);
2376 $this->ctrl->forwardCommand($gui);
2377 break;
2378
2379 default:
2380 // #9401 - see also ilStartupGUI::_checkGoto()
2381 if ($cmd == 'infoScreenGoto') {
2382 if (ilObjCourse::_isActivated($this->object->getId()) &&
2383 ilObjCourse::_registrationEnabled($this->object->getId())) {
2384 $cmd = 'join';
2385 } else {
2386 $cmd = 'infoScreen';
2387 }
2388 }
2389
2390 if (!$this->creation_mode) {
2391 if ($cmd == "infoScreen") {
2392 $this->checkPermission("visible");
2393 } else {
2394 // $this->checkPermission("read");
2395 }
2396 }
2397
2398 if (!$this->creation_mode
2399 && $cmd != 'infoScreen'
2400 && $cmd != 'sendfile'
2401 && $cmd != 'unsubscribe'
2402 && $cmd != 'deliverCertificate'
2403 && $cmd != 'performUnsubscribe'
2404 && $cmd != 'removeFromDesk'
2405 && $cmd !== 'leave'
2406 && !$this->access->checkAccess("read", '', $this->object->getRefId())
2407 || $cmd == 'join'
2408 || $cmd == 'subscribe'
2409 || $cmd === 'leaveWaitList') {
2410 if ($this->rbac_system->checkAccess('join', $this->object->getRefId()) &&
2411 !ilCourseParticipants::_isParticipant($this->object->getRefId(), $this->user->getId())) {
2412 $this->ctrl->redirectByClass("ilCourseRegistrationGUI");
2413 } else {
2414 $this->infoScreenObject();
2415 break;
2416 }
2417 }
2418
2419 if ($cmd == 'listObjectives') {
2420 $this->ctrl->setReturn($this, "");
2421 $obj_gui = new ilCourseObjectivesGUI($this->object->getRefId());
2422 $this->ctrl->forwardCommand($obj_gui);
2423 break;
2424 }
2425 // if news timeline is landing page, redirect if necessary
2426 if ($cmd == "" && $this->object->isNewsTimelineLandingPageEffective()) {
2427 $this->ctrl->redirectByClass(ilNewsTimelineGUI::class);
2428 }
2429
2430 if (!$cmd) {
2431 $cmd = 'view';
2432 }
2433 $cmd .= 'Object';
2434 $this->$cmd();
2435 break;
2436 }
2437
2438 if ($header_action) {
2439 $this->addHeaderAction();
2440 }
2441 }
2442
2443 private function checkAgreement(): bool
2444 {
2445 if ($this->access->checkAccess('write', '', $this->object->getRefId())) {
2446 return true;
2447 }
2448
2449 // Disable aggrement if is not member of course
2450 if (!$this->object->getMemberObject()->isAssigned()) {
2451 return true;
2452 }
2453
2454 if (ilMemberViewSettings::getInstance()->isActive()) {
2455 return true;
2456 }
2457
2458 $privacy = ilPrivacySettings::getInstance();
2459
2460 // Check agreement
2461 if (
2462 (
2463 $privacy->courseConfirmationRequired() || ilCourseDefinedFieldDefinition::_hasFields($this->object->getId())
2464 ) &&
2465 !ilMemberAgreement::_hasAccepted($this->user->getId(), $this->object->getId())
2466 ) {
2467 $this->logger->warning('Missing course confirmation.');
2468 return false;
2469 }
2470 // Check required fields
2471 if (!ilCourseUserData::_checkRequired($this->user->getId(), $this->object->getId())) {
2472 $this->logger->warning('Missing required fields');
2473 return false;
2474 }
2475 return true;
2476 }
2477
2478 public static function _forwards(): array
2479 {
2480 return array("ilCourseRegisterGUI", 'ilConditionHandlerGUI');
2481 }
2482
2483 protected function membersObject(): void
2484 {
2485 $this->ctrl->redirectByClass('ilcoursemembershipgui');
2486 }
2487
2488 public static function _goto($a_target, string $a_add = ""): void
2489 {
2490 global $DIC;
2491 $main_tpl = $DIC->ui()->mainTemplate();
2492 $ilAccess = $DIC['ilAccess'];
2493 $ilErr = $DIC['ilErr'];
2494 $lng = $DIC['lng'];
2495 $ilUser = $DIC['ilUser'];
2496 $http = $DIC->http();
2497 $refinery = $DIC->refinery();
2498
2499 $a_target = (int) $a_target;
2500
2501 if (substr($a_add, 0, 5) == 'rcode') {
2502 if ($ilUser->getId() == ANONYMOUS_USER_ID) {
2503 $target = '';
2504 if ($http->wrapper()->query()->has('target')) {
2505 $target = $http->wrapper()->query()->retrieve(
2506 'target',
2507 $refinery->kindlyTo()->string()
2508 );
2509 }
2510 // Redirect to login for anonymous
2512 "login.php?target=" . $target . "&cmd=force_login&lang=" .
2513 $ilUser->getCurrentLanguage()
2514 );
2515 }
2516
2517 // Redirects to target location after assigning user to course
2519 $a_target,
2521 substr($a_add, 5)
2522 );
2523 }
2524
2525 if ($a_add == "mem" && $ilAccess->checkAccess("manage_members", "", $a_target)) {
2526 ilObjectGUI::_gotoRepositoryNode($a_target, "members");
2527 }
2528
2529 if ($a_add == "comp" && ilContSkillPresentationGUI::isAccessible($a_target)) {
2530 ilObjectGUI::_gotoRepositoryNode($a_target, "competences");
2531 }
2532
2533 if ($ilAccess->checkAccess("read", "", $a_target)) {
2535 } else {
2536 // to do: force flat view
2537 if ($ilAccess->checkAccess("visible", "", $a_target)) {
2538 ilObjectGUI::_gotoRepositoryNode($a_target, "infoScreenGoto");
2539 } else {
2540 if ($ilAccess->checkAccess("read", "", ROOT_FOLDER_ID)) {
2541 $main_tpl->setOnScreenMessage('failure', sprintf(
2542 $lng->txt("msg_no_perm_read_item"),
2544 ), true);
2546 }
2547 }
2548 }
2549 $ilErr->raiseError($lng->txt("msg_no_perm_read"), $ilErr->FATAL);
2550 }
2551
2552 public function editMapSettingsObject(): void
2553 {
2554 $this->setSubTabs("properties");
2555 $this->tabs_gui->activateTab('settings');
2556 $this->tabs_gui->activateSubTab('crs_map_settings');
2557
2558 if (!ilMapUtil::isActivated() ||
2559 !$this->access->checkAccess("write", "", $this->object->getRefId())) {
2560 return;
2561 }
2562
2563 $latitude = $this->object->getLatitude();
2564 $longitude = $this->object->getLongitude();
2565 $zoom = $this->object->getLocationZoom();
2566
2567 // Get Default settings, when nothing is set
2568 if ($latitude == 0 && $longitude == 0 && $zoom == 0) {
2570 $latitude = $def["latitude"];
2571 $longitude = $def["longitude"];
2572 $zoom = $def["zoom"];
2573 }
2574
2575 $form = new ilPropertyFormGUI();
2576 $form->setFormAction($this->ctrl->getFormAction($this));
2577 $form->setTitle($this->lng->txt("crs_map_settings"));
2578
2579 // enable map
2580 $public = new ilCheckboxInputGUI(
2581 $this->lng->txt("crs_enable_map"),
2582 "enable_map"
2583 );
2584 $public->setValue("1");
2585 $public->setChecked($this->object->getEnableCourseMap());
2586 $form->addItem($public);
2587
2588 // map location
2589 $loc_prop = new ilLocationInputGUI(
2590 $this->lng->txt("crs_map_location"),
2591 "location"
2592 );
2593 $loc_prop->setLatitude((float) $latitude);
2594 $loc_prop->setLongitude((float) $longitude);
2595 $loc_prop->setZoom((int) $zoom);
2596 $form->addItem($loc_prop);
2597
2598 $form->addCommandButton("saveMapSettings", $this->lng->txt("save"));
2599
2600 $this->tpl->setVariable("ADM_CONTENT", $form->getHTML());
2601 //$this->tpl->show();
2602 }
2603
2607 public function saveMapSettingsObject(): void
2608 {
2609 $location = [];
2610 if ($this->http->wrapper()->post()->has('location')) {
2611 $custom_transformer = $this->refinery->custom()->transformation(
2612 fn($array) => $array
2613 );
2614 $location = $this->http->wrapper()->post()->retrieve(
2615 'location',
2616 $custom_transformer
2617 );
2618 }
2619 $enable_map = false;
2620 if ($this->http->wrapper()->post()->has('enable_map')) {
2621 $enable_map = $this->http->wrapper()->post()->retrieve(
2622 'enable_map',
2623 $this->refinery->kindlyTo()->bool()
2624 );
2625 }
2626 $this->object->setLatitude($location['latitude']);
2627 $this->object->setLongitude($location['longitude']);
2628 $this->object->setLocationZoom($location['zoom']);
2629 $this->object->setEnableCourseMap($enable_map);
2630 $this->object->update();
2631 $this->ctrl->redirect($this, "editMapSettings");
2632 }
2633
2637 public function modifyItemGUI(ilObjectListGUI $a_item_list_gui, array $a_item_data): void
2638 {
2640 $a_item_list_gui,
2641 'ilcoursecontentgui',
2642 $a_item_data,
2643 $this->object->getAboStatus(),
2644 $this->object->getRefId(),
2645 $this->object->getId()
2646 );
2647 }
2648
2649 public static function _modifyItemGUI(
2650 ilObjectListGUI $a_item_list_gui,
2651 string $a_cmd_class,
2652 array $a_item_data,
2653 bool $a_abo_status,
2654 int $a_course_ref_id,
2655 int $a_course_obj_id,
2656 int $a_parent_ref_id = 0
2657 ): void {
2658 global $DIC;
2659 $lng = $DIC->language();
2660 $ilAccess = $DIC->access();
2661
2662 // this is set for folders within the course
2663 if ($a_parent_ref_id == 0) {
2664 $a_parent_ref_id = $a_course_ref_id;
2665 }
2666
2667 // Special handling for tests in courses with learning objectives
2668 if ($a_item_data['type'] == 'tst' && ilObjCourse::_lookupViewMode($a_course_obj_id) == ilContainer::VIEW_OBJECTIVE) {
2669 $a_item_list_gui->addCommandLinkParameter(array('crs_show_result' => $a_course_ref_id));
2670 }
2671
2672 $a_item_list_gui->enableSubscribe($a_abo_status);
2673
2674 $is_tutor = ($ilAccess->checkAccess(
2675 'write',
2676 '',
2677 $a_course_ref_id,
2678 'crs',
2679 $a_course_obj_id
2680 ));
2681 }
2682
2686 public function setContentSubTabs(): void
2687 {
2688 global $DIC;
2689
2690 $ilAccess = $DIC['ilAccess'];
2691 $lng = $DIC['lng'];
2692 $ilCtrl = $DIC['ilCtrl'];
2693
2694 if ($this->object->getType() != 'crs') {
2695 return;
2696 }
2697 if (!$this->access->checkAccess(
2698 'write',
2699 '',
2700 $this->object->getRefId(),
2701 'crs',
2702 $this->object->getId()
2703 )) {
2704 $is_tutor = false;
2705 // No further tabs if objective view or archives
2706 if ($this->object->enabledObjectiveView()) {
2707 return;
2708 }
2709 } else {
2710 $is_tutor = true;
2711 }
2712
2713 if (!$this->isActiveAdministrationPanel()) {
2714 $this->tabs_gui->addSubTab(
2715 "view_content",
2716 $lng->txt("view"),
2717 $this->ctrl->getLinkTargetByClass("ilobjcoursegui", "view")
2718 );
2719 } else {
2720 $this->tabs_gui->addSubTab(
2721 "view_content",
2722 $lng->txt("view"),
2723 $this->ctrl->getLinkTargetByClass("ilobjcoursegui", "disableAdministrationPanel")
2724 );
2725 }
2726 //}
2727
2728 $this->addStandardContainerSubTabs(false);
2729 }
2730
2731 public function askResetObject(): void
2732 {
2733 //$this->tpl->setOnScreenMessage('question', $this->lng->txt('crs_objectives_reset_sure'));
2734 $confirm = new ilConfirmationGUI();
2735 $confirm->setHeaderText($this->lng->txt('crs_objectives_reset_sure'));
2736 $confirm->setFormAction($this->ctrl->getFormAction($this));
2737 $confirm->setConfirm($this->lng->txt('reset'), 'reset');
2738 $confirm->setCancel($this->lng->txt('cancel'), 'cancel');
2739 $this->tpl->setContent($confirm->getHTML());
2740 }
2741
2742 public function resetObject(): void
2743 {
2744 $usr_results = new ilLOUserResults($this->object->getId(), $GLOBALS['DIC']['ilUser']->getId());
2745 $usr_results->delete();
2747 $this->object->getId(),
2748 $GLOBALS['DIC']['ilUser']->getId()
2749 );
2750
2751 $tmp_obj_res = new ilCourseObjectiveResult($this->user->getId());
2752 $tmp_obj_res->reset($this->object->getId());
2753
2754 $this->user->deletePref('crs_objectives_force_details_' . $this->object->getId());
2755 $this->tpl->setOnScreenMessage('success', $this->lng->txt('crs_objectives_reseted'));
2756 $this->viewObject();
2757 }
2758
2759 public function __checkStartObjects(): bool
2760 {
2761 if ($this->access->checkAccess('write', '', $this->object->getRefId())) {
2762 return true;
2763 }
2764 $this->start_obj = new ilContainerStartObjects(
2765 $this->object->getRefId(),
2766 $this->object->getId()
2767 );
2768 if (count($this->start_obj->getStartObjects()) &&
2769 !$this->start_obj->allFullfilled($this->user->getId())) {
2770 return false;
2771 }
2772 return true;
2773 }
2774
2779 public function createMailSignature(): string
2780 {
2781 $link = chr(13) . chr(10) . chr(13) . chr(10);
2782 $link .= $this->lng->txt('crs_mail_permanent_link');
2783 $link .= chr(13) . chr(10) . chr(13) . chr(10);
2784 $link .= ilLink::_getLink($this->object->getRefId());
2785 return rawurlencode(base64_encode($link));
2786 }
2787
2788 protected function initHeaderAction(?string $sub_type = null, ?int $sub_id = null): ?ilObjectListGUI
2789 {
2790 $lg = parent::initHeaderAction($sub_type, $sub_id);
2791
2792 if ($lg && $this->ref_id && ilCourseParticipants::_isParticipant($this->ref_id, $this->user->getId())) {
2793 // certificate
2794
2795 $validator = new ilCertificateDownloadValidator();
2796 if ($validator->isCertificateDownloadable($this->user->getId(), $this->object->getId())) {
2797 $cert_url = $this->ctrl->getLinkTarget($this, "deliverCertificate");
2798
2799 $this->lng->loadLanguageModule("certificate");
2800 $lg->addCustomCommand($cert_url, "download_certificate");
2801
2802 $lg->addHeaderIcon(
2803 "cert_icon",
2804 ilUtil::getImagePath("standard/icon_cert.svg"),
2805 $this->lng->txt("download_certificate"),
2806 null,
2807 null,
2808 $cert_url
2809 );
2810 }
2811
2812 // notification
2814 $noti = new ilMembershipNotifications($this->ref_id);
2815 if (!$noti->isCurrentUserActive()) {
2816 $lg->addHeaderIcon(
2817 "not_icon",
2818 ilUtil::getImagePath("object/notification_off.svg"),
2819 $this->lng->txt("crs_notification_deactivated")
2820 );
2821
2822 $this->ctrl->setParameter($this, "crs_ntf", 1);
2823 $caption = "crs_activate_notification";
2824 } else {
2825 $lg->addHeaderIcon(
2826 "not_icon",
2827 ilUtil::getImagePath("object/notification_on.svg"),
2828 $this->lng->txt("crs_notification_activated")
2829 );
2830
2831 $this->ctrl->setParameter($this, "crs_ntf", 0);
2832 $caption = "crs_deactivate_notification";
2833 }
2834
2835 if ($noti->canCurrentUserEdit()) {
2836 $lg->addCustomCommand(
2837 $this->ctrl->getLinkTarget($this, "saveNotification"),
2838 $caption
2839 );
2840 }
2841
2842 $this->ctrl->setParameter($this, "crs_ntf", "");
2843 }
2844 }
2845
2846 return $lg;
2847 }
2848
2852 public function deliverCertificateObject(): void
2853 {
2854 $user_id = null;
2855 if ($this->access->checkAccess('manage_members', '', $this->ref_id)) {
2856 $user_id = 0;
2857 if ($this->http->wrapper()->query()->has('member_id')) {
2858 $user_id = $this->http->wrapper()->query()->retrieve(
2859 'member_id',
2860 $this->refinery->kindlyTo()->int()
2861 );
2862 }
2863 }
2864 if (!$user_id) {
2865 $user_id = $this->user->getId();
2866 }
2867
2868 $objId = $this->object->getId();
2869
2870 $validator = new ilCertificateDownloadValidator();
2871
2872 if (false === $validator->isCertificateDownloadable($user_id, $objId)) {
2873 $this->tpl->setOnScreenMessage('failure', $this->lng->txt("permission_denied"), true);
2874 $this->ctrl->redirect($this);
2875 }
2876
2877 $repository = new ilUserCertificateRepository();
2878
2879 $pdfGenerator = new ilPdfGenerator($repository);
2880
2881 $pdfAction = new ilCertificatePdfAction(
2882 $pdfGenerator,
2884 $this->lng->txt('error_creating_certificate_pdf')
2885 );
2886 $pdfAction->downloadPdf((int) $user_id, $objId);
2887 }
2888
2889 protected function afterSaveCallback(): void
2890 {
2891 $this->ctrl->redirectByClass(array('ilrepositorygui', 'ilobjcoursegui', 'illoeditorgui'), 'materials');
2892 }
2893
2894 public function saveSortingObject(): void
2895 {
2896 $post_position = (array) ($this->http->request()->getParsedBody()['position'] ?? []);
2897 if (isset($post_position['lobj'])) {
2898 $lobj = $post_position['lobj'];
2899 $objective_order = array();
2900 foreach ($lobj as $objective_id => $materials) {
2901 $objective_order[$objective_id] = $materials[0];
2902 unset($lobj[$objective_id][0]);
2903 }
2904 // objective order
2905 asort($objective_order);
2906 $pos = 0;
2907 foreach (array_keys($objective_order) as $objective_id) {
2908 $obj = new ilCourseObjective($this->object, $objective_id);
2909 $obj->writePosition(++$pos);
2910 }
2911
2912 // material order
2913 foreach ($lobj as $objective_id => $materials) {
2914 $objmat = new ilCourseObjectiveMaterials($objective_id);
2915
2916 asort($materials);
2917 $pos = 0;
2918 foreach (array_keys($materials) as $ass_id) {
2919 $objmat->writePosition($ass_id, ++$pos);
2920 }
2921 }
2922 }
2923 parent::saveSortingObject();
2924 }
2925
2926 protected function redirectLocToTestConfirmedObject(): void
2927 {
2928 $tid = 0;
2929 if ($this->http->wrapper()->query()->has('tid')) {
2930 $tid = $this->http->wrapper()->query()->retrieve(
2931 'tid',
2932 $this->refinery->kindlyTo()->int()
2933 );
2934 } elseif ($this->http->wrapper()->post()->has('tid')) {
2935 $tid = $this->http->wrapper()->post()->retrieve(
2936 'tid',
2937 $this->refinery->kindlyTo()->int()
2938 );
2939 }
2940 ilUtil::redirect(ilLink::_getLink($tid));
2941 }
2942
2943 protected function redirectLocToTestObject($a_force_new_run = null): void
2944 {
2945 $tid = 0;
2946 if ($this->http->wrapper()->query()->has('tid')) {
2947 $tid = $this->http->wrapper()->query()->retrieve(
2948 'tid',
2949 $this->refinery->kindlyTo()->int()
2950 );
2951 }
2952 $objective_id = 0;
2953 if ($this->http->wrapper()->query()->has('objective_id')) {
2954 $objective_id = $this->http->wrapper()->query()->retrieve(
2955 'objective_id',
2956 $this->refinery->kindlyTo()->int()
2957 );
2958 }
2959
2960 $res = new ilLOUserResults(
2961 $this->object->getId(),
2962 $this->user->getId()
2963 );
2964 $passed = $res->getCompletedObjectiveIds();
2965
2966 $has_completed = false;
2967 if ($objective_id) {
2968 $objective_ids = array($objective_id);
2969 if (in_array($objective_id, $passed)) {
2970 $has_completed = true;
2971 $passed = array();
2972 }
2973 } else {
2974 $objective_ids = ilCourseObjective::_getObjectiveIds($this->object->getId(), true);
2975
2976 // do not disable objective question if all are passed
2977 if (count($objective_ids) === count($passed)) {
2978 $has_completed = true;
2979 $passed = array();
2980 }
2981 }
2982
2983 if ($has_completed) {
2984 // show confirmation
2985 $this->redirectLocToTestConfirmation($objective_id, $tid);
2986 return;
2987 }
2988 ilUtil::redirect(ilLink::_getLink($tid));
2989 }
2990
2994 protected function redirectLocToTestConfirmation(int $a_objective_id, int $a_test_id): void
2995 {
2996 $confirm = new ilConfirmationGUI();
2997 $confirm->setFormAction($GLOBALS['DIC']['ilCtrl']->getFormAction($this));
2998
2999 if ($a_objective_id) {
3000 $question = $this->lng->txt('crs_loc_objective_passed_confirmation');
3001 } else {
3002 $question = $this->lng->txt('crs_loc_objectives_passed_confirmation');
3003 }
3004
3005 $confirm->setHeaderText($question);
3006 $confirm->addHiddenItem('objective_id', (string) $a_objective_id);
3007 $confirm->addHiddenItem('tid', (string) $a_test_id);
3008 $confirm->setConfirm($this->lng->txt('crs_loc_tst_start'), 'redirectLocToTestConfirmed');
3009 $confirm->setCancel($this->lng->txt('cancel'), 'view');
3010
3011 //$this->tpl->setOnScreenMessage('question', $question);
3012 $this->tpl->setContent($confirm->getHTML());
3013 }
3014
3020 public function getLocalRoles(array $a_exclude = array()): array
3021 {
3022 $crs_admin = $this->object->getDefaultAdminRole();
3023 $crs_member = $this->object->getDefaultMemberRole();
3024 $local_roles = $this->object->getLocalCourseRoles(false);
3025 $crs_roles = [];
3026
3027 //put the course member role to the top of the crs_roles array
3028 if (in_array($crs_member, $local_roles)) {
3029 #$crs_roles[$crs_member] = ilObjRole::_getTranslation(array_search ($crs_member, $local_roles));
3030 #unset($local_roles[$crs_roles[$crs_member]]);
3031 }
3032
3033 foreach ($local_roles as $title => $role_id) {
3034 if ($role_id == $crs_admin && !$this->hasAdminPermission()) {
3035 continue;
3036 }
3037
3038 $crs_roles[$role_id] = ilObjRole::_getTranslation($title);
3039 }
3040
3041 if ($a_exclude !== []) {
3042 foreach ($a_exclude as $excluded_role) {
3043 if (isset($crs_roles[$excluded_role])) {
3044 unset($crs_roles[$excluded_role]);
3045 }
3046 }
3047 }
3048 return $crs_roles;
3049 }
3050
3051 protected function hasAdminPermission(): bool
3052 {
3053 return
3054 ilCourseParticipant::_getInstanceByObjId($this->object->getId(), $this->user->getId())->isAdmin() ||
3055 $this->checkPermissionBool('edit_permission');
3056 }
3057
3058 protected function jump2UsersGalleryObject(): void
3059 {
3060 $this->ctrl->redirectByClass(ilUsersGalleryGUI::class);
3061 }
3062
3066 public function setSideColumnReturn(): void
3067 {
3068 $this->ctrl->setReturn($this, "view");
3069 }
3070} // END class.ilObjCourseGUI
$location
Definition: buildRTE.php:22
Builds data types.
Definition: Factory.php:36
Render add new item selector.
kindlyTo()
Combined validations and transformations for primitive data types that establish a baseline for furth...
Definition: Factory.php:55
GUI class for public user profile presentation.
const IL_CAL_UNIX
error(string $a_errmsg)
setInfoObject(ilInfoScreenGUI $info)
get info sections
@ilCtrl_Calls ilBadgeManagementGUI: ilPropertyFormGUI
This class is used for integration of the booking manager as a service into other repository objects,...
Validates if an active certificate is stored in the database and can be downloaded by the user.
Just a wrapper class to create Unit Test for other classes.
static _recordWriteEvent(int $obj_id, int $usr_id, string $action, ?int $parent_obj_id=null)
Records a write event.
This class represents a checkbox property in a property form.
static getInstanceFromAjaxCall()
(Re-)Build instance from ajax call
class ilConditionHandlerGUI
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Class ilContainerGUI This is a base GUI class for all container objects in ILIAS: root folder,...
ILIAS Container InternalGUIService $gui
afterUpdate()
Post (successful) object update hook.
initSortingForm(ilPropertyFormGUI $form, array $a_sorting_settings)
Append sorting settings to property form.
ilPropertyFormGUI $form
ilErrorHandling $error
saveListPresentation(ilPropertyFormGUI $form)
initListPresentationForm(ilPropertyFormGUI $form)
Add list presentation settings to form.
saveSortingSettings(ilPropertyFormGUI $form)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Skills for container (course/group) (top gui class)
Class ilContainerStartObjectsGUI.
Container start objects page GUI class.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static _writeContainerSetting(int $a_id, string $a_keyword, string $a_value)
static _lookupContainerSetting(int $a_id, string $a_keyword, ?string $a_default_value=null)
static setBlockedForLP(bool $a_status)
Toggle LP blocking property status.
Class ilCourseContentGUI.
static _getFields(int $a_container_id, $a_sort=self::IL_CDF_SORT_NAME)
Get all fields of a container.
static _hasFields(int $a_container_id)
Check if there are any define fields.
static _readFilesByCourse(int $a_course_id)
class ilCourseObjectiveMaterials
class ilcourseobjective
static _getCountObjectives(int $a_obj_id, bool $a_activated_only=false)
static _getObjectiveIds(int $course_id, bool $a_activated_only=false)
class ilobjcourseobjectivesgui
static _getInstanceByObjId(int $a_obj_id, int $a_usr_id)
static _getInstanceByObjId(int $a_obj_id)
GUI class for course registrations.
static _checkRequired(int $a_usr_id, int $a_obj_id)
This class represents a custom property in a property form.
input GUI for a time span (start and end date)
static formatDate(ilDateTime $date, bool $a_skip_day=false, bool $a_include_wd=false, bool $include_seconds=false, ?ilObjUser $user=null,)
static formatPeriod(ilDateTime $start, ilDateTime $end, bool $a_skip_starting_day=false, ?ilObjUser $user=null)
Format a period of two dates Shows: 14.
This class represents a date/time property in a property form.
@classDescription Date and time handling
isNull()
Check if a date is null (Datetime == '0000-00-00 00:00:00', unixtime == 0,...)
GUI class for didactic template settings inside repository objects.
Class ilECSCourseSettings.
static _getInstanceByType(string $a_type)
Get Singleton Instance.
Export User Interface Class.
static deliverFileLegacy(string $a_file, ?string $a_filename=null, ?string $a_mime=null, ?bool $isInline=false, ?bool $removeAfterDelivery=false, ?bool $a_exit_after=true)
This class represents a file property in a property form.
static getValidFilename(string $a_filename)
setFormAction(string $a_formaction)
setMultipart(bool $a_multipart)
This class represents a section header in a property form.
Help GUI class.
This class represents a hidden form property in a property form.
Class ilInfoScreenGUI.
Class ilLOEditorGUI.
static deleteRuns(int $a_container_id, int $a_user_id)
static _lookupCompletedForObject(int $a_obj_id, ?array $a_user_ids=null)
static _lookupFailedForObject(int $a_obj_id, ?array $a_user_ids=null)
static _lookupInProgressForObject(int $a_obj_id, ?array $a_user_ids=null)
static _updateStatus(int $a_obj_id, int $a_usr_id, ?object $a_obj=null, bool $a_percentage=false, bool $a_force_raise=false)
const LP_STATUS_COMPLETED
const LP_STATUS_FAILED
const LP_STATUS_NOT_ATTEMPTED
const LP_STATUS_IN_PROGRESS
GUI class for LTI provider object settings.
txt(string $a_topic, string $a_default_lang_fallback_mod="")
gets the text for a given topic if the topic is not in the list, the topic itself with "-" will be re...
static checkAccess(int $a_ref_id, bool $a_allow_only_read=true)
check access to learning progress
Class ilObjUserTrackingGUI.
static _lookupProgressByObjId(int $a_obj_id)
lookup progress for a specific object
static _tracProgress(int $a_user_id, int $a_obj_id, int $a_ref_id, string $a_obj_type='')
This class represents a location property in a property form.
Component logger with individual log levels by component id.
static getLinkTarget( $gui, string $cmd, array $gui_params=[], array $mail_params=[], array $context_params=[])
final const string CONTEXT_KEY
Class ilMailMemberCourseRoles.
static isActivated()
Checks whether Map feature is activated.
static getDefaultSettings()
Get default longitude, latitude and zoom.
static _hasAccepted(int $a_usr_id, int $a_obj_id)
Check if user has accepted agreement.
Membership notification settings.
static generateCode()
Generate new registration key.
static handleCode(int $a_ref_id, string $a_type, string $a_code)
Last visited history for repository items.
static getInstance(int $a_ref_id, bool $a_include_auto_entries)
This class represents a number property in a property form.
static lookupRegistrationInfo(int $a_obj_id)
Class ilObjCourseGUI.
readMemberData(array $ids, ?array $selected_columns=null, bool $skip_names=false)
setSubTabs(string $a_tab)
modifyItemGUI(ilObjectListGUI $a_item_list_gui, array $a_item_data)
@inheritDoc
renderAddNewItem(string ... $disabled_object_types)
setContentSubTabs()
@inheritDoc
static _modifyItemGUI(ilObjectListGUI $a_item_list_gui, string $a_cmd_class, array $a_item_data, bool $a_abo_status, int $a_course_ref_id, int $a_course_obj_id, int $a_parent_ref_id=0)
__construct($a_data, int $a_id, bool $a_call_by_reference=true, bool $a_prepare_output=true)
ilContainerStartObjects $start_obj
ilNavigationHistory $navigation_history
GlobalHttpState $http
afterImport(ilObject $new_object)
Post (successful) object import hook.
static _goto($a_target, string $a_add="")
createMailSignature()
Create a course mail signature.
ilDataFactory $data_factory
setSideColumnReturn()
@inheritDoc
redirectLocToTestObject($a_force_new_run=null)
updateLPFromStatus(int $a_member_id, bool $a_has_passed)
sync course status and lp status
infoScreenObject()
this one is called from the info button in the repository not very nice to set cmdClass/Cmd manually,...
ilAdvancedMDRecordGUI $record_gui
getTabs()
@abstract overwrite in derived GUI class of your object type
updateObject()
updates object entry in object_data
redirectLocToTestConfirmation(int $a_objective_id, int $a_test_id)
Show confirmation whether user wants to start a new run or resume a previous run.
afterSave(ilObject $new_object)
@inheritDoc
editObject(?ilPropertyFormGUI $form=null)
initHeaderAction(?string $sub_type=null, ?int $sub_id=null)
Add header action menu.
deleteObject(bool $error=false)
Display deletion confirmation screen.
getLocalRoles(array $a_exclude=array())
showPossibleSubObjects()
@inheritDoc
getEditFormValues()
values are already set in initEditForm Returning an empty array avoid overriding these values.
Class ilObjCourseGroupingGUI.
static _lookupViewMode(int $a_id)
const int STATUS_DETERMINATION_MANUAL
const int STATUS_DETERMINATION_LP
static _registrationEnabled(int $a_obj_id)
Registration enabled? Method is in Access class, since it is needed by Access/ListGUI.
static _isActivated(int $a_obj_id)
Is activated.
static getAvailablePortfolioLinksForUserIds(array $a_owner_ids)
static _getTranslation(string $a_role_title)
static _lookupName(int $a_user_id)
GUI class for the workflow of copying objects.
buildAddNewItemElements(array $subtypes, string $create_target_class=ilRepositoryGUI::class, ?int $redirect_target_ref_id=null,)
ilGlobalTemplateInterface $tpl
static _gotoRepositoryRoot(bool $raise_error=false)
Goto repository root.
checkPermission(string $perm, string $cmd="", string $type="", ?int $ref_id=null)
viewObject()
viewObject container presentation for "administration -> repository, trash, permissions"
checkPermissionBool(string $perm, string $cmd="", string $type="", ?int $ref_id=null)
initDidacticTemplate(ilPropertyFormGUI $form)
ilSetting $settings
addHeaderAction()
Add header action menu.
static _gotoRepositoryNode(int $ref_id, string $cmd="")
prepareOutput(bool $show_sub_objects=true)
getReturnLocation(string $cmd, string $default_location="")
Get return location for command (command is method name without "Object", e.g.
ilLanguage $lng
static getInstance(int $obj_id)
enableSubscribe(bool $status)
Class ilObjectMetaDataGUI.
static updateServiceSettingsForm(int $obj_id, ilPropertyFormGUI $form, array $services)
static initServiceSettingsForm(int $obj_id, ilPropertyFormGUI $form, array $services)
Class ilObject Basic functions for all objects.
static _lookupType(int $id, bool $reference=false)
static _lookupObjId(int $ref_id)
static _lookupTitle(int $obj_id)
static getInstanceByObjId(int $a_obj_id)
Get instance by obj type.
static _isParticipant(int $a_ref_id, int $a_usr_id)
Static function to check if a user is a participant of the container object.
This class represents a property form user interface.
addCommandButton(string $a_cmd, string $a_text, string $a_id="")
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 class represents an option in a radio group.
This class represents a selection list property in a property form.
special template class to simplify handling of ITX/PEAR
This class represents a text area property in a property form.
This class represents a text property in a property form.
static makeClickable(string $a_text, bool $detectGotoLinks=false, ?string $ilias_http_path=null)
static getImagePath(string $image_name, string $module_path="", string $mode="output", bool $offline=false)
get image path (for images located in a template directory)
static redirect(string $a_script)
static _isOnList(int $a_usr_id, int $a_obj_id)
const ANONYMOUS_USER_ID
Definition: constants.php:27
const ROOT_FOLDER_ID
Definition: constants.php:32
$c
Definition: deliver.php:25
$info
Definition: entry_point.php:21
Interface GlobalHttpState.
setVariable(string $variable, $value='')
Sets the given variable to the given value.
parseCurrentBlock(string $block_name=self::DEFAULT_BLOCK)
Parses the given block.
setCurrentBlock(string $part=self::DEFAULT_BLOCK)
Sets the template to the given block.
get(string $part=self::DEFAULT_BLOCK)
Renders the given block and returns the html string.
$res
Definition: ltiservices.php:69
if($clientAssertionType !='urn:ietf:params:oauth:client-assertion-type:jwt-bearer'|| $grantType !='client_credentials') $parts
Definition: ltitoken.php:61
static http()
Fetches the global http state from ILIAS.
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
global $lng
Definition: privfeed.php:31
$ilErr
Definition: raiseError.php:33
global $DIC
Definition: shib_login.php:26
$GLOBALS["DIC"]
Definition: wac.php:54
$text
Definition: xapiexit.php:21
$objId
Definition: xapitoken.php:55