ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
class.ilInfoScreenGUI.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
23use ILIAS\Export\ExportHandler\Factory as ExportServices;
24use ILIAS\Data\Factory as DataFactory;
26
35{
36 protected \ILIAS\Repository\HTML\HTMLUtil $html;
37 protected \ILIAS\DI\UIServices $ui;
43 protected ilObjUser $user;
44 protected ilTree $tree;
46 protected Metadata $metadata;
47 protected DataFactory $data_factory;
49 public ilCtrl $ctrl;
50 public ?object $gui_object;
51 public array $top_buttons = array();
52 public array $top_formbuttons = array();
53 public array $hiddenelements = array();
54 public string $table_class = "il_InfoScreen";
55 public bool $open_form_tag = true;
56 public bool $close_form_tag = true;
57 protected ?int $contextRefId = null;
58 protected ?int $contextObjId = null;
59 protected ?string $contentObjType = null;
60 public string $form_action;
61 protected bool $booking_enabled = false;
62 protected bool $availability_enabled = true;
63 protected bool $hidden = false;
64 protected array $section = [];
65 protected array $block_property = [];
66 protected bool $news_editing = false;
67 protected bool $show_hidden_toggle = false;
68 protected int $sec_nr = 0;
69 protected bool $private_notes_enabled = false;
70 protected bool $news_enabled = false;
71 protected bool $feedback_enabled = false;
72 protected bool $learning_progress_enabled = false;
74
75
76 public function __construct(?object $a_gui_object = null)
77 {
78 global $DIC;
79
80 $this->rbacsystem = $DIC->rbac()->system();
81 $this->tpl = $DIC["tpl"];
82 $this->access = $DIC->access();
83 $this->user = $DIC->user();
84 $this->tree = $DIC->repositoryTree();
85 $this->settings = $DIC->settings();
86 $ilCtrl = $DIC->ctrl();
87 $lng = $DIC->language();
88 $ilTabs = $DIC->tabs();
89 $this->metadata = $DIC->learningObjectMetadata();
90
91 $this->ctrl = $ilCtrl;
92 $this->lng = $lng;
93 $this->tabs_gui = $ilTabs;
94 $this->gui_object = $a_gui_object;
95 $this->form_action = "";
96 $this->top_formbuttons = array();
97 $this->hiddenelements = array();
98 $this->ui = $DIC->ui();
99 $this->request = $DIC->infoScreen()->internal()->gui()->standardRequest();
100 $this->html = $DIC->infoScreen()->internal()->gui()->html();
101 $this->data_factory = new DataFactory();
102 }
103
110 public function executeCommand(): void
111 {
113
114 $next_class = $this->ctrl->getNextClass($this);
115
116 $cmd = $this->ctrl->getCmd("showSummary");
117 $this->ctrl->setReturn($this, "showSummary");
118
119 $this->setTabs();
120
121 switch ($next_class) {
122 case strtolower(ilCommentGUI::class):
123 if ($this->ctrl->isAsynch()) {
124 $this->showNotesSection();
125 } else {
126 $this->showSummary(); // forwards command
127 }
128 break;
129
130 case "ilcolumngui":
131 $this->showSummary();
132 break;
133
134 case strtolower(PublicProfileGUI::class):
135 $user_profile = new PublicProfileGUI($this->request->getUserId());
136 $user_profile->setBackUrl($this->ctrl->getLinkTarget($this, "showSummary"));
137 $html = $this->ctrl->forwardCommand($user_profile);
139 break;
140
141 case "ilcommonactiondispatchergui":
143 $this->ctrl->forwardCommand($gui);
144 break;
145
146 default:
147 $this->$cmd();
148 break;
149 }
150 }
151
152 public function setMessageBox(ILIAS\UI\Component\MessageBox\MessageBox $a_val): void
153 {
154 $this->mbox = $a_val;
155 }
156
157 public function getMessageBox(): ILIAS\UI\Component\MessageBox\MessageBox
158 {
159 return $this->mbox;
160 }
161
162
163 public function setTableClass(string $a_val): void
164 {
165 $this->table_class = $a_val;
166 }
167
168 public function getTableClass(): string
169 {
170 return $this->table_class;
171 }
172
173 public function enablePrivateNotes(bool $a_enable = true): void
174 {
175 $this->private_notes_enabled = $a_enable;
176 }
177
178 public function enableLearningProgress(bool $a_enable = true): void
179 {
180 $this->learning_progress_enabled = $a_enable;
181 }
182
183 public function enableAvailability(bool $a_enable = true): void
184 {
185 $this->availability_enabled = $a_enable;
186 }
187
188 public function enableBookingInfo(bool $a_enable = true): void
189 {
190 $this->booking_enabled = $a_enable;
191 }
192
193
194 public function enableFeedback(bool $a_enable = true): void
195 {
196 $this->feedback_enabled = $a_enable;
197 }
198
199 public function enableNews(bool $a_enable = true): void
200 {
201 $this->news_enabled = $a_enable;
202 }
203
204 public function enableNewsEditing(bool $a_enable = true): void
205 {
206 $this->news_editing = $a_enable;
207 }
208
213 public function setBlockProperty(string $a_block_type, string $a_property, string $a_value): void
214 {
215 $this->block_property[$a_block_type][$a_property] = $a_value;
216 }
217
218 public function getAllBlockProperties(): array
219 {
221 }
222
223 public function addSection(string $a_title): void
224 {
225 $this->sec_nr++;
226 $this->section[$this->sec_nr]["title"] = $a_title;
227 $this->section[$this->sec_nr]["hidden"] = $this->hidden;
228 }
229
233 public function setFormAction(string $a_form_action): void
234 {
235 $this->form_action = $a_form_action;
236 }
237
238 public function removeFormAction(): void
239 {
240 $this->form_action = "";
241 }
242
250 public function addProperty(string $a_name, string $a_value, string $a_link = ""): void
251 {
252 $this->section[$this->sec_nr]["properties"][] =
253 array("name" => $a_name, "value" => $a_value,
254 "link" => $a_link);
255 }
256
257
261 public function addPropertyTextinput(
262 string $a_name,
263 string $a_input_name,
264 string $a_input_value = "",
265 string $a_input_size = "",
266 string $direct_button_command = "",
267 string $direct_button_label = "",
268 bool $direct_button_primary = false
269 ): void {
270 $input = "<span class=\"form-inline\"><input class=\"form-control\" type=\"text\" name=\"$a_input_name\" id=\"$a_input_name\"";
271 if (strlen($a_input_value)) {
272 $input .= " value=\"" . ilLegacyFormElementsUtil::prepareFormOutput($a_input_value) . "\"";
273 }
274 if (strlen($a_input_size)) {
275 $input .= " size=\"" . $a_input_size . "\"";
276 }
277 $input .= " />";
278 if (strlen($direct_button_command) && strlen($direct_button_label)) {
279 $css = "";
280 if ($direct_button_primary) {
281 $css = " btn-primary";
282 }
283 $input .= " <input type=\"submit\" class=\"btn btn-default" . $css . "\" name=\"cmd[$direct_button_command]\" value=\"$direct_button_label\" />";
284 }
285 $input .= "</span>";
286 $this->section[$this->sec_nr]["properties"][] =
287 array("name" => "<label for=\"$a_input_name\">$a_name</label>", "value" => $input);
288 }
289
293 public function addButton(
294 string $a_title,
295 string $a_link,
296 string $a_frame = "",
297 string $a_position = "top",
298 bool $a_primary = false
299 ): void {
300 if ($a_position == "top") {
301 $this->top_buttons[] =
302 array("title" => $a_title,"link" => $a_link,"target" => $a_frame,"primary" => $a_primary);
303 }
304 }
305
310 public function addFormButton(
311 string $a_command,
312 string $a_title,
313 string $a_position = "top"
314 ): void {
315 if ($a_position == "top") {
316 $this->top_formbuttons[] = array("command" => $a_command, "title" => $a_title);
317 }
318 }
319
320 public function addHiddenElement(string $a_name, string $a_value): void
321 {
322 $this->hiddenelements[] = array("name" => $a_name, "value" => $a_value);
323 }
324
325 public function addMetaDataSections(int $a_rep_obj_id, int $a_obj_id, string $a_type): void
326 {
328
329 $lng->loadLanguageModule("meta");
330 $lng->loadLanguageModule('export');
331
332 $md_reader = $this->metadata->read($a_rep_obj_id, $a_obj_id, $a_type);
333 $md_paths = $this->metadata->paths();
334 $md_data_helper = $this->metadata->dataHelper();
335 $md_copyright_helper = $this->metadata->copyrightHelper();
336
337 // general
338 $lang_data = $md_reader->allData($md_paths->languages());
339 $langs = $md_data_helper->makePresentableAsList(', ', ...$lang_data);
340
341 $keyword_data = $md_reader->allData($md_paths->keywords());
342 $keywords = $md_data_helper->makePresentableAsList(', ', ...$keyword_data);
343
344 // authors
345 $author_data = $md_reader->allData($md_paths->authors());
346 $author = $md_data_helper->makePresentableAsList(', ', ...$author_data);
347
348 // learning time
349 $learning_time_data = $md_reader->firstData($md_paths->firstTypicalLearningTime());
350 $learning_time = $md_data_helper->makePresentable($learning_time_data);
351
352 // copyright
353 $copyright = '';
354 if ($md_copyright_helper->hasPresetCopyright($md_reader)) {
355 $copyright = $this->ui->renderer()->render(
356 $md_copyright_helper->readPresetCopyright($md_reader)->presentAsUIComponents()
357 );
358 } else {
359 $copyright = $md_copyright_helper->readCustomCopyright($md_reader);
360 }
361
362 // public access export
363 $public_access_export = $this->buildPublicAccessExportButton($a_rep_obj_id, $a_obj_id);
364
365 // output
366
367 // general section
368 $this->addSection($lng->txt("meta_general"));
369 if ($langs != "") { // language
370 $this->addProperty(
371 $lng->txt("language"),
372 $this->html->escape($langs)
373 );
374 }
375 if ($keywords != "") { // keywords
376 $this->addProperty(
377 $lng->txt("keywords"),
378 $this->html->escape($keywords)
379 );
380 }
381 if ($author != "") { // author
382 $this->addProperty(
383 $lng->txt("author"),
384 $this->html->escape($author)
385 );
386 }
387 if ($learning_time != "") { // typical learning time
388 $this->addProperty(
389 $lng->txt("meta_typical_learning_time"),
390 $this->html->escape($learning_time)
391 );
392 }
393
394 // licence and use section
395 if ($copyright === '' && $public_access_export === '') {
396 return;
397 }
398 $this->addSection($lng->txt('meta_info_licence_section'));
399
400 if ($public_access_export !== '') { // public access export
401 $this->addProperty(
402 $lng->txt('export_info_public_access'),
403 $public_access_export
404 );
405 }
406
407 if ($copyright !== '') { // copyright
408 $this->addProperty(
409 $lng->txt("meta_copyright"),
410 $copyright
411 );
412 }
413 }
414
415 protected function buildPublicAccessExportButton(int $rep_obj_id, int $obj_id): string
416 {
417 /*
418 * This should be replaced by a proper export API
419 * when it is available.
420 */
421 $export_services = new ExportServices();
422 $public_access = $export_services->publicAccess()->handler();
423
424 /*
425 * Make sure we are not in a subobject, and that we will get
426 * the ref_id via the GUI from the correct object.
427 */
428 if (
429 $rep_obj_id !== $this->gui_object->getObject()->getId() ||
430 ($obj_id !== 0 && $obj_id !== $rep_obj_id)
431 ) {
432 return '';
433 }
434
435 if (!$public_access->hasPublicAccessFile($this->data_factory->objId($rep_obj_id))) {
436 return '';
437 }
438
439 $ref_id = $this->gui_object->getObject()->getRefId();
440
441 return $this->ui->renderer()->render(
442 $this->ui->factory()->button()->standard(
443 $this->lng->txt('export_info_public_access_download'),
444 $public_access->downloadLinkOfPublicAccessFile($this->data_factory->refId($ref_id))
445 )
446 );
447 }
448
454 public function addObjectSections(): void
455 {
457 $ilCtrl = $this->ctrl;
458 $ilUser = $this->user;
459 $ilAccess = $this->access;
460 $tree = $this->tree;
461
462 // resource bookings
463 if ($this->booking_enabled) {
464 $booking_adapter = new ilBookingInfoScreenAdapter($this);
465 $booking_adapter->add();
466 }
467
468 $this->addSection($lng->txt("additional_info"));
469 $a_obj = $this->gui_object->getObject();
470
471 // links to the object
472 if (is_object($a_obj)) {
473 // permanent link
474 $type = $a_obj->getType();
475 $ref_id = $a_obj->getRefId();
476
477 if ($ref_id) {
478 if (ilECSServerSettings::getInstance()->activeServerExists()) {
479 $this->addProperty(
480 $lng->txt("object_id"),
481 (string) $a_obj->getId()
482 );
483 }
484
485 $this->tpl->setPermanentLink($type, $ref_id);
486
487 // links to resource
488 if ($ilAccess->checkAccess("write", "", $ref_id) ||
489 $ilAccess->checkAccess("edit_permissions", "", $ref_id)) {
490 $obj_id = $a_obj->getId();
491 $rs = ilObject::_getAllReferences($obj_id);
492 $refs = array();
493 foreach ($rs as $r) {
494 if ($tree->isInTree($r)) {
495 $refs[] = $r;
496 }
497 }
498 if (count($refs) > 1) {
499 $links = $sep = "";
500 foreach ($refs as $r) {
501 $cont_loc = new ilLocatorGUI();
502 $cont_loc->addContextItems($r, true);
503 $links .= $sep . $cont_loc->getHTML();
504 $sep = "<br />";
505 }
506
507 $this->addProperty(
508 $lng->txt("res_links"),
509 '<div class="small">' . $links . '</div>'
510 );
511 }
512 }
513 }
514 }
515
516
517 // creation date
518 if ($ilAccess->checkAccess("write", "", $ref_id) ||
519 $ilAccess->checkAccess("edit_permissions", "", $ref_id)) {
520 $this->addProperty(
521 $lng->txt("create_date"),
522 ilDatePresentation::formatDate(new ilDateTime($a_obj->getCreateDate(), IL_CAL_DATETIME, 'UTC'))
523 );
524
525 // owner
526 if ($ilUser->getId() != ANONYMOUS_USER_ID and $a_obj->getOwner()) {
527 if (ilObjUser::userExists(array($a_obj->getOwner()))) {
529 $ownerObj = ilObjectFactory::getInstanceByObjId($a_obj->getOwner(), false);
530 } else {
531 $ownerObj = ilObjectFactory::getInstanceByObjId(6, false);
532 }
533
534 if (!is_object($ownerObj) || $ownerObj->getType() != "usr") { // root user deleted
535 $this->addProperty($lng->txt("owner"), $lng->txt("no_owner"));
536 } elseif ($ownerObj->hasPublicProfile()) {
537 $ilCtrl->setParameterByClass(PublicProfileGUI::class, "user_id", $ownerObj->getId());
538 $this->addProperty(
539 $lng->txt("owner"),
540 $ownerObj->getPublicName(),
541 $ilCtrl->getLinkTargetByClass(PublicProfileGUI::class, "getHTML")
542 );
543 } else {
544 $this->addProperty($lng->txt("owner"), $ownerObj->getPublicName());
545 }
546 }
547
548 // change event
550 if ($ilUser->getId() != ANONYMOUS_USER_ID) {
551 $readEvents = ilChangeEvent::_lookupReadEvents($a_obj->getId());
552 $count_users = 0;
553 $count_user_reads = 0;
554 $count_anonymous_reads = 0;
555 foreach ($readEvents as $evt) {
556 if ($evt['usr_id'] == ANONYMOUS_USER_ID) {
557 $count_anonymous_reads += $evt['read_count'];
558 } else {
559 $count_user_reads += $evt['read_count'];
560 $count_users++;
561 /* to do: if ($evt['user_id'] is member of $this->getRefId())
562 {
563 $count_members++;
564 }*/
565 }
566 }
567 if ($count_anonymous_reads > 0) {
568 $this->addProperty(
569 $this->lng->txt("readcount_anonymous_users"),
570 (string) $count_anonymous_reads
571 );
572 }
573 if ($count_user_reads > 0) {
574 $this->addProperty($this->lng->txt("readcount_users"), (string) $count_user_reads);
575 }
576 if ($count_users > 0) {
577 $this->addProperty($this->lng->txt("accesscount_registered_users"), (string) $count_users);
578 }
579 }
580 }
581 }
582
583 // WebDAV: Display locking information
585 if ($ilUser->getId() != ANONYMOUS_USER_ID) {
586 $webdav_dic = new ilWebDAVDIC();
587 $webdav_dic->initWithoutDIC();
588 $webdav_lock_backend = $webdav_dic->locksbackend();
589 // Show lock info
590 if ($ilUser->getId() != ANONYMOUS_USER_ID) {
591 if ($lock = $webdav_lock_backend->getLocksOnObjectId($this->gui_object->getObject()->getId())) {
593 $lock_user = new ilObjUser($lock->getIliasOwner());
594 $this->addProperty(
595 $this->lng->txt("in_use_by"),
596 $lock_user->getPublicName(),
597 "./ilias.php?user=" . $lock_user->getId() . '&cmd=showUserProfile&cmdClass=ildashboardgui&cmdNode=1&baseClass=ilDashboardGUI'
598 );
599 }
600 }
601 }
602 }
603 }
604 // END ChangeEvent: Display standard object info
605
612 public function showSummary(): void
613 {
614 $tpl = $this->tpl;
615
616 $tpl->setContent($this->getCenterColumnHTML());
617 $tpl->setRightContent($this->getRightColumnHTML());
618 }
619
620
628 public function getCenterColumnHTML(): string
629 {
630 $ilCtrl = $this->ctrl;
631 $html = "";
632 $column_gui = new ilColumnGUI("info", IL_COL_CENTER);
633 $this->setColumnSettings($column_gui);
634
635 if (!$ilCtrl->isAsynch()) {
636 if ($column_gui->getScreenMode() != IL_SCREEN_SIDE) {
637 // right column wants center
638 if ($column_gui->getCmdSide() == IL_COL_RIGHT) {
639 $column_gui = new ilColumnGUI("info", IL_COL_RIGHT);
640 $this->setColumnSettings($column_gui);
641 $html = $ilCtrl->forwardCommand($column_gui);
642 }
643 // left column wants center
644 if ($column_gui->getCmdSide() == IL_COL_LEFT) {
645 $column_gui = new ilColumnGUI("info", IL_COL_LEFT);
646 $this->setColumnSettings($column_gui);
647 $html = $ilCtrl->forwardCommand($column_gui);
648 }
649 } else {
650 $html = $this->getHTML();
651 }
652 }
653
654 return $html;
655 }
656
661 public function getRightColumnHTML(): string
662 {
663 $ilCtrl = $this->ctrl;
664
665 $html = "";
666 $column_gui = new ilColumnGUI("info", IL_COL_RIGHT);
667 $this->setColumnSettings($column_gui);
668
669 if ($ilCtrl->getNextClass() == "ilcolumngui" &&
670 $column_gui->getCmdSide() == IL_COL_RIGHT &&
671 $column_gui->getScreenMode() == IL_SCREEN_SIDE) {
672 $html = $ilCtrl->forwardCommand($column_gui);
673 } elseif (!$ilCtrl->isAsynch() && $this->news_enabled) {
674 $html = $ilCtrl->getHTML($column_gui);
675 }
676
677 return $html;
678 }
679
683 public function setColumnSettings(ilColumnGUI $column_gui): void
684 {
685 $column_gui->setEnableEdit($this->news_editing);
686 $column_gui->setRepositoryMode(true);
687 $column_gui->setAllBlockProperties($this->getAllBlockProperties());
688 }
689
690 public function setOpenFormTag(bool $a_val): void
691 {
692 $this->open_form_tag = $a_val;
693 }
694
695 public function setCloseFormTag(bool $a_val): void
696 {
697 $this->close_form_tag = $a_val;
698 }
699
707 public function getHTML(): string
708 {
710 $ilSetting = $this->settings;
711 $ilCtrl = $this->ctrl;
712 $ilUser = $this->user;
713
714 $tpl = new ilTemplate("tpl.infoscreen.html", true, true, "components/ILIAS/InfoScreen");
715
716 // other class handles form action (@todo: this is not implemented/tested)
717 if ($this->form_action == "") {
718 $this->setFormAction($ilCtrl->getFormAction($this));
719 }
720
722
723 if ($this->hidden) {
724 $tpl->touchBlock("hidden_js");
725 if ($this->show_hidden_toggle) {
726 $this->addButton($lng->txt("show_hidden_sections"), "JavaScript:toggleSections(this, '" . $lng->txt("show_hidden_sections") . "', '" . $lng->txt("hide_visible_sections") . "');");
727 }
728 }
729
730
731 // DEPRECATED - use ilToolbarGUI
732
733 // add top buttons
734 if (count($this->top_buttons) > 0) {
735 $tpl->addBlockFile("TOP_BUTTONS", "top_buttons", "tpl.buttons.html");
736
737 foreach ($this->top_buttons as $button) {
738 // view button
739 $tpl->setCurrentBlock("btn_cell");
740 $tpl->setVariable("BTN_LINK", $button["link"]);
741 $tpl->setVariable("BTN_TARGET", $button["target"]);
742 $tpl->setVariable("BTN_TXT", $button["title"]);
743 if ($button["primary"]) {
744 $tpl->setVariable("BTN_CLASS", " btn-primary");
745 }
746 $tpl->parseCurrentBlock();
747 }
748 }
749
750 // add top formbuttons
751 if ((count($this->top_formbuttons) > 0) && ($this->form_action !== '')) {
752 $tpl->addBlockFile("TOP_FORMBUTTONS", "top_submitbuttons", "tpl.submitbuttons.html", "components/ILIAS/InfoScreen");
753
754 foreach ($this->top_formbuttons as $button) {
755 // view button
756 $tpl->setCurrentBlock("btn_submit_cell");
757 $tpl->setVariable("BTN_COMMAND", $button["command"]);
758 $tpl->setVariable("BTN_NAME", $button["title"]);
759 $tpl->parseCurrentBlock();
760 }
761 }
762
763 // add form action
764 if ($this->form_action != "") {
765 if ($this->open_form_tag) {
766 $tpl->setCurrentBlock("formtop");
767 $tpl->setVariable("FORMACTION", $this->form_action);
768 $tpl->parseCurrentBlock();
769 }
770
771 if ($this->close_form_tag) {
772 $tpl->touchBlock("formbottom");
773 }
774 }
775
776 if (count($this->hiddenelements)) {
777 foreach ($this->hiddenelements as $hidden) {
778 $tpl->setCurrentBlock("hidden_element");
779 $tpl->setVariable("HIDDEN_NAME", $hidden["name"]);
780 $tpl->setVariable("HIDDEN_VALUE", $hidden["value"]);
781 $tpl->parseCurrentBlock();
782 }
783 }
784
785 if ($this->availability_enabled) {
786 $this->addAvailability();
787 }
788
789 $this->addPreconditions();
790
791 // learning progress
792 if ($this->learning_progress_enabled) {
793 $this->showLearningProgress($tpl);
794 }
795
796 // notes section
797 if ($this->private_notes_enabled && !$ilSetting->get('disable_notes')) {
798 $html = $this->showNotesSection();
799 $tpl->setCurrentBlock("notes");
800 $tpl->setVariable("NOTES", $html);
801 $tpl->parseCurrentBlock();
802 }
803
804 if (
805 isset($this->gui_object) &&
806 method_exists($this->gui_object, "getObject") &&
807 is_object($this->gui_object->getObject())
808 ) {
809 $this->addObjectSections();
810 }
811
812 // render all sections
813 for ($i = 1; $i <= $this->sec_nr; $i++) {
814 if (isset($this->section[$i]["properties"])) {
815 // section properties
816 foreach ($this->section[$i]["properties"] as $property) {
817 if ($property["name"] != "") {
818 if (($property["link"] ?? "") == "") {
819 $tpl->setCurrentBlock("pv");
820 $tpl->setVariable("TXT_PROPERTY_VALUE", $property["value"]);
821 } else {
822 $tpl->setCurrentBlock("lpv");
823 $tpl->setVariable("TXT_PROPERTY_LVALUE", $property["value"]);
824 $tpl->setVariable("LINK_PROPERTY_VALUE", $property["link"]);
825 }
826 $tpl->parseCurrentBlock();
827 $tpl->setCurrentBlock("property_row");
828 $tpl->setVariable("TXT_PROPERTY", $property["name"]);
829 } else {
830 $tpl->setCurrentBlock("property_full_row");
831 $tpl->setVariable("TXT_PROPERTY_FULL_VALUE", $property["value"]);
832 }
833 $tpl->parseCurrentBlock();
834 }
835
836 // section header
837 if ($this->section[$i]["hidden"] ?? false) {
838 $tpl->setVariable("SECTION_HIDDEN", " style=\"display:none;\"");
839 $tpl->setVariable("SECTION_ID", "hidable_" . $i);
840 } else {
841 $tpl->setVariable("SECTION_ID", $i);
842 }
843 $tpl->setVariable("TCLASS", $this->getTableClass());
844 $tpl->setVariable("TXT_SECTION", $this->section[$i]["title"]);
845 $tpl->setCurrentBlock("row");
846 $tpl->parseCurrentBlock();
847 }
848 }
849
850 if (!is_null($this->mbox)) {
851 $tpl->setVariable("MBOX", $this->ui->renderer()->render([$this->mbox]));
852 }
853
854 return $tpl->get();
855 }
856
857 public function getContextRefId(): int
858 {
859 if ($this->contextRefId !== null) {
860 return $this->contextRefId;
861 }
862
863 return $this->gui_object->getObject()->getRefId();
864 }
865
866 public function setContextRefId(int $contextRefId): void
867 {
868 $this->contextRefId = $contextRefId;
869 }
870
871 public function getContextObjId(): int
872 {
873 if ($this->contextObjId !== null) {
874 return $this->contextObjId;
875 }
876
877 return $this->gui_object->getObject()->getId();
878 }
879
880 public function setContextObjId(int $contextObjId): void
881 {
882 $this->contextObjId = $contextObjId;
883 }
884
885 public function getContentObjType(): string
886 {
887 if ($this->contentObjType !== null) {
888 return $this->contentObjType;
889 }
890
891 return $this->gui_object->getObject()->getType();
892 }
893
894 public function setContentObjType(string $contentObjType): void
895 {
896 $this->contentObjType = $contentObjType;
897 }
898
903 public function showLearningProgress(ilTemplate $a_tpl): void
904 {
905 return;
906
907 $ilUser = $this->user;
908 $rbacsystem = $this->rbacsystem;
909
910 if (!$rbacsystem->checkAccess('read', $this->getContextRefId())) {
911 return;
912 }
913 if ($ilUser->getId() == ANONYMOUS_USER_ID) {
914 return;
915 }
916
918 return;
919 }
920
921 $olp = ilObjectLP::getInstance($this->getContextObjId());
922 if ($olp->getCurrentMode() != ilLPObjSettings::LP_MODE_MANUAL) {
923 return;
924 }
925
926 $this->lng->loadLanguageModule('trac');
927
928 // section header
929 // $a_tpl->setCurrentBlock("header_row");
930 $a_tpl->setVariable(
931 "TXT_SECTION",
932 $this->lng->txt('learning_progress')
933 );
934 $a_tpl->parseCurrentBlock();
935 }
936
937 public function saveProgress(bool $redirect = true): void
938 {
939 $ilUser = $this->user;
940
941 // ensure a read event
943 $ilUser->getId(),
944 $this->getContextObjId(),
945 $this->getContextRefId(),
946 ilObject::_lookupType($this->getContextObjId())
947 );
948
949 $lp_marks = new ilLPMarks($this->getContextObjId(), $ilUser->getId());
950 $lp_marks->setCompleted((bool) $this->request->getLPEdit());
951 $lp_marks->update();
952
953 ilLPStatusWrapper::_updateStatus($this->getContextObjId(), $ilUser->getId());
954
955 $this->lng->loadLanguageModule('trac');
956 $this->tpl->setOnScreenMessage('success', $this->lng->txt('trac_updated_status'), true);
957
958 if ($redirect) {
959 $this->ctrl->redirect($this, ""); // #14993
960 }
961 }
962
963
968 public function showNotesSection(): string
969 {
970 global $DIC;
971
972 $ilAccess = $this->access;
973 $ilSetting = $this->settings;
974 $notes_gui = $DIC->notes()->gui();
975 $notes_gui->initJavascript();
976 $comments_gui = $notes_gui->getCommentsGUI(
977 $this->gui_object->getObject()->getId(),
978 0,
979 $this->gui_object->getObject()->getType()
980 );
981
982 $next_class = $this->ctrl->getNextClass($this);
983 $comments_gui->setUseObjectTitleHeader(false);
984
985 // global switch
986 if ($ilSetting->get("disable_comments")) {
987 return "";
988 } else {
989 $ref_id = $this->gui_object->getObject()->getRefId();
990 $has_write = $ilAccess->checkAccess("write", "", $ref_id);
991
992 if ($has_write && $ilSetting->get("comments_del_tutor", "1")) {
993 $comments_gui->enablePublicNotesDeletion();
994 }
995
996 /* should probably be discussed further
997 for now this will only work properly with comments settings
998 (see ilNoteGUI constructor)
999 */
1000 if ($has_write ||
1001 $ilAccess->checkAccess("edit_permissions", "", $ref_id)) {
1002 $comments_gui->enableCommentsSettings();
1003 }
1004 }
1005
1006 /* moved to action menu
1007 $notes_gui->enablePrivateNotes();
1008 */
1009 if ($next_class === strtolower(ilCommentGUI::class)) {
1010 $html = $this->ctrl->forwardCommand($comments_gui);
1011 } else {
1012 $html = $comments_gui->getListHTML();
1013 }
1014
1015 return $html;
1016 }
1017
1021 public function showLDAPRoleGroupMappingInfo(string $a_section = ''): void
1022 {
1023 if (strlen($a_section)) {
1024 $this->addSection($a_section);
1025 }
1026 $ldap_mapping = ilLDAPRoleGroupMapping::_getInstance();
1027 if ($infos = $ldap_mapping->getInfoStrings($this->gui_object->getObject()->getId())) {
1028 $info_combined = '<div style="color:green;">';
1029 $counter = 0;
1030 foreach ($infos as $info_string) {
1031 if ($counter++) {
1032 $info_combined .= '<br />';
1033 }
1034 $info_combined .= $info_string;
1035 }
1036 $info_combined .= '</div>';
1037 $this->addProperty($this->lng->txt('applications'), $info_combined);
1038 }
1039 }
1040
1041 public function setTabs(): void
1042 {
1043 $this->getTabs($this->tabs_gui);
1044 }
1045
1046 public function getTabs(ilTabsGUI $tabs_gui): void
1047 {
1048 $next_class = $this->ctrl->getNextClass($this);
1049 $force_active = ($next_class == "ilnotegui");
1050
1051 $tabs_gui->addSubTabTarget(
1052 'summary',
1053 $this->ctrl->getLinkTarget($this, "showSummary"),
1054 array("showSummary", ""),
1055 get_class($this),
1056 "",
1057 $force_active
1058 );
1059 }
1060
1061
1062
1063 public function hideFurtherSections(bool $a_add_toggle = true): void
1064 {
1065 $this->hidden = true;
1066 $this->show_hidden_toggle = $a_add_toggle;
1067 }
1068
1069 public function getHiddenToggleButton(): string
1070 {
1071 $lng = $this->lng;
1072
1073 return "<a onClick=\"toggleSections(this, '" . $lng->txt("show_hidden_sections") . "', '" . $lng->txt("hide_visible_sections") . "'); return false;\" href=\"#\">" . $lng->txt("show_hidden_sections") . "</a>";
1074 }
1075
1076
1081 protected function addAvailability(): void
1082 {
1083 if (
1084 !is_object($this->gui_object) ||
1085 !method_exists($this->gui_object, "getObject") ||
1086 !is_object($this->gui_object->getObject())
1087 ) {
1088 return;
1089 }
1090
1091 $obj = $this->gui_object->getObject();
1092 if ($obj->getRefId() <= 0) {
1093 return;
1094 }
1095
1096 $act = new ilObjectActivation();
1097 $act->read($obj->getRefId());
1098 if ($act->getTimingType() == ilObjectActivation::TIMINGS_ACTIVATION) {
1099 $this->lng->loadLanguageModule("rep");
1100 $this->addSection($this->lng->txt("rep_activation_availability"));
1101 $this->addAccessPeriodProperty();
1102 }
1103 }
1104
1108 protected function addPreconditions(): void
1109 {
1110 if (
1111 !is_object($this->gui_object) ||
1112 !method_exists($this->gui_object, "getObject") ||
1113 !is_object($this->gui_object->getObject())
1114 ) {
1115 return;
1116 }
1117
1118 $obj = $this->gui_object->getObject();
1119 if ($obj->getRefId() <= 0) {
1120 return;
1121 }
1122
1123 $conditions = ilConditionHandler::_getEffectiveConditionsOfTarget($obj->getRefId(), $obj->getId());
1124
1125 if (sizeof($conditions)) {
1126 for ($i = 0; $i < count($conditions); $i++) {
1127 $conditions[$i]['title'] = ilObject::_lookupTitle($conditions[$i]['trigger_obj_id']);
1128 }
1129 $conditions = ilArrayUtil::sortArray($conditions, 'title', 'DESC');
1130
1131 // Show obligatory and optional preconditions seperated
1132 $this->addPreconditionSection($obj, $conditions, true);
1133 $this->addPreconditionSection($obj, $conditions, false);
1134 }
1135 }
1136
1137 protected function addPreconditionSection(
1138 ilObject $obj,
1139 array $conditions,
1140 bool $obligatory = true
1141 ): void {
1142 $lng = $this->lng;
1143 $tree = $this->tree;
1144
1146 $num_optional_required =
1147 $num_required - count($conditions) + count(ilConditionHandler::getEffectiveOptionalConditionsOfTarget($obj->getRefId(), $obj->getId()));
1148
1149 // Check if all conditions are fulfilled
1150 $visible_conditions = array();
1151 $passed_optional = 0;
1152 foreach ($conditions as $condition) {
1153 if ($obligatory and !$condition['obligatory']) {
1154 continue;
1155 }
1156 if (!$obligatory and $condition['obligatory']) {
1157 continue;
1158 }
1159
1160 if ($tree->isDeleted($condition['trigger_ref_id'])) {
1161 continue;
1162 }
1163
1164 $ok = ilConditionHandler::_checkCondition($condition) and
1165 !ilMemberViewSettings::getInstance()->isActive();
1166
1167 if (!$ok) {
1168 $visible_conditions[] = $condition['id'];
1169 }
1170
1171 if (!$obligatory and $ok) {
1172 ++$passed_optional;
1173 // optional passed
1174 if ($passed_optional >= $num_optional_required) {
1175 return;
1176 }
1177 }
1178 }
1179
1180 $properties = [];
1181
1182 foreach ($conditions as $condition) {
1183 if (!isset($condition["id"]) || !in_array($condition['id'], $visible_conditions)) {
1184 continue;
1185 }
1186
1187 $properties[] = [
1189 $condition['trigger_obj_id'],
1190 $condition['operator']
1191 ) . ' ' . $condition['value'],
1192 "title" => ilObject::_lookupTitle($condition['trigger_obj_id']),
1193 "link" => ilLink::_getLink($condition['trigger_ref_id'])
1194 ];
1195 }
1196
1197 if (count($properties) > 0) {
1198 if ($obligatory) {
1199 $this->addSection($lng->txt("preconditions_obligatory_hint"));
1200 } else {
1201 $this->addSection(sprintf(
1202 $lng->txt("preconditions_optional_hint"),
1203 $num_optional_required - $passed_optional
1204 ));
1205 }
1206
1207 foreach ($properties as $p) {
1208 $this->addProperty(
1209 $p["condition"],
1210 "<a href='" . $p["link"] . "'>" . $this->html->strip($p["title"]) . "</a>"
1211 );
1212 }
1213 }
1214 }
1215
1220 public function addAccessPeriodProperty(): void
1221 {
1222 $a_obj = $this->gui_object->getObject();
1223
1224 $this->lng->loadLanguageModule("rep");
1225 $this->lng->loadLanguageModule("crs");
1226
1227 // links to the object
1228 if (is_object($a_obj)) {
1229 $act = new ilObjectActivation();
1230 $act->read($a_obj->getRefId());
1231 if ($act->getTimingType() == ilObjectActivation::TIMINGS_ACTIVATION) {
1232 $this->addProperty(
1233 $this->lng->txt('rep_activation_access'),
1235 new ilDateTime($act->getTimingStart(), IL_CAL_UNIX),
1236 new ilDateTime($act->getTimingEnd(), IL_CAL_UNIX)
1237 )
1238 );
1239 } else {
1240 $this->addProperty(
1241 $this->lng->txt('rep_activation_access'),
1242 $this->lng->txt('crs_visibility_limitless')
1243 );
1244 }
1245 }
1246 }
1247}
setVariable($variable, $value='')
Sets a variable value.
Definition: IT.php:544
Builds data types.
Definition: Factory.php:36
GUI class for public user profile presentation.
const IL_SCREEN_SIDE
const IL_COL_RIGHT
const IL_COL_CENTER
const IL_COL_LEFT
const IL_CAL_UNIX
const IL_CAL_DATETIME
static sortArray(array $array, string $a_array_sortby_key, string $a_array_sortorder="asc", bool $a_numeric=false, bool $a_keep_keys=false)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static _lookupReadEvents($obj_id, $usr_id=null)
Reads all read events which occured on the object.
static _isActive()
Returns true, if change event tracking is active.
Column user interface class.
setAllBlockProperties(array $a_block_properties)
setEnableEdit(bool $a_enableedit)
setRepositoryMode(bool $a_repositorymode)
static getInstanceFromAjaxCall()
(Re-)Build instance from ajax call
static translateOperator(int $a_obj_id, string $a_operator, string $value='')
static calculateEffectiveRequiredTriggers(int $a_target_ref_id, int $a_target_obj_id, string $a_target_obj_type='')
static _checkCondition(array $condition, int $a_usr_id=0)
checks wether a single condition is fulfilled every trigger object type must implement a static metho...
static getEffectiveOptionalConditionsOfTarget(int $a_target_ref_id, int $a_target_obj_id, string $a_obj_type='')
Class ilCtrl provides processing control methods.
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.
@classDescription Date and time handling
static getInstance()
Get singleton instance.
setContent(string $a_html)
Sets content for standard template.
setCurrentBlock(string $blockname=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.
addBlockFile(string $var, string $block, string $template_name, ?string $in_module=null)
overwrites ITX::addBlockFile
setVariable(string $variable, $value='')
Sets the given variable to the given value.
parseCurrentBlock(string $blockname=self::DEFAULT_BLOCK)
Parses the given block.
setRightContent(string $a_html)
Sets content of right column.
touchBlock(string $blockname)
overwrites ITX::touchBlock.
Class ilInfoScreenGUI.
buildPublicAccessExportButton(int $rep_obj_id, int $obj_id)
enableNews(bool $a_enable=true)
StandardGUIRequest $request
ilAccessHandler $access
setColumnSettings(ilColumnGUI $column_gui)
Set column settings.
setFormAction(string $a_form_action)
setBlockProperty(string $a_block_type, string $a_property, string $a_value)
This function is supposed to be used for block type specific properties, that should be passed to ilB...
setCloseFormTag(bool $a_val)
__construct(?object $a_gui_object=null)
enableBookingInfo(bool $a_enable=true)
getTabs(ilTabsGUI $tabs_gui)
showLearningProgress(ilTemplate $a_tpl)
enableFeedback(bool $a_enable=true)
enableLearningProgress(bool $a_enable=true)
addSection(string $a_title)
ilGlobalPageTemplate $tpl
addProperty(string $a_name, string $a_value, string $a_link="")
add a property to current section
addFormButton(string $a_command, string $a_title, string $a_position="top")
add a form button to the info screen the form buttons are only valid if a form action is set
enableNewsEditing(bool $a_enable=true)
addButton(string $a_title, string $a_link, string $a_frame="", string $a_position="top", bool $a_primary=false)
enableAvailability(bool $a_enable=true)
hideFurtherSections(bool $a_add_toggle=true)
ILIAS Repository HTML HTMLUtil $html
enablePrivateNotes(bool $a_enable=true)
setContextObjId(int $contextObjId)
addPropertyTextinput(string $a_name, string $a_input_name, string $a_input_value="", string $a_input_size="", string $direct_button_command="", string $direct_button_label="", bool $direct_button_primary=false)
setTableClass(string $a_val)
showLDAPRoleGroupMappingInfo(string $a_section='')
ILIAS UI Component MessageBox MessageBox $mbox
addHiddenElement(string $a_name, string $a_value)
saveProgress(bool $redirect=true)
setContextRefId(int $contextRefId)
addPreconditions()
Add preconditions.
ILIAS DI UIServices $ui
addPreconditionSection(ilObject $obj, array $conditions, bool $obligatory=true)
addMetaDataSections(int $a_rep_obj_id, int $a_obj_id, string $a_type)
setMessageBox(ILIAS\UI\Component\MessageBox\MessageBox $a_val)
setContentObjType(string $contentObjType)
static _getInstance()
Get singleton instance of this class.
static _updateStatus(int $a_obj_id, int $a_usr_id, ?object $a_obj=null, bool $a_percentage=false, bool $a_force_raise=false)
language handling
static _tracProgress(int $a_user_id, int $a_obj_id, int $a_ref_id, string $a_obj_type='')
static prepareFormOutput($a_str, bool $a_strip=false)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
User class.
static userExists(array $a_usr_ids=[])
Class ilObjectActivation.
static getInstanceByObjId(?int $obj_id, bool $stop_on_error=true)
get an instance of an Ilias object by object id
static getInstance(int $obj_id)
Class ilObject Basic functions for all objects.
static _lookupType(int $id, bool $reference=false)
static _getAllReferences(int $id)
get all reference ids for object ID
static _lookupTitle(int $obj_id)
class ilRbacSystem system function like checkAccess, addActiveRole ... Supporting system functions ar...
checkAccess(string $a_operations, int $a_ref_id, string $a_type="")
checkAccess represents the main method of the RBAC-system in ILIAS3 developers want to use With this ...
ILIAS Setting Class.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
addSubTabTarget(string $a_text, string $a_link, $a_cmd="", $a_cmdClass="", string $a_frame="", bool $a_activate=false, bool $a_dir_text=false)
special template class to simplify handling of ITX/PEAR
parseCurrentBlock(string $part=ilGlobalTemplateInterface::DEFAULT_BLOCK)
Tree class data representation in hierachical trees using the Nested Set Model with Gaps by Joe Celco...
isInTree(?int $a_node_id)
get all information of a node.
isDeleted(int $a_node_id)
This is a wrapper for isSaved() with a more useful name.
static initjQuery(?ilGlobalTemplateInterface $a_tpl=null)
inits and adds the jQuery JS-File to the global or a passed template
const ANONYMOUS_USER_ID
Definition: constants.php:27
Interface ilAccessHandler This interface combines all available interfaces which can be called via gl...
$ref_id
Definition: ltiauth.php:66
Interface Observer \BackgroundTasks Contains several chained tasks and infos about them.
global $lng
Definition: privfeed.php:31
global $ilSetting
Definition: privfeed.php:31
if(!file_exists('../ilias.ini.php'))
global $DIC
Definition: shib_login.php:26
$counter
catch(InvalidArgumentException) if(!ilDAVActivationChecker::_isActive()) $webdav_dic
Definition: webdav.php:57