ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
class.ilLMPresentationGUI.php
Go to the documentation of this file.
1<?php
2
21
32{
33 protected \ILIAS\COPage\Dom\DomUtil $dom_util;
34 protected \ILIAS\COPage\Xsl\XslManager $xsl;
35 protected \ILIAS\Notes\GUIService $notes_gui;
36 protected \ILIAS\GlobalScreen\Services $global_screen;
37 protected \ILIAS\Notes\DomainService $notes;
38 protected \ILIAS\LearningModule\ReadingTime\ReadingTimeManager $reading_time_manager;
39 protected string $requested_url;
40 protected string $requested_type;
42 protected ilTabsGUI $tabs;
44 protected ilSetting $lm_set;
46 protected bool $fill_on_load_code;
47 protected ilLMTree $lm_tree;
48 protected array $frames;
49 protected string $export_format;
50 public string $lang;
52 protected ilObjUser $user;
54 protected ilCtrl $ctrl;
59 protected ilTree $tree;
60 protected ilHelpGUI $help;
61 protected LOMServices $lom_services;
65 public DOMDocument $layout_doc;
66 public bool $offline;
67 public string $offline_directory;
68 protected bool $embed_mode = false;
69 protected int $current_page_id = 0;
70 protected ?int $focus_id = 0; // focus id is set e.g. from learning objectives course, we focus on a chapter/page
71 protected bool $export_all_languages = false;
72 public bool $chapter_has_no_active_page = false;
73 public bool $deactivated_page = false;
74 protected string $requested_back_pg;
75 protected string $requested_search_string;
76 protected string $requested_focus_return;
77 protected int $requested_ref_id;
78 protected int $requested_obj_id;
79 protected string $requested_obj_type;
80 protected string $requested_transl;
81 protected string $requested_frame;
84 protected \ILIAS\DI\UIServices $ui;
86 protected array $additional_content = [];
87 protected string $requested_cmd = "";
88 protected int $requested_pg_id = 0;
89 protected string $requested_pg_type = "";
90 protected int $requested_mob_id = 0;
92 protected bool $abstract = false;
93 protected Translations $ot;
94 protected \ILIAS\Style\Content\Object\ObjectFacade $content_style_domain;
95 protected \ILIAS\Style\Content\GUIService $content_style_gui;
97
98 public function __construct(
99 string $a_export_format = "",
100 bool $a_all_languages = false,
101 string $a_export_dir = "",
102 bool $claim_repo_context = true,
103 ?array $query_params = null,
104 bool $embed_mode = false
105 ) {
106 global $DIC;
107
108 $this->offline = ($a_export_format != "");
109 $this->export_all_languages = $a_all_languages;
110 $this->export_format = $a_export_format; // html/scorm
111 $this->offline_directory = $a_export_dir;
112
113 $this->tabs = $DIC->tabs();
114 $this->toolbar = $DIC->toolbar();
115 $this->user = $DIC->user();
116 $this->rbacsystem = $DIC->rbac()->system();
117 $this->nav_history = $DIC["ilNavigationHistory"];
118 $this->access = $DIC->access();
119 $this->settings = $DIC->settings();
120 $this->locator = $DIC["ilLocator"];
121 $this->tree = $DIC->repositoryTree();
122 $this->help = $DIC["ilHelp"];
123 $this->global_screen = $DIC->globalScreen();
124 $this->lom_services = $DIC->learningObjectMetadata();
125
126 $lng = $DIC->language();
127 $rbacsystem = $DIC->rbac()->system();
128 $ilCtrl = $DIC->ctrl();
129 $ilErr = $DIC["ilErr"];
130
131 // load language vars
132 $lng->loadLanguageModule("content");
133
134 $this->lng = $lng;
135 $this->ui = $DIC->ui();
136 $this->tpl = $DIC->ui()->mainTemplate();
137 $this->frames = array();
138 $this->ctrl = $ilCtrl;
139 $this->ctrl->saveParameter($this, array("ref_id", "transl", "focus_id", "focus_return"));
140
141 $this->cs = $DIC->contentStyle();
142
143 $this->initByRequest($query_params, $embed_mode);
144
145 // check, if learning module is online
146 if (!$rbacsystem->checkAccess("write", $this->requested_ref_id)) {
147 if ($this->lm->getOfflineStatus()) {
148 $ilErr->raiseError($lng->txt("permission_denied"), $ilErr->WARNING);
149 }
150 }
151
152 if ($claim_repo_context) {
153 $DIC->globalScreen()->tool()->context()->claim()->repository();
154 }
155
156 if (!$ilCtrl->isAsynch()) {
157 // moved this into the if due to #0027200
158 if (!$embed_mode) {
159 if ($this->service->getPresentationStatus()->isTocNecessary()) {
160 $DIC->globalScreen()->tool()->context()->current()->addAdditionalData(
162 true
163 );
164 }
165 }
166 $DIC->globalScreen()->tool()->context()->current()->addAdditionalData(
168 true
169 );
170 }
171
172 if ($embed_mode) {
173 $ilCtrl->setParameter($this, "embed_mode", 1);
174 $params = [
175 "obj_id" => $this->requested_obj_id,
176 "ref_id" => $this->lm->getRefId(),
177 "frame" => ""
178 ];
179 $DIC->globalScreen()->tool()->context()->current()->addAdditionalData(
181 $params
182 );
183 }
184 $this->reading_time_manager = new \ILIAS\LearningModule\ReadingTime\ReadingTimeManager();
185 $this->notes = $DIC->notes()->domain();
186 $this->xsl = $DIC->copage()->internal()->domain()->xsl();
187 $this->dom_util = $DIC->copage()->internal()->domain()->domUtil();
188 $this->notes_gui = $DIC->notes()->gui();
189 }
190
191 public function getUnsafeGetCommands(): array
192 {
193 return [];
194 }
195
196 public function getSafePostCommands(): array
197 {
198 return [
199 "showPrintView",
200 ];
201 }
202
209 public function initByRequest(
210 ?array $query_params = null,
211 bool $embed_mode = false
212 ): void {
213 global $DIC;
214
215 $this->service = new ilLMPresentationService(
216 $this->user,
217 $query_params,
218 $this->offline,
219 $this->export_all_languages,
220 $this->export_format,
221 null,
223 );
224
225 $post = is_null($query_params)
226 ? null
227 : [];
228
229 $request = $DIC->learningModule()
230 ->internal()
231 ->gui()
232 ->presentation()
233 ->request(
234 $query_params,
235 $post
236 );
237
238 $this->requested_obj_type = $request->getObjType();
239 $this->requested_ref_id = $request->getRefId();
240 $this->requested_transl = $request->getTranslation(); // handled by presentation status
241 $this->requested_obj_id = $request->getObjId(); // handled by navigation status
242 $this->requested_back_pg = $request->getBackPage();
243 $this->requested_frame = $request->getFrame();
244 $this->requested_search_string = $request->getSearchString();
245 $this->requested_focus_return = $request->getFocusReturn();
246 $this->requested_mob_id = $request->getMobId();
247 $this->requested_cmd = $request->getCmd();
248 $this->requested_pg_id = $request->getPgId();
249 $this->requested_pg_type = $request->getPgType();
250 $this->requested_notification_switch = $request->getNotificationSwitch();
251 $this->requested_type = $request->getType();
252 $this->requested_url = $request->getUrl();
253
254 $this->lm_set = $this->service->getSettings();
255 $this->lm_gui = $this->service->getLearningModuleGUI();
256 $this->lm = $this->service->getLearningModule();
257 $this->tracker = $this->service->getTracker();
258 $this->linker = $this->service->getLinker();
259 $this->embed_mode = $embed_mode;
260 if ($request->getEmbedMode()) {
261 $this->embed_mode = true;
262 }
263
264 // language translation
265 $this->lang = $this->service->getPresentationStatus()->getLang();
266
267 $this->lm_tree = $this->service->getLMTree();
268 $this->focus_id = $this->service->getPresentationStatus()->getFocusId();
269 $this->ot = $this->lm->getObjectProperties()->getPropertyTranslations();
270 $this->content_style_gui = $this->cs->gui();
271 $this->content_style_domain = $this->cs->domain()->styleForRefId($this->lm->getRefId());
272 }
273
275 {
276 return $this->service;
277 }
278
279 public function injectTemplate(ilGlobalTemplateInterface $tpl): void
280 {
281 $this->tpl = $tpl;
282 }
283
284 protected function getTracker(): ilLMTracker
285 {
286 return $this->service->getTracker();
287 }
288
294 public function executeCommand(): void
295 {
296 $ilNavigationHistory = $this->nav_history;
297 $ilAccess = $this->access;
299 $ilCtrl = $this->ctrl;
300 $ilUser = $this->user;
301
302 // check read permission and parent conditions
303 // todo: replace all this by ilAccess call
304 if (!$ilAccess->checkAccess("read", "", $this->requested_ref_id) &&
305 (!(($this->ctrl->getCmd() == "infoScreen" || $this->ctrl->getNextClass() == "ilinfoscreengui")
306 && $ilAccess->checkAccess("visible", "", $this->requested_ref_id)))) {
307 throw new ilPermissionException($lng->txt("permission_denied"));
308 }
309
310 $next_class = $this->ctrl->getNextClass($this);
311 $cmd = $this->ctrl->getCmd("layout");
312
313 $obj_id = $this->requested_obj_id;
314 $this->ctrl->setParameter($this, "obj_id", $this->requested_obj_id);
315 $ilNavigationHistory->addItem($this->requested_ref_id, $this->ctrl->getLinkTarget($this), "lm");
316 $this->ctrl->setParameter($this, "obj_id", $obj_id);
317
318 switch ($next_class) {
319 case "ilcommentgui":
320 $ret = $this->layout();
321 break;
322
323 case "ilinfoscreengui":
324 $ret = $this->outputInfoScreen();
325 break;
326
327 case "ilcommonactiondispatchergui":
329 $gui->enableCommentsSettings(false);
330 $this->ctrl->forwardCommand($gui);
331 break;
332
333 case "illmpagegui":
334 $page_gui = $this->getLMPageGUI($this->requested_obj_id);
335 $this->basicPageGuiInit($page_gui);
336 $ret = $ilCtrl->forwardCommand($page_gui);
337 break;
338
339 case "ilassgenfeedbackpagegui":
340 $page_gui = new ilAssGenFeedbackPageGUI($this->requested_pg_id);
341 //$this->basicPageGuiInit($page_gui);
342 $ret = $ilCtrl->forwardCommand($page_gui);
343 break;
344
345 case "ilglossarydefpagegui":
346 // see #32198
347 //$page_gui = new ilGlossaryDefPageGUI($this->requested_obj_id);
348 $page_gui = new ilGlossaryDefPageGUI($this->requested_pg_id);
349 $this->basicPageGuiInit($page_gui);
350 $ret = $ilCtrl->forwardCommand($page_gui);
351 break;
352
353 case "illearningprogressgui":
354 $this->initScreenHead("learning_progress");
355 $new_gui = new ilLearningProgressGUI(
357 $this->requested_ref_id,
358 $ilUser->getId()
359 );
360 $this->ctrl->forwardCommand($new_gui);
361 // this is nasty, but the LP classes do "sometimes" a printToStdout
362 // sometimes not, (here editManual does, other commands not)
363 if ($this->ctrl->getCmd() !== "editManual") {
364 $this->tpl->printToStdout();
365 }
366 break;
367
368 case "ilratinggui":
369 $rating_gui = new ilRatingGUI();
370 $rating_gui->setObject($this->lm->getId(), "lm", $this->requested_obj_id, "lm");
371 $this->ctrl->forwardCommand($rating_gui);
372 break;
373
374 default:
375 if ($this->requested_notification_switch > 0) {
376 switch ($this->requested_notification_switch) {
377 case 1:
380 $this->user->getId(),
381 $this->lm->getId(),
382 false
383 );
384 break;
385
386 case 2:
389 $this->user->getId(),
390 $this->lm->getId(),
391 true
392 );
393 break;
394
395 case 3:
398 $this->user->getId(),
399 $this->getCurrentPageId(),
400 false
401 );
402 break;
403
404 case 4:
407 $this->user->getId(),
408 $this->getCurrentPageId(),
409 true
410 );
411 break;
412 }
413 $ilCtrl->redirect($this, "layout");
414 }
415 $ret = $this->$cmd();
416 break;
417 }
418 }
419
423 public function offlineMode(): bool
424 {
425 return $this->offline;
426 }
427
428 public function getExportFormat(): string
429 {
430 return $this->export_format;
431 }
432
436 public function nop(): void
437 {
438 }
439
440 public function attrib2arr(?DOMNamedNodeMap $a_attributes): array
441 {
442 $attr = array();
443 if (!is_null($a_attributes)) {
444 foreach ($a_attributes as $attribute) {
445 $attr[$attribute->name] = $attribute->value;
446 }
447 }
448 return $attr;
449 }
450
454 public function getCurrentFrameSet(): array
455 {
456 return $this->frames;
457 }
458
462 public function determineLayout(): string
463 {
464 return "standard";
465 }
466
470 public function resume(): void
471 {
472 $this->layout();
473 }
474
475 public function layout(
476 string $a_xml = "main.xml",
477 bool $doShow = true
478 ): string {
479 $content = "";
480 $tpl = $this->tpl;
481 $ilUser = $this->user;
482 $layout = $this->determineLayout();
483
484 // xmldocfile is deprecated! Use domxml_open_file instead.
485 // But since using relative pathes with domxml under windows don't work,
486 // we need another solution:
487 $xmlfile = file_get_contents(ILIAS_ABSOLUTE_PATH . "/components/ILIAS/LearningModule/layouts/lm/" . $layout . "/" . $a_xml);
488
489 $error = null;
490 $doc = $this->dom_util->docFromString($xmlfile, $error);
491 $this->layout_doc = $doc;
492
493 // get current frame node
494 $path = (empty($this->requested_frame) || ($this->requested_frame == "_blank"))
495 ? "/ilLayout/ilFrame[1]"
496 : "//ilFrame[@name='" . $this->requested_frame . "']";
497 $nodes = $this->dom_util->path($doc, $path);
498 if (count($nodes) != 1) {
499 throw new ilLMPresentationException("ilLMPresentation: XML File invalid. Found " . count($nodes) . " nodes for " .
500 " path " . $path . " in " . $layout . "/" . $a_xml . ". LM Layout is " . $this->lm->getLayout());
501 }
502 $node = $nodes->item(0);
503
504 // ProcessFrameset
505 // node is frameset, if it has cols or rows attribute
506 $attributes = $this->attrib2arr($node->attributes);
507
508 $this->frames = array();
509
510 // ProcessContentTag
511 if ((empty($attributes["template"]) || !empty($this->requested_obj_type))
512 && ($this->requested_frame != "_blank" || $this->requested_obj_type != "MediaObject")) {
513 // we got a variable content frame (can display different
514 // object types (PageObject, MediaObject, GlossarItem)
515 // and contains elements for them)
516
517 // determine object type
518 if (empty($this->requested_obj_type)) {
519 $obj_type = "PageObject";
520 } else {
521 $obj_type = $this->requested_obj_type;
522 }
523
524 // get object specific node
525 $found = false;
526 foreach ($node->childNodes as $child) {
527 if ($child->nodeName == $obj_type) {
528 $found = true;
529 $attributes = $this->attrib2arr($child->attributes);
530 $node = $child;
531 //echo "<br>2node:".$node->node_name();
532 break;
533 }
534 }
535 if (!$found) {
536 throw new ilLMPresentationException("ilLMPresentation: No template specified for frame '" .
537 $this->requested_frame . "' and object type '" . $obj_type . "'.");
538 }
539 }
540
541 // set style sheets
542 if (!$this->offlineMode()) {
543 $this->tpl->setVariable("LOCATION_STYLESHEET", ilUtil::getStyleSheetLocation());
544 } else {
545 $style_name = $ilUser->getPref("style") . ".css";
546 $this->tpl->setVariable("LOCATION_STYLESHEET", "./style/" . $style_name);
547 }
548
549 // to make e.g. advanced seletions lists work:
550 // $GLOBALS["tpl"] = $this->tpl;
551
552 foreach ($node->childNodes as $child) {
553 $child_attr = $this->attrib2arr($child->attributes);
554
555 switch ($child->nodeName) {
556 case "ilPage":
557 $this->renderPageTitle();
558 $this->setHeader();
559 $this->addHeaderAction();
560 $content = $this->getContent();
561 $this->ilLMMenu();
562 $content .= $this->ilLMNotes();
563 $additional = $this->ui->renderer()->render($this->additional_content);
564 $this->tpl->setContent($content . $additional);
565 break;
566
567 case "ilGlossary":
568 $this->ilGlossary();
569 break;
570
571 case "ilLMNavigation":
572 // @todo 6.0
573 // $this->ilLMNavigation();
574 break;
575
576 case "ilMedia":
577 $this->media();
578 break;
579
580 case "ilLocator":
581 $this->ilLocator();
582 break;
583
584 case "ilJavaScript":
585 $this->ilJavaScript(
586 $child_attr["inline"],
587 $child_attr["file"],
588 $child_attr["location"]
589 );
590 break;
591
592 case "ilLMMenu":
593 //$this->ilLMMenu();
594 break;
595
596 case "ilLMHead":
597 // @todo 6.0
598 // $this->ilLMHead();
599 break;
600
601 case "ilLMSubMenu":
602 $this->ilLMSubMenu();
603 break;
604
605 case "ilLMNotes":
606 $this->ilLMNotes();
607 break;
608 }
609 }
610
611 $this->addResourceFiles();
612
613 if ($doShow) {
614 $tpl->printToStdout();
615 } else {
616 $content = $tpl->printToString();
617 }
618
619 return ($content);
620 }
621
622 protected function addResourceFiles(): void
623 {
624 iljQueryUtil::initjQuery($this->tpl);
625 //iljQueryUtil::initjQueryUI($this->tpl);
626
627 if (!$this->offlineMode()) {
630
631 $this->tpl->addJavaScript("assets/js/LearningModule.js");
632
633 // handle initial content
634 if ($this->requested_frame == "") {
635 $store = new ilSessionIStorage("lm");
636 $last_frame_url = $store->get("cf_" . $this->lm->getId());
637 if ($last_frame_url != "") {
638 $this->tpl->addOnLoadCode("il.LearningModule.setLastFrameUrl('" . $last_frame_url . "', 'center_bottom');");
639 }
640
641 $this->tpl->addOnLoadCode("il.LearningModule.setSaveUrl('" .
642 $this->ctrl->getLinkTarget($this, "saveFrameUrl", "", false, false) . "');
643 il.LearningModule.openInitFrames();
644 ");
645
646 $this->tpl->addOnLoadCode("il.LearningModule.setTocRefreshUrl('" .
647 $this->ctrl->getLinkTarget($this, "refreshToc", "", false, false) . "');
648 ");
649 }
650
651 // from main menu
652 // $this->tpl->addJavascript("assets/js/Basic.js");
653 ilYuiUtil::initConnection($this->tpl);
654 }
655 }
656
657 public function saveFrameUrl(): void
658 {
659 $store = new ilSessionIStorage("lm");
660 $store->set("cf_" . $this->lm->getId(), $this->requested_url);
661 }
662
663 public function fullscreen(): string
664 {
665 return $this->media();
666 }
667
668 public function media(): string
669 {
670 $this->tpl = new ilGlobalTemplate("tpl.fullscreen.html", true, true, "components/ILIAS/LearningModule");
671
672 // set style sheets
673 $this->setContentStyles();
674 $this->setSystemStyle();
675
676 $this->ilMedia();
677 if (!$this->offlineMode()) {
678 $this->tpl->printToStdout();
679 } else {
680 return $this->tpl->printToString();
681 }
682 return "";
683 }
684
685 public function glossary(): string
686 {
687 $this->tpl = new ilGlobalTemplate("tpl.glossary_term_output.html", true, true, "components/ILIAS/LearningModule");
688 $this->renderPageTitle();
689
690 iljQueryUtil::initjQuery($this->tpl);
691 //iljQueryUtil::initjQueryUI($this->tpl);
693 ilAccordionGUI::addCss($this->tpl);
694
695 // set style sheets
696 $this->setContentStyles();
697 $this->setSystemStyle();
698
699 $this->ilGlossary();
700
701 $js = $this->global_screen->layout()->meta()->getJs();
702 foreach ($js->getItemsInOrderOfDelivery() as $item) {
703 $this->tpl->addJavaScript($item->getContent());
704 }
705
706 if (!$this->offlineMode()) {
707 $this->tpl->printToStdout();
708 } else {
709 return $this->tpl->printToString();
710 }
711
712 return "";
713 }
714
715 public function page(): string
716 {
717 $ilUser = $this->user;
718 $this->tpl = new ilGlobalTemplate("tpl.page_fullscreen.html", true, true, "components/ILIAS/LearningModule");
719 $GLOBALS["tpl"] = $this->tpl;
720 $this->renderPageTitle();
721
722 $this->setContentStyles();
723
724 // set style sheets
725 if (!$this->offlineMode()) {
726 $this->tpl->setVariable("LOCATION_STYLESHEET", ilUtil::getStyleSheetLocation());
727 } else {
728 $style_name = $ilUser->getPref("style") . ".css";
729 $this->tpl->setVariable("LOCATION_STYLESHEET", "./style/" . $style_name);
730 }
731
732 $this->tpl->setVariable("PAGE_CONTENT", $this->getPageContent());
733 if (!$this->offlineMode()) {
734 $this->tpl->printToStdout();
735 } else {
736 return $this->tpl->get();
737 }
738 return "";
739 }
740
744 public function ilTOC(): ilLMTOCExplorerGUI
745 {
746 $fac = new ilLMTOCExplorerGUIFactory();
747 $exp = $fac->getExplorer($this->service, "ilTOC");
748 $exp->handleCommand();
749 return $exp;
750 }
751
752 public function getLMPresentationTitle(): string
753 {
754 return $this->service->getPresentationStatus()->getLMPresentationTitle();
755 }
756
757 public function ilLMMenu(): void
758 {
759 $this->renderTabs("content", $this->getCurrentPageId());
760 }
761
762 public function setHeader(): void
763 {
764 $this->tpl->setTitle($this->getLMPresentationTitle());
765 $this->tpl->setTitleIcon(ilUtil::getImagePath("standard/icon_lm.svg"));
766 }
767
771 public function ilLMSubMenu(): void
772 {
773 $rbacsystem = $this->rbacsystem;
774 if ($this->abstract) {
775 return;
776 }
777
778
779 $tpl_menu = new ilTemplate("tpl.lm_sub_menu.html", true, true, "components/ILIAS/LearningModule");
780
781 $pg_id = $this->getCurrentPageId();
782 if ($pg_id == 0) {
783 return;
784 }
785
786 // edit learning module
787 if (!$this->offlineMode()) {
788 if ($rbacsystem->checkAccess("write", $this->requested_ref_id)) {
789 $tpl_menu->setCurrentBlock("edit_page");
790 $page_id = $this->getCurrentPageId();
791 $tpl_menu->setVariable(
792 "EDIT_LINK",
793 ILIAS_HTTP_PATH . "/ilias.php?baseClass=ilLMEditorGUI&ref_id=" . $this->requested_ref_id .
794 "&obj_id=" . $page_id . "&to_page=1"
795 );
796 $tpl_menu->setVariable("EDIT_TXT", $this->lng->txt("edit_page"));
797 $tpl_menu->parseCurrentBlock();
798 }
799
800 $page_id = $this->getCurrentPageId();
801
802 // permanent link
803 $this->tpl->setPermanentLink("pg", null, $page_id . "_" . $this->lm->getRefId());
804 }
805
806 $this->tpl->setVariable("SUBMENU", $tpl_menu->get());
807 }
808
809 public function redrawHeaderAction(): void
810 {
811 echo $this->getHeaderAction(true);
812 exit;
813 }
814
815 public function addHeaderAction(): void
816 {
817 //$this->tpl->setVariable("HEAD_ACTION", $this->getHeaderAction());
818 $this->tpl->setHeaderActionMenu($this->getHeaderAction());
819 }
820
821 public function getHeaderAction(
822 bool $a_redraw = false
823 ): string {
824 if ($this->offline) {
825 return "";
826 }
827 $ilAccess = $this->access;
828 $ilSetting = $this->settings;
829 $tpl = $this->tpl;
830
831 $lm_id = $this->lm->getId();
832 $pg_id = $this->getCurrentPageId();
833
834 $this->lng->loadLanguageModule("content");
835
836 $dispatcher = new ilCommonActionDispatcherGUI(
838 $ilAccess,
839 $this->lm->getType(),
840 $this->lm->getRefId(),
841 $this->lm->getId()
842 );
843 $dispatcher->setSubObject("pg", $this->getCurrentPageId());
844
845 $this->ctrl->setParameter($this, "embed_mode", (int) $this->embed_mode);
846 $this->ctrl->setParameterByClass("ilcommentgui", "embed_mode", (int) $this->embed_mode);
847 $this->ctrl->setParameterByClass("iltagginggui", "embed_mode", (int) $this->embed_mode);
849 $this->ctrl->getLinkTarget($this, "redrawHeaderAction", "", true),
850 "",
851 $this->ctrl->getLinkTargetByClass(
852 array("ilcommonactiondispatchergui", "iltagginggui"),
853 "",
854 "",
855 true,
856 false
857 ),
858 $this->tpl
859 );
860
861 $lg = $dispatcher->initHeaderAction();
862 if (!$ilSetting->get("disable_notes")) {
863 $lg->enableNotes(true);
864 if (!$this->embed_mode) {
865 $lg->enableComments($this->lm->publicNotes(), false);
866 }
867 }
868
869 if ($this->lm->hasRating() && !$this->offlineMode()) {
870 $lg->enableRating(
871 true,
872 $this->lng->txt("lm_rating"),
873 false,
874 array("ilcommonactiondispatchergui", "ilratinggui"),
875 true
876 );
877 }
878
879 // notification
880 if ($this->user->getId() != ANONYMOUS_USER_ID && !$this->embed_mode) {
881 if (ilNotification::hasNotification(ilNotification::TYPE_LM, $this->user->getId(), $lm_id)) {
882 $this->ctrl->setParameter($this, "ntf", 1);
883 if (ilNotification::hasOptOut($lm_id)) {
884 $lg->addCustomCommand($this->ctrl->getLinkTarget($this), "cont_notification_deactivate_lm");
885 }
886
887 $lg->addHeaderIcon(
888 "not_icon",
889 ilUtil::getImagePath("object/notification_on.svg"),
890 $this->lng->txt("cont_notification_activated")
891 );
892 } else {
893 $this->ctrl->setParameter($this, "ntf", 2);
894 $lg->addCustomCommand($this->ctrl->getLinkTarget($this), "cont_notification_activate_lm");
895
897 $this->ctrl->setParameter($this, "ntf", 3);
898 $lg->addCustomCommand($this->ctrl->getLinkTarget($this), "cont_notification_deactivate_page");
899
900 $lg->addHeaderIcon(
901 "not_icon",
902 ilUtil::getImagePath("object/notification_on.svg"),
903 $this->lng->txt("cont_page_notification_activated")
904 );
905 } else {
906 $this->ctrl->setParameter($this, "ntf", 4);
907 $lg->addCustomCommand($this->ctrl->getLinkTarget($this), "cont_notification_activate_page");
908
909 $lg->addHeaderIcon(
910 "not_icon",
911 ilUtil::getImagePath("object/notification_off.svg"),
912 $this->lng->txt("cont_notification_deactivated")
913 );
914 }
915 }
916 $this->ctrl->setParameter($this, "ntf", "");
917 }
918
919 if (!$this->offline) {
920 if ($ilAccess->checkAccess("write", "", $this->requested_ref_id)) {
921 if ($this->getCurrentPageId() <= 0) {
922 $link = $this->ctrl->getLinkTargetByClass(["ilLMEditorGUI", "ilobjlearningmodulegui"], "chapters");
923 } else {
924 $link = ILIAS_HTTP_PATH . "/ilias.php?baseClass=ilLMEditorGUI&ref_id=" . $this->requested_ref_id .
925 "&obj_id=" . $this->getCurrentPageId() . "&to_page=1";
926 }
927 $lg->addCustomCommand($link, "edit_page");
928 }
929 }
930
931 if (!$a_redraw) {
932 return $lg->getHeaderAction($this->tpl);
933 } else {
934 // we need to add onload code manually (rating, comments, etc.)
935 return $lg->getHeaderAction() .
937 }
938 }
939
943 public function ilLMNotes(): string
944 {
945 $ilAccess = $this->access;
946 $ilSetting = $this->settings;
947
948 // no notes in offline (export) mode
949 if ($this->offlineMode()) {
950 return "";
951 }
952
953 // now output comments
954
955 if ($ilSetting->get("disable_comments")) {
956 return "";
957 }
958 if (!$this->lm->publicNotes()) {
959 return "";
960 }
961
962 $next_class = $this->ctrl->getNextClass($this);
963
964 $pg_id = $this->getCurrentPageId();
965
966 if ($pg_id == 0) {
967 return "";
968 }
969 $notes_gui = $this->notes_gui->getCommentsGUI($this->lm->getId(), $this->getCurrentPageId(), "pg");
970 $notes_gui->setUseObjectTitleHeader(false);
971
972 if ($ilAccess->checkAccess("write", "", $this->requested_ref_id) &&
973 $ilSetting->get("comments_del_tutor", '1')) {
974 $notes_gui->enablePublicNotesDeletion(true);
975 }
976
977 $this->ctrl->setParameter($this, "frame", $this->requested_frame);
978 $this->ctrl->setParameter($this, "obj_id", $this->requested_obj_id);
979
980 $notes_gui->enablePrivateNotes();
981 if ($this->lm->publicNotes()) {
982 $notes_gui->enablePublicNotes();
983 }
984
985 $callback = array($this, "observeNoteAction");
986 $notes_gui->addObserver($callback);
987
988 if ($next_class == "ilcommentgui") {
989 $html = $this->ctrl->forwardCommand($notes_gui);
990 } else {
991 $html = $notes_gui->getListHTML();
992 }
993 return $html;
994 }
995
996 public function ilLocator(): void
997 {
998 global $DIC;
999 $ltiview = $DIC["lti"];
1000 $ilLocator = $this->locator;
1001
1002 if (empty($this->requested_obj_id)) {
1003 $a_id = $this->lm_tree->getRootId();
1004 } else {
1005 $a_id = $this->requested_obj_id;
1006 }
1007
1008 if (!$this->lm->cleanFrames()) {
1009 $frame_param = $this->requested_frame;
1010 $frame_target = "";
1011 } elseif (!$this->offlineMode()) {
1012 $frame_param = "";
1013 $frame_target = ilFrameTargetInfo::_getFrame("MainContent");
1014 } else {
1015 $frame_param = "";
1016 $frame_target = "_top";
1017 }
1018
1019 if (!$this->offlineMode()) {
1020 // LTI
1021 if ($ltiview->isActive()) {
1022 // Do nothing, its complicated...
1023 } else {
1024 $ilLocator->addRepositoryItems();
1025 }
1026 } else {
1027 $ilLocator->setOffline(true);
1028 }
1029
1030 if ($this->lm_tree->isInTree($a_id)) {
1031 $path = $this->lm_tree->getPathFull($a_id);
1032
1033 foreach ($path as $key => $row) {
1034 if ($row["type"] != "pg") {
1035 if ($row["child"] != $this->lm_tree->getRootId()) {
1036 $ilLocator->addItem(
1039 $row["child"],
1041 $this->lm->isActiveNumbering(),
1042 (bool) $this->lm_set->get("time_scheduled_page_activation"),
1043 false,
1044 0,
1045 $this->lang
1046 ),
1047 50,
1048 true
1049 ),
1050 $this->linker->getLink("layout", $row["child"], $frame_param, "StructureObject"),
1051 $frame_target
1052 );
1053 } else {
1054 $ilLocator->addItem(
1055 ilStr::shortenTextExtended($this->getLMPresentationTitle(), 50, true),
1056 $this->linker->getLink("layout", 0, $frame_param),
1057 $frame_target,
1058 $this->requested_ref_id
1059 );
1060 }
1061 }
1062 }
1063 } else { // lonely page
1064 $ilLocator->addItem(
1065 $this->getLMPresentationTitle(),
1066 $this->linker->getLink("layout", 0, $this->requested_frame)
1067 );
1068
1069 $lm_obj = ilLMObjectFactory::getInstance($this->lm, $a_id);
1070
1071 $ilLocator->addItem(
1072 $lm_obj->getTitle(),
1073 $this->linker->getLink("layout", $a_id, $frame_param),
1074 $frame_target
1075 );
1076 }
1077
1078 $this->tpl->setLocator();
1079 }
1080
1084 public function getCurrentPageId(): ?int
1085 {
1086 return $this->service->getNavigationStatus()->getCurrentPage();
1087 }
1088
1092 protected function setContentStyles(): void
1093 {
1094 // content style
1095 $this->content_style_gui->addCss(
1096 $this->tpl,
1097 $this->lm->getRefId()
1098 );
1099 $this->tpl->addCss(ilObjStyleSheet::getSyntaxStylePath());
1100 }
1101
1105 protected function setSystemStyle(): void
1106 {
1107 $this->tpl->addCss(ilUtil::getStyleSheetLocation());
1108 }
1109
1110 public function getContent(
1111 bool $skip_nav = false
1112 ): string {
1113 $this->fill_on_load_code = true;
1114 $this->setContentStyles();
1115
1116 $tpl = new ilTemplate("tpl.lm_content.html", true, true, "components/ILIAS/LearningModule/Presentation");
1117
1118 if (!$skip_nav) {
1119 $navigation_renderer = new ilLMNavigationRendererGUI(
1120 $this->service,
1121 $this,
1122 $this->lng,
1123 $this->user,
1124 $this->tpl,
1125 $this->requested_obj_id,
1126 $this->requested_back_pg,
1127 $this->requested_frame,
1128 $this->toolbar,
1129 $this->ui
1130 );
1131
1132 $navigation_renderer->renderTop();
1133 //$tpl->setVariable("TOP_NAVIGATION", $navigation_renderer->renderTop());
1134 //$tpl->setVariable("BOTTOM_NAVIGATION", $navigation_renderer->renderBottom());
1135 }
1136 $tpl->setVariable("PAGE_CONTENT", $this->getPageContent());
1137 $tpl->setVariable("RATING", $this->renderRating());
1138
1139 return $tpl->get();
1140 }
1141
1142 protected function getPageContent(): string
1143 {
1144 $content_renderer = new ilLMContentRendererGUI(
1145 $this->service,
1146 $this,
1147 $this->lng,
1148 $this->ot,
1149 $this->ctrl,
1150 $this->access,
1151 $this->user,
1152 $this->help,
1153 $this->requested_obj_id
1154 );
1155
1156 return $content_renderer->render();
1157 }
1158
1159 protected function renderRating(): string
1160 {
1161 // rating
1162 $rating = "";
1163 if ($this->lm->hasRatingPages() && !$this->offlineMode()) {
1164 $rating_gui = new ilRatingGUI();
1165 $rating_gui->setObject($this->lm->getId(), "lm", $this->getCurrentPageId(), "lm");
1166 $rating_gui->setYourRatingText($this->lng->txt("lm_rate_page"));
1167
1168 $this->ctrl->setParameter($this, "pg_id", $this->getCurrentPageId());
1169 $this->tpl->addOnLoadCode("il.LearningModule.setRatingUrl('" .
1170 $this->ctrl->getLinkTarget($this, "updatePageRating", "", true, false) .
1171 "')");
1172 $this->ctrl->setParameter($this, "pg_id", "");
1173
1174 $rating = '<div id="ilrtrpg" style="text-align:right">' .
1175 $rating_gui->getHTML(true, true, "il.LearningModule.saveRating(%rating%);") .
1176 "</div>";
1177 }
1178 return $rating;
1179 }
1180
1181 public function updatePageRating(): void
1182 {
1183 $ilUser = $this->user;
1184 $pg_id = $this->service->getRequest()->getPgId();
1185 if (!$this->ctrl->isAsynch() || !$pg_id) {
1186 exit();
1187 }
1188
1189 $rating = $this->service->getRequest()->getRating();
1190 if ($rating) {
1192 $this->lm->getId(),
1193 "lm",
1194 $pg_id,
1195 "lm",
1196 $ilUser->getId(),
1197 $rating
1198 );
1199 } else {
1201 $this->lm->getId(),
1202 "lm",
1203 $pg_id,
1204 "lm",
1205 $ilUser->getId()
1206 );
1207 }
1208
1209 $rating = new ilRatingGUI();
1210 $rating->setObject($this->lm->getId(), "lm", $pg_id, "lm");
1211 $rating->setYourRatingText($this->lng->txt("lm_rate_page"));
1212
1213 echo $rating->getHTML(true, true, "il.LearningModule.saveRating(%rating%);");
1214
1215 echo $this->tpl->getOnLoadCodeForAsynch();
1216 exit();
1217 }
1218
1219 public function basicPageGuiInit(\ilPageObjectGUI $a_page_gui): void
1220 {
1221 $a_page_gui->setStyleId(
1222 $this->content_style_domain->getEffectiveStyleId()
1223 );
1224 if (!$this->offlineMode()) {
1225 $a_page_gui->setOutputMode("presentation");
1226 $this->fill_on_load_code = true;
1227 } else {
1228 $a_page_gui->setOutputMode("offline");
1229 $a_page_gui->setOfflineDirectory($this->getOfflineDirectory());
1230 $this->fill_on_load_code = false;
1231 }
1232 if (!$this->offlineMode()) {
1233 $this->ctrl->setParameter($this, "obj_id", $this->getCurrentPageId()); // see #22403
1234 }
1235 $a_page_gui->setFileDownloadLink($this->linker->getLink("downloadFile"));
1236 $a_page_gui->setSourcecodeDownloadScript($this->linker->getLink(
1237 "sourcecodeDownload",
1238 $this->getCurrentPageId()
1239 ));
1240 if (!$this->offlineMode()) {
1241 $this->ctrl->setParameter($this, "obj_id", $this->requested_obj_id);
1242 }
1243 $a_page_gui->setFullscreenLink($this->linker->getLink("fullscreen"));
1244 $a_page_gui->setSourcecodeDownloadScript($this->linker->getLink("download_paragraph"));
1245 }
1246
1247 public function ilGlossary(): void
1248 {
1249 $ilCtrl = $this->ctrl;
1250
1251 $term_gui = new ilGlossaryTermGUI($this->requested_obj_id);
1252
1253 // content style
1254 $this->setContentStyles();
1255
1256 $term_gui->setPageLinker($this->linker);
1257
1258 $term_gui->setOfflineDirectory($this->getOfflineDirectory());
1259 if (!$this->offlineMode()) {
1260 $ilCtrl->setParameter($this, "pg_type", "glo");
1261 }
1262 $term_gui->output($this->offlineMode(), $this->tpl);
1263
1264 if (!$this->offlineMode()) {
1265 $ilCtrl->setParameter($this, "pg_type", "");
1266 }
1267 }
1268
1269 public function ilMedia(): void
1270 {
1271 $pg_frame = "";
1272 $this->setContentStyles();
1273
1274 $this->renderPageTitle();
1275
1276 $this->tpl->setCurrentBlock("ilMedia");
1277 $med_links = ilMediaItem::_getMapAreasIntLinks($this->requested_mob_id);
1278 $link_xml = $this->linker->getLinkXML($med_links);
1279
1280 $media_obj = new ilObjMediaObject($this->requested_mob_id);
1281 if (!empty($this->requested_pg_id)) {
1282 $pg_obj = $this->getLMPage($this->requested_pg_id, $this->requested_pg_type);
1283 $pg_obj->buildDom();
1284
1285 $xml = "<dummy>";
1286 // todo: we get always the first alias now (problem if mob is used multiple
1287 // times in page)
1288 $xml .= $pg_obj->getMediaAliasElement($this->requested_mob_id);
1289 } else {
1290 $xml = "<dummy>";
1291 // todo: we get always the first alias now (problem if mob is used multiple
1292 // times in page)
1293 $xml .= $media_obj->getXML(IL_MODE_ALIAS);
1294 }
1295 $xml .= $media_obj->getXML(IL_MODE_OUTPUT);
1296 $xml .= $link_xml;
1297 $xml .= "</dummy>";
1298
1299 if (!$this->offlineMode()) {
1300 $wb_path = ilFileUtils::getWebspaceDir("output") . "/";
1301 } else {
1302 $wb_path = "";
1303 }
1304
1305 $mode = ($this->requested_cmd == "fullscreen")
1306 ? "fullscreen"
1307 : "media";
1308 $enlarge_path = ilUtil::getImagePath("media/enlarge.svg", false, "output", $this->offlineMode());
1309 $fullscreen_link =
1310 $this->linker->getLink("fullscreen");
1311 $params = array('mode' => $mode,
1312 'enlarge_path' => $enlarge_path,
1313 'link_params' => "ref_id=" . $this->lm->getRefId(),
1314 'fullscreen_link' => $fullscreen_link,
1315 'enable_html_mob' => ilObjMediaObject::isTypeAllowed("html") ? "y" : "n",
1316 'ref_id' => $this->lm->getRefId(),
1317 'pg_frame' => $pg_frame,
1318 'webspace_path' => $wb_path
1319 );
1320 $output = $this->xsl->process($xml, $params);
1321
1322 // unmask user html
1323 $this->tpl->setVariable("MEDIA_CONTENT", $output);
1324
1325 // add js
1327 }
1328
1329 public function ilJavaScript(
1330 string $a_inline = "",
1331 string $a_file = "",
1332 string $a_location = ""
1333 ): void {
1334 if ($a_inline != "") {
1335 $js_tpl = new ilTemplate($a_inline, true, false, $a_location);
1336 $js = $js_tpl->get();
1337 $this->tpl->setVariable("INLINE_JS", $js);
1338 }
1339 }
1340
1346 public function infoScreen(): void
1347 {
1348 $this->ctrl->redirectByClass(ilInfoScreenGUI::class, "showSummary");
1349 }
1350
1354 public function showInfoScreen(): void
1355 {
1356 $this->outputInfoScreen();
1357 }
1358
1359 protected function initScreenHead(
1360 string $a_active_tab = "info"
1361 ): void {
1362 $ilAccess = $this->access;
1363 $ilLocator = $this->locator;
1364
1365 $this->renderPageTitle();
1366
1367 $this->tpl->loadStandardTemplate();
1368 $this->tpl->setTitle($this->getLMPresentationTitle());
1369 $this->tpl->setTitleIcon(ilUtil::getImagePath("standard/icon_lm.svg"));
1370
1371 $this->renderTabs($a_active_tab, 0);
1372
1373 // Full locator, if read permission is given
1374 if ($ilAccess->checkAccess("read", "", $this->requested_ref_id)) {
1375 $this->ilLocator();
1376 } else {
1377 $ilLocator->addRepositoryItems();
1378 $this->tpl->setLocator();
1379 }
1380 }
1381
1385 public function outputInfoScreen(): string
1386 {
1387 $ilAccess = $this->access;
1388
1389 if (!$this->lm->isInfoEnabled()) {
1390 return "";
1391 }
1392
1393 $this->initScreenHead();
1394
1395 $this->lng->loadLanguageModule("meta");
1396
1397 $info = new ilInfoScreenGUI($this->lm_gui);
1398 $info->enablePrivateNotes();
1399 //$info->enableLearningProgress();
1400 $info->enableNews();
1401 if ($ilAccess->checkAccess("write", "", $this->requested_ref_id)) {
1402 $news_set = new ilSetting("news");
1403 $enable_internal_rss = $news_set->get("enable_rss_for_internal");
1404
1405 $info->enableNewsEditing();
1406
1407 if ($enable_internal_rss) {
1408 $info->setBlockProperty("news", "settings", true);
1409 }
1410 }
1411
1412 // show standard meta data section
1413 $info->addMetaDataSections($this->lm->getId(), 0, $this->lm->getType());
1414
1415 $this->lng->loadLanguageModule("copg");
1416 $est_reading_time = $this->reading_time_manager->getReadingTime($this->lm->getId());
1417 if (!is_null($est_reading_time)) {
1418 $info->addProperty(
1419 $this->lng->txt("copg_est_reading_time"),
1420 sprintf($this->lng->txt("copg_x_minutes"), $est_reading_time)
1421 );
1422 }
1423
1424 if ($this->offlineMode()) {
1425 $this->tpl->setContent($info->getHTML());
1426 return $this->tpl->get();
1427 } else {
1428 // forward the command
1429 $this->ctrl->forwardCommand($info);
1430 //$this->tpl->setContent("aa");
1431 $this->tpl->printToStdout();
1432 }
1433 return "";
1434 }
1435
1439 public function showPrintViewSelection(): void
1440 {
1441 $ilUser = $this->user;
1442 $lng = $this->lng;
1443
1444 if (!$this->lm->isActivePrintView() || !$this->lm->isActiveLMMenu()) {
1445 return;
1446 }
1447
1448 $disabled = false;
1449 $img_alt = "";
1450
1451 $tpl = new ilTemplate("tpl.lm_print_selection.html", true, true, "components/ILIAS/LearningModule");
1452
1453 $this->ctrl->setParameterByClass("illmpresentationgui", "obj_id", $this->requested_obj_id);
1454 $tpl->setVariable("FORMACTION", $this->ctrl->getFormAction($this));
1455
1456 $nodes = $this->lm_tree->getSubTree($this->lm_tree->getNodeData($this->lm_tree->getRootId()));
1457 $nodes = $this->filterNonAccessibleNode($nodes);
1458
1459 $this->initPrintViewSelectionForm();
1460
1461 foreach ($nodes as $node) {
1462 $img_src = "";
1463 $disabled = false;
1464 $img_alt = "";
1465
1466 // check page activation
1467 $active = ilLMPage::_lookupActive(
1468 $node["obj_id"],
1469 $this->lm->getType(),
1470 (bool) $this->lm_set->get("time_scheduled_page_activation")
1471 );
1472
1473 if ($node["type"] == "pg" &&
1474 !$active) {
1475 continue;
1476 }
1477
1478 $text = "";
1479 $img_alt = "";
1480 $checked = false;
1481
1482 switch ($node["type"]) {
1483 // page
1484 case "pg":
1485 $text =
1487 $node["obj_id"],
1488 $this->lm->getPageHeader(),
1489 $this->lm->isActiveNumbering(),
1490 (bool) $this->lm_set->get("time_scheduled_page_activation"),
1491 false,
1492 0,
1493 $this->lang
1494 );
1495
1496 $img_src = ilUtil::getImagePath("standard/icon_pg.svg");
1497 $img_alt = $lng->txt("icon") . " " . $lng->txt("pg");
1498 break;
1499
1500 // learning module
1501 case "du":
1502 $text = $this->getLMPresentationTitle();
1503 $img_src = ilUtil::getImagePath("standard/icon_lm.svg");
1504 $img_alt = $lng->txt("icon") . " " . $lng->txt("obj_lm");
1505 break;
1506
1507 // chapter
1508 case "st":
1509 $text =
1511 $node["obj_id"],
1513 $this->lm->isActiveNumbering(),
1514 (bool) $this->lm_set->get("time_scheduled_page_activation"),
1515 false,
1516 0,
1517 $this->lang
1518 );
1519 $img_src = ilUtil::getImagePath("standard/icon_st.svg");
1520 $img_alt = $lng->txt("icon") . " " . $lng->txt("st");
1521 break;
1522 }
1523
1525 $this->lm->getRefId(),
1526 $this->lm->getId(),
1527 $node["obj_id"]
1528 )) {
1529 $text .= " (" . $this->lng->txt("cont_no_access") . ")";
1530 }
1531
1532 $this->nl->addListNode(
1533 $node["obj_id"],
1534 $text,
1535 $node["parent"],
1536 $checked,
1537 $disabled,
1538 $img_src,
1539 $img_alt
1540 );
1541 }
1542
1543 // check for free page
1544 if ($this->requested_obj_id > 0 && !$this->lm_tree->isInTree($this->requested_obj_id)) {
1545 $text =
1547 $this->requested_obj_id,
1548 $this->lm->getPageHeader(),
1549 $this->lm->isActiveNumbering(),
1550 (bool) $this->lm_set->get("time_scheduled_page_activation"),
1551 false,
1552 0,
1553 $this->lang
1554 );
1555
1556 $img_src = ilUtil::getImagePath("standard/icon_pg.svg");
1557 $id = $this->requested_obj_id;
1558
1559 $checked = true;
1560
1561 $this->nl->addListNode(
1562 $id,
1563 $text,
1564 0,
1565 $checked,
1566 $disabled,
1567 $img_src,
1568 $img_alt
1569 );
1570 }
1571
1572 $f = $this->form->getHTMLAsync();
1573
1574 $tpl->setVariable("ITEM_SELECTION", $f);
1575
1576 $modal = $this->ui->factory()->modal()->roundtrip(
1577 $this->lng->txt("cont_print_view"),
1578 $this->ui->factory()->legacy()->content($tpl->get())
1579 );
1580 echo $this->ui->renderer()->render($modal);
1581 exit();
1582 }
1583
1584 protected function filterNonAccessibleNode(
1585 array $nodes
1586 ): array {
1587 $tracker = $this->getTracker();
1588 // if navigation is restricted based on correct answered questions
1589 // check if we have preceeding pages including unsanswered/incorrect answered questions
1590 if (!$this->offlineMode()) {
1591 if ($this->lm->getRestrictForwardNavigation()) {
1592 $nodes = array_filter($nodes, function ($node) use ($tracker) {
1593 return !$tracker->hasPredIncorrectAnswers($node["child"]);
1594 });
1595 }
1596 }
1597 return $nodes;
1598 }
1599
1600 public function initPrintViewSelectionForm(): void
1601 {
1602 $lng = $this->lng;
1603 $ilCtrl = $this->ctrl;
1604
1605 $this->form = new ilPropertyFormGUI();
1606 $this->form->setForceTopButtons(true);
1607
1608 // selection type
1609 $radg = new ilRadioGroupInputGUI($lng->txt("cont_selection"), "sel_type");
1610 $radg->setValue("page");
1611 $op1 = new ilRadioOption($lng->txt("cont_current_page"), "page");
1612 $radg->addOption($op1);
1613 $op2 = new ilRadioOption($lng->txt("cont_current_chapter"), "chapter");
1614 $radg->addOption($op2);
1615 $op3 = new ilRadioOption($lng->txt("cont_selected_pg_chap"), "selection");
1616 $radg->addOption($op3);
1617
1618 $nl = new ilNestedListInputGUI("", "obj_id");
1619 $this->nl = $nl;
1620 $op3->addSubItem($nl);
1621
1622 $this->form->addItem($radg);
1623
1624 $this->form->addCommandButton("showPrintView", $lng->txt("cont_show_print_view"));
1625 $this->form->setOpenTag(false);
1626 $this->form->setCloseTag(false);
1627
1628 $this->form->setTitle(" ");
1629 $this->form->setFormAction($ilCtrl->getFormAction($this));
1630 }
1631
1632 public function showPrintView(): void
1633 {
1634 $ilUser = $this->user;
1635 $lng = $this->lng;
1636 $ilCtrl = $this->ctrl;
1637 $tabs = $this->tabs;
1638 $header_page_content = "";
1639 $footer_page_content = "";
1640 $chapter_title = "";
1641 $did_chap_page_header = false;
1642
1643 $lom_paths = $this->lom_services->paths();
1644 $lom_data_helper = $this->lom_services->dataHelper();
1645 $lom_cp_helper = $this->lom_services->copyrightHelper();
1646 $lom_reader = $this->lom_services->read($this->lm->getId(), 0, $this->lm->getType());
1647
1648 if (!$this->lm->isActivePrintView() || !$this->lm->isActiveLMMenu()) {
1649 return;
1650 }
1651
1652 $this->renderPageTitle();
1653
1654 $tabs->setBackTarget(
1655 $lng->txt("back"),
1656 $ilCtrl->getLinkTarget($this, "layout")
1657 );
1658
1659 $c_obj_id = $this->getCurrentPageId();
1660 // set values according to selection
1661 $sel_type = $this->service->getRequest()->getSelectedType();
1662 $sel_obj_ids = $this->service->getRequest()->getSelectedObjIds();
1663 if ($sel_type == "page") {
1664 if (!in_array($c_obj_id, $sel_obj_ids)) {
1665 $sel_obj_ids[] = $c_obj_id;
1666 }
1667 }
1668 if ($sel_type == "chapter" && $c_obj_id > 0) {
1669 $path = $this->lm_tree->getPathFull($c_obj_id);
1670 $chap_id = $path[1]["child"];
1671 if ($chap_id > 0) {
1672 $sel_obj_ids[] = $chap_id;
1673 }
1674 }
1675
1676 $this->setContentStyles();
1677 $this->tpl->addCss(ilObjStyleSheet::getContentPrintStyle());
1678
1679 $tpl = new ilTemplate("tpl.lm_print_view.html", true, true, "components/ILIAS/LearningModule");
1680
1681 // set title header
1682 $this->tpl->setTitle($this->getLMPresentationTitle());
1683
1684 $nodes = $this->lm_tree->getSubTree($this->lm_tree->getNodeData($this->lm_tree->getRootId()));
1685
1686 $act_level = 99999;
1687 $activated = false;
1688
1689 $glossary_links = array();
1690 $output_header = false;
1691 $media_links = array();
1692 $last_page_title = "";
1693
1694 // get header and footer
1695 if ($this->lm->getFooterPage() > 0 && !$this->lm->getHideHeaderFooterPrint()) {
1696 if (ilLMObject::_exists($this->lm->getFooterPage())) {
1697 $page_object_gui = $this->getLMPageGUI($this->lm->getFooterPage());
1698 $page_object_gui->setStyleId(
1699 $this->content_style_domain->getEffectiveStyleId()
1700 );
1701
1702 // determine target frames for internal links
1703 $page_object_gui->setLinkFrame($this->requested_frame);
1704 $page_object_gui->setOutputMode("print");
1705 $page_object_gui->setPresentationTitle("");
1706 $page_object_gui->setFileDownloadLink("#");
1707 $page_object_gui->setFullscreenLink("#");
1708 $page_object_gui->setSourcecodeDownloadScript("#");
1709 $footer_page_content = $page_object_gui->showPage();
1710 }
1711 }
1712 if ($this->lm->getHeaderPage() > 0 && !$this->lm->getHideHeaderFooterPrint()) {
1713 if (ilLMObject::_exists($this->lm->getHeaderPage())) {
1714 $page_object_gui = $this->getLMPageGUI($this->lm->getHeaderPage());
1715 $page_object_gui->setStyleId(
1716 $this->content_style_domain->getEffectiveStyleId()
1717 );
1718
1719 // determine target frames for internal links
1720 $page_object_gui->setLinkFrame($this->requested_frame);
1721 $page_object_gui->setOutputMode("print");
1722 $page_object_gui->setPresentationTitle("");
1723 $page_object_gui->setFileDownloadLink("#");
1724 $page_object_gui->setFullscreenLink("#");
1725 $page_object_gui->setSourcecodeDownloadScript("#");
1726 $header_page_content = $page_object_gui->showPage();
1727 }
1728 }
1729
1730 // add free selected pages
1731 if (count($sel_obj_ids) > 0) {
1732 foreach ($sel_obj_ids as $k) {
1733 if ($k > 0 && !$this->lm_tree->isInTree($k)) {
1734 if (ilLMObject::_lookupType($k) == "pg") {
1735 $nodes[] = array("obj_id" => $k, "type" => "pg", "free" => true);
1736 }
1737 }
1738 }
1739 } else {
1740 $this->tpl->setOnScreenMessage('failure', $lng->txt("cont_print_no_page_selected"), true);
1741 $ilCtrl->redirect($this, "showPrintViewSelection");
1742 }
1743
1744 foreach ($nodes as $node_key => $node) {
1745 // check page activation
1746 $active = ilLMPage::_lookupActive(
1747 $node["obj_id"],
1748 $this->lm->getType(),
1749 (bool) $this->lm_set->get("time_scheduled_page_activation")
1750 );
1751 if ($node["type"] == "pg" && !$active) {
1752 continue;
1753 }
1754
1755 // print all subchapters/subpages if higher chapter
1756 // has been selected
1757 if ($node["depth"] <= $act_level) {
1758 if (in_array($node["obj_id"], $sel_obj_ids)) {
1759 $act_level = $node["depth"];
1760 $activated = true;
1761 } else {
1762 $act_level = 99999;
1763 $activated = false;
1764 }
1765 }
1766 if ($this->lm->getRestrictForwardNavigation()) {
1767 if ($this->getTracker()->hasPredIncorrectAnswers($node["obj_id"])) {
1768 continue;
1769 }
1770 }
1771 if ($activated &&
1773 $this->lm->getRefId(),
1774 $this->lm->getId(),
1775 $node["obj_id"]
1776 )) {
1777 // output learning module header
1778 if ($node["type"] == "du") {
1779 $output_header = true;
1780 }
1781
1782 // output chapter title
1783 if ($node["type"] == "st") {
1784
1785 $chap = new ilStructureObject($this->lm, $node["obj_id"]);
1786 $tpl->setCurrentBlock("print_chapter");
1787
1788 $chapter_title = $chap->_getPresentationTitle(
1789 $node["obj_id"],
1791 $this->lm->isActiveNumbering(),
1792 (bool) $this->lm_set->get("time_scheduled_page_activation"),
1793 false,
1794 0,
1795 $this->lang
1796 );
1797 $tpl->setVariable(
1798 "CHAP_TITLE",
1799 $chapter_title
1800 );
1801
1802 if ($this->lm->getPageHeader() == ilLMObject::CHAPTER_TITLE) {
1803 if ($nodes[$node_key + 1]["type"] == "pg") {
1804 $tpl->setVariable(
1805 "CHAP_HEADER",
1806 $header_page_content
1807 );
1808 $did_chap_page_header = true;
1809 }
1810 }
1811
1812 $tpl->parseCurrentBlock();
1813 $tpl->setCurrentBlock("print_block");
1814 $tpl->parseCurrentBlock();
1815 }
1816
1817 // output page
1818 if ($node["type"] === "pg") {
1819
1820 $tpl->setCurrentBlock("print_item");
1821
1822 // get page
1823 $page_id = $node["obj_id"];
1824 $page_object_gui = $this->getLMPageGUI($page_id);
1825 $page_object = $page_object_gui->getPageObject();
1826 $page_object_gui->setStyleId(
1827 $this->content_style_domain->getEffectiveStyleId()
1828 );
1829
1830 // get lm page
1831 $lm_pg_obj = new ilLMPageObject($this->lm, $page_id);
1832 $lm_pg_obj->setLMId($this->lm->getId());
1833
1834 // determine target frames for internal links
1835 $page_object_gui->setLinkFrame($this->requested_frame);
1836 $page_object_gui->setOutputMode("print");
1837 $page_object_gui->setPresentationTitle("");
1838
1839 // if ($this->lm->getPageHeader() == ilLMObject::PAGE_TITLE || ($node["free"] ?? false) === true) {
1840 if (true) {
1842 $lm_pg_obj->getId(),
1843 $this->lm->getPageHeader(),
1844 $this->lm->isActiveNumbering(),
1845 (bool) $this->lm_set->get("time_scheduled_page_activation"),
1846 false,
1847 0,
1848 $this->lang
1849 );
1850
1851 if ($this->lm->getPageHeader() === ilLMObject::CHAPTER_TITLE) {
1852 // remove the suffic (x/n)
1853 $page_title = trim(substr($page_title, 0, strrpos($page_title, " ")));
1854 }
1855
1856 // prevent page title after chapter title
1857 // that have the same content
1858 if ($this->lm->isActiveNumbering()) {
1859 $chapter_title = trim(substr(
1860 $chapter_title,
1861 strpos($chapter_title, " ")
1862 ));
1863 }
1864
1865 if ($page_title != $chapter_title && $page_title !== $last_page_title) {
1866 $page_object_gui->setPresentationTitle($page_title);
1867 }
1868 $last_page_title = $page_title;
1869 }
1870
1871 // handle header / footer
1872 $hcont = $header_page_content;
1873 $fcont = $footer_page_content;
1874
1875 if ($this->lm->getPageHeader() == ilLMObject::CHAPTER_TITLE) {
1876 if ($did_chap_page_header) {
1877 $hcont = "";
1878 }
1879 if (($nodes[$node_key + 1]["type"] ?? "") == "pg" &&
1880 !($nodes[$node_key + 1]["depth"] <= $act_level
1881 && !in_array($nodes[$node_key + 1]["obj_id"], $sel_obj_ids))) {
1882 $fcont = "";
1883 }
1884 }
1885
1886 $page_object_gui->setFileDownloadLink("#");
1887 $page_object_gui->setFullscreenLink("#");
1888 $page_object_gui->setSourcecodeDownloadScript("#");
1889 $page_content = $page_object_gui->showPage();
1890 if ($this->lm->getPageHeader() != ilLMObject::PAGE_TITLE) {
1891 $tpl->setVariable(
1892 "CONTENT",
1893 $hcont . $page_content . $fcont
1894 );
1895 } else {
1896 $tpl->setVariable(
1897 "CONTENT",
1898 $hcont . $page_content . $fcont . "<br />"
1899 );
1900 }
1901 $chapter_title = "";
1902 $tpl->parseCurrentBlock();
1903 $tpl->setCurrentBlock("print_block");
1904 $tpl->parseCurrentBlock();
1905
1906 // get internal links
1907 $int_links = ilInternalLink::_getTargetsOfSource($this->lm->getType() . ":pg", $node["obj_id"]);
1908
1909 $got_mobs = false;
1910
1911 foreach ($int_links as $key => $link) {
1912 if ($link["type"] == "git" &&
1913 ($link["inst"] == IL_INST_ID || $link["inst"] == 0)) {
1914 $glossary_links[$key] = $link;
1915 }
1916 if ($link["type"] == "mob" &&
1917 ($link["inst"] == IL_INST_ID || $link["inst"] == 0)) {
1918 $got_mobs = true;
1919 $mob_links[$key] = $link;
1920 }
1921 }
1922
1923 // this is not cool because of performance reasons
1924 // unfortunately the int link table does not
1925 // store the target frame (we want to append all linked
1926 // images but not inline images (i.e. mobs with no target
1927 // frame))
1928 if ($got_mobs) {
1929 $page_object->buildDom();
1930 $links = $page_object->getInternalLinks();
1931 $tf = $link["TargetFrame"] ?? "";
1932 foreach ($links as $link) {
1933 if ($link["Type"] === "MediaObject"
1934 && $tf !== ""
1935 && $tf !== "None") {
1936 $media_links[] = $link;
1937 }
1938 }
1939 }
1940 }
1941 }
1942 }
1943
1944 $annex_cnt = 0;
1945 $annexes = array();
1946
1947 // glossary
1948 if (count($glossary_links) > 0 && !$this->lm->isActivePreventGlossaryAppendix()) {
1949 // sort terms
1950 $terms = array();
1951
1952 foreach ($glossary_links as $key => $link) {
1953 $term = ilGlossaryTerm::_lookGlossaryTerm($link["id"]);
1954 $terms[$term . ":" . $key] = array("key" => $key, "link" => $link, "term" => $term);
1955 }
1956 $terms = ilArrayUtil::sortArray($terms, "term", "asc");
1957 //ksort($terms);
1958
1959 foreach ($terms as $t) {
1960 $link = $t["link"];
1961 $key = $t["key"];
1962
1963 try {
1964 // output definition of term
1965 $page_gui = new ilGlossaryDefPageGUI($link["id"]);
1966 $page_gui->setTemplateOutput(false);
1967 $page_gui->setOutputMode("print");
1968
1969 $tpl->setCurrentBlock("definition");
1970 $page_gui->setFileDownloadLink("#");
1971 $page_gui->setFullscreenLink("#");
1972 $page_gui->setSourcecodeDownloadScript("#");
1973 $output = $page_gui->showPage();
1974 $tpl->setVariable("VAL_DEFINITION", $output);
1975 $tpl->parseCurrentBlock();
1976
1977 // output term
1978 $tpl->setCurrentBlock("term");
1979 $tpl->setVariable(
1980 "VAL_TERM",
1981 $term = ilGlossaryTerm::_lookGlossaryTerm($link["id"])
1982 );
1983 $tpl->parseCurrentBlock();
1984 } catch (Exception $e) {
1985
1986 }
1987 }
1988
1989 // output glossary header
1990 $annex_cnt++;
1991 $tpl->setCurrentBlock("glossary");
1992 $annex_title = $this->lng->txt("cont_annex") . " " .
1993 chr(64 + $annex_cnt) . ": " . $this->lng->txt("glo");
1994 $tpl->setVariable("TXT_GLOSSARY", $annex_title);
1995 $tpl->parseCurrentBlock();
1996
1997 $annexes[] = $annex_title;
1998 }
1999
2000 // referenced images
2001 if (count($media_links) > 0) {
2002 foreach ($media_links as $media) {
2003 if (substr($media["Target"], 0, 4) == "il__") {
2004 $arr = explode("_", $media["Target"]);
2005 $id = $arr[count($arr) - 1];
2006
2007 $med_obj = new ilObjMediaObject($id);
2008 $med_item = $med_obj->getMediaItem("Standard");
2009 if (is_object($med_item)) {
2010 if (is_int(strpos($med_item->getFormat(), "image"))) {
2011 $tpl->setCurrentBlock("ref_image");
2012
2013 // image source
2014 if ($med_item->getLocationType() == "LocalFile") {
2015 $tpl->setVariable(
2016 "IMG_SOURCE",
2017 ilFileUtils::getWebspaceDir("output") . "/mobs/mm_" . $id .
2018 "/" . $med_item->getLocation()
2019 );
2020 } else {
2021 $tpl->setVariable(
2022 "IMG_SOURCE",
2023 $med_item->getLocation()
2024 );
2025 }
2026
2027 if ($med_item->getCaption() != "") {
2028 $tpl->setVariable("IMG_TITLE", $med_item->getCaption());
2029 } else {
2030 $tpl->setVariable("IMG_TITLE", $med_obj->getTitle());
2031 }
2032 $tpl->parseCurrentBlock();
2033 }
2034 }
2035 }
2036 }
2037
2038 // output glossary header
2039 $annex_cnt++;
2040 $tpl->setCurrentBlock("ref_images");
2041 $annex_title = $this->lng->txt("cont_annex") . " " .
2042 chr(64 + $annex_cnt) . ": " . $this->lng->txt("cont_ref_images");
2043 $tpl->setVariable("TXT_REF_IMAGES", $annex_title);
2044 $tpl->parseCurrentBlock();
2045
2046 $annexes[] = $annex_title;
2047 }
2048
2049 // output learning module title and toc
2050 if ($output_header) {
2051 $tpl->setCurrentBlock("print_header");
2052 $tpl->setVariable("LM_TITLE", $this->getLMPresentationTitle());
2053 if ($this->lm->getDescription() != "none") {
2054 $tpl->setVariable(
2055 "LM_DESCRIPTION",
2056 $lom_reader->firstData($lom_paths->firstDescription())->value()
2057 );
2058 }
2059 $tpl->parseCurrentBlock();
2060
2061 // output toc
2062 $nodes2 = $nodes;
2063 foreach ($nodes2 as $node2) {
2064 if ($node2["type"] == "st"
2066 $this->lm->getRefId(),
2067 $this->lm->getId(),
2068 $node2["obj_id"]
2069 )) {
2070 for ($j = 1; $j < $node2["depth"]; $j++) {
2071 $tpl->setCurrentBlock("indent");
2072 $tpl->setVariable("IMG_BLANK", ilUtil::getImagePath("browser/blank.png"));
2073 $tpl->parseCurrentBlock();
2074 }
2075 $tpl->setCurrentBlock("toc_entry");
2076 $tpl->setVariable(
2077 "TXT_TOC_TITLE",
2079 $node2["obj_id"],
2081 $this->lm->isActiveNumbering(),
2082 (bool) $this->lm_set->get("time_scheduled_page_activation"),
2083 false,
2084 0,
2085 $this->lang
2086 )
2087 );
2088 $tpl->parseCurrentBlock();
2089 }
2090 }
2091
2092 // annexes
2093 foreach ($annexes as $annex) {
2094 $tpl->setCurrentBlock("indent");
2095 $tpl->setVariable("IMG_BLANK", ilUtil::getImagePath("browser/blank.png"));
2096 $tpl->parseCurrentBlock();
2097 $tpl->setCurrentBlock("toc_entry");
2098 $tpl->setVariable("TXT_TOC_TITLE", $annex);
2099 $tpl->parseCurrentBlock();
2100 }
2101
2102 $tpl->setCurrentBlock("toc");
2103 $tpl->setVariable("TXT_TOC", $this->lng->txt("cont_toc"));
2104 $tpl->parseCurrentBlock();
2105
2106 $tpl->setCurrentBlock("print_start_block");
2107 $tpl->parseCurrentBlock();
2108 }
2109
2110 // output author information
2111 $authors = $lom_data_helper->makePresentableAsList(
2112 ", ",
2113 ...$lom_reader->allData($lom_paths->authors())
2114 );
2115 if ($authors != "") {
2116 $this->lng->loadLanguageModule("meta");
2117 $tpl->setCurrentBlock("author");
2118 $tpl->setVariable("TXT_AUTHOR", $this->lng->txt("meta_author"));
2119 $tpl->setVariable("LM_AUTHOR", $authors);
2120 $tpl->parseCurrentBlock();
2121 }
2122
2123 // output copyright information
2124 if ($lom_cp_helper->hasPresetCopyright($lom_reader)) {
2125 $copyright = $this->ui->renderer()->render(
2126 $lom_cp_helper->readPresetCopyright($lom_reader)->presentAsUIComponents()
2127 );
2128 } else {
2129 $copyright = $lom_cp_helper->readCustomCopyright($lom_reader);
2130 }
2131 if ($copyright != "") {
2132 $this->lng->loadLanguageModule("meta");
2133 $tpl->setCurrentBlock("copyright");
2134 $tpl->setVariable("TXT_COPYRIGHT", $this->lng->txt("meta_copyright"));
2135 $tpl->setVariable("LM_COPYRIGHT", $copyright);
2136 $tpl->parseCurrentBlock();
2137 }
2138 $this->tpl->setContent($tpl->get());
2139 $this->tpl->addOnLoadCode("il.Util.print();");
2140 $this->tpl->printToStdout();
2141 }
2142
2146 public function downloadFile(): void
2147 {
2148 $page_gui = $this->getLMPageGUI($this->getCurrentPageId());
2149 $page_gui->downloadFile();
2150 }
2151
2158 public function getFocusLink(
2159 int $a_ref_id,
2160 int $a_obj_id,
2161 int $a_return_ref_id
2162 ): string {
2163 return "ilias.php?baseClass=ilLMPresentationGUI&amp;ref_id=" . $a_ref_id . "&amp;obj_id=" . $a_obj_id . "&amp;focus_id=" .
2164 $a_obj_id . "&amp;focus_return=" . $a_return_ref_id;
2165 }
2166
2167 public function showMessageScreen(
2168 string $a_content
2169 ): void {
2170 // content style
2171 $this->setContentStyles();
2172
2173 $tpl = new ilTemplate("tpl.page_message_screen.html", true, true, "components/ILIAS/LearningModule");
2174 $tpl->setVariable("TXT_PAGE_NO_PUBLIC_ACCESS", $a_content);
2175
2176 $this->tpl->setVariable("PAGE_CONTENT", $tpl->get());
2177 }
2178
2182 public function showNoPublicAccess(): void
2183 {
2184 $this->showMessageScreen($this->lng->txt("msg_page_no_public_access"));
2185 }
2186
2190 public function showNoPageAccess(): void
2191 {
2192 $this->showMessageScreen($this->lng->txt("msg_no_page_access"));
2193 }
2194
2199 public function showNavRestrictionDueToQuestions(): void
2200 {
2201 $this->showMessageScreen($this->lng->txt("cont_no_page_access_unansw_q"));
2202 }
2203
2204 public function getSourcecodeDownloadLink(): string
2205 {
2206 if (!$this->offlineMode()) {
2207 return $this->ctrl->getLinkTarget($this, "");
2208 } else {
2209 return "";
2210 }
2211 }
2212
2213 public function getOfflineDirectory(): string
2214 {
2215 return $this->offline_directory;
2216 }
2217
2222 public function handleCodeParagraph(
2223 int $page_id,
2224 int $paragraph_id,
2225 string $title,
2226 string $text
2227 ): void {
2228 $directory = $this->getOfflineDirectory() . "/codefiles/" . $page_id . "/" . $paragraph_id;
2229 ilFileUtils::makeDirParents($directory);
2230 $file = $directory . "/" . $title;
2231 if (!($fp = fopen($file, "w+"))) {
2232 die("<strong>Error</strong>: Could not open \"" . $file . "\" for writing" .
2233 " in <strong>" . __FILE__ . "</strong> on line <strong>" . __LINE__ . "</strong><br />");
2234 }
2235 chmod($file, 0770);
2236 fwrite($fp, $text);
2237 fclose($fp);
2238 }
2239
2240 // #8613
2241 protected function renderPageTitle(): void
2242 {
2243 $this->tpl->setHeaderPageTitle($this->getLMPresentationTitle());
2244 }
2245
2246 public function getLMPageGUI(int $a_id): ilLMPageGUI
2247 {
2248 $concrete_lang = $this->service->getPresentationStatus()->getConcreteLang();
2249 if ($this->lang != "-" && ilPageObject::_exists("lm", $a_id, $this->lang)) {
2250 return new ilLMPageGUI($a_id, 0, false, $this->lang, $concrete_lang);
2251 }
2252 if ($this->lang != "-" && ilPageObject::_exists("lm", $a_id, $this->ot->getDefaultLanguage())) {
2253 return new ilLMPageGUI($a_id, 0, false, $this->ot->getDefaultLanguage(), $concrete_lang);
2254 }
2255 return new ilLMPageGUI($a_id, 0, false, "", $concrete_lang);
2256 }
2257
2258 public function getLMPage(
2259 int $a_id,
2260 string $a_type = ""
2261 ): ilPageObject {
2262 $type = ($a_type == "mep")
2263 ? "mep"
2264 : "lm";
2265
2267 if (!ilPageObject::_exists($type, $a_id, $lang)) {
2268 $lang = "-";
2269 if ($this->lang != "-" && ilPageObject::_exists($type, $a_id, $this->ot->getDefaultLanguage())) {
2270 $lang = $this->ot->getDefaultLanguage();
2271 }
2272 }
2273
2274 switch ($type) {
2275 case "mep":
2276 return new ilMediaPoolPage($a_id, 0, $lang);
2277 default:
2278 return new ilLMPage($a_id, 0, $lang);
2279 }
2280 }
2281
2285 public function refreshToc(): void
2286 {
2287 $exp = $this->ilTOC();
2288
2289 echo $exp->getHTML() .
2290 "<script>" . $exp->getOnLoadCode() . "</script>";
2291 exit;
2292 }
2293
2298 public function observeNoteAction(
2299 int $a_lm_id,
2300 int $a_page_id,
2301 string $a_type,
2302 string $a_action,
2303 int $a_note_id
2304 ): void {
2305 $note = $this->notes->getById($a_note_id);
2306 $text = $note->getText();
2307
2308 $notification = new ilLearningModuleNotification(
2311 $this->lm,
2312 $a_page_id,
2313 $text
2314 );
2315
2316 $notification->send();
2317 }
2318
2319 // render menu
2320 protected function renderTabs(
2321 string $active_tab,
2322 int $current_page_id
2323 ): void {
2324 $menu_editor = new ilLMMenuEditor();
2325 $menu_editor->setObjId($this->lm->getId());
2326
2327 $navigation_renderer = new ilLMMenuRendererGUI(
2328 $this->getService(),
2329 $this->tabs,
2330 $this->toolbar,
2331 $current_page_id,
2332 $active_tab,
2333 $this->getExportFormat(),
2334 $this->export_all_languages,
2335 $this->lm,
2336 $this->offlineMode(),
2337 $menu_editor,
2338 $this->lang,
2339 $this->ctrl,
2340 $this->access,
2341 $this->user,
2342 $this->lng,
2343 $this->tpl,
2344 function ($additional_content) {
2345 $this->additional_content[] = $additional_content;
2346 }
2347 );
2348 $navigation_renderer->render();
2349 }
2350
2354 public function getHTML(array $pars): string
2355 {
2356 $this->addResourceFiles();
2357 switch ($pars["cmd"]) {
2358 case "layout":
2359 $tpl = new ilTemplate("tpl.embedded_view.html", true, true, "components/ILIAS/LearningModule");
2360 $tpl->setVariable("HEAD_ACTION", $this->getHeaderAction());
2361 $tpl->setVariable("PAGE_RATING", $this->renderRating());
2362 $tpl->setVariable("PAGE", $this->getContent(true));
2363 $tpl->setVariable("COMMENTS", $this->ilLMNotes());
2364 return $tpl->get();
2365 }
2366 return "";
2367 }
2368}
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
Class handles translation mode for an object.
return true
const IL_MODE_ALIAS
const IL_MODE_OUTPUT
static addCss()
Add required css.
static addJavaScript(?ilGlobalTemplate $main_tpl=null)
Add javascript files that are necessary to run accordion.
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...
Class ilCommonActionDispatcherGUI.
static getInstanceFromAjaxCall()
(Re-)Build instance from ajax call
Class ilCtrl provides processing control methods.
static makeDirParents(string $a_dir)
Create a new directory and all parent directories.
static getWebspaceDir(string $mode="filesystem")
get webspace directory
static _getFrame(string $a_class)
special template class to simplify handling of ITX/PEAR
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static _lookGlossaryTerm(int $term_id)
get glossary term
Help GUI class.
Class ilInfoScreenGUI.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
setObjId(int $a_obj_id)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static getInstance(ilObjLearningModule $a_content_obj, int $a_id=0, bool $a_halt=true)
static _exists(int $a_id)
checks wether a lm content object with specified id exists or not
static _lookupType(int $a_obj_id, int $a_lm_id=0)
Extension of ilPageObjectGUI for learning modules.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static _getPresentationTitle(int $a_pg_id, string $a_mode=self::CHAPTER_TITLE, bool $a_include_numbers=false, bool $a_time_scheduled_activation=false, bool $a_force_content=false, int $a_lm_id=0, string $a_lang="-", bool $a_include_short=false)
presentation title doesn't have to be page title, it may be chapter title + page title or chapter tit...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Class ilLMPresentationGUI GUI class for learning module presentation.
layout(string $a_xml="main.xml", bool $doShow=true)
ilObjLearningModuleGUI $lm_gui
ilJavaScript(string $a_inline="", string $a_file="", string $a_location="")
getUnsafeGetCommands()
This method must return a list of unsafe GET commands.
initByRequest(?array $query_params=null, bool $embed_mode=false)
Init services and this class by request params.
offlineMode()
checks whether offline content generation is activated
getLMPage(int $a_id, string $a_type="")
ilLMNotes()
output notes of page
ILIAS Style Content Service $cs
ILIAS LearningModule ReadingTime ReadingTimeManager $reading_time_manager
getCurrentPageId()
Get the current page id.
renderTabs(string $active_tab, int $current_page_id)
ilGlobalTemplateInterface $tpl
ilLMPresentationService $service
getContent(bool $skip_nav=false)
showMessageScreen(string $a_content)
nop()
this dummy function is needed for offline package creation
downloadFile()
download file of file lists
ILIAS COPage Dom DomUtil $dom_util
ILIAS Style Content Object ObjectFacade $content_style_domain
getSafePostCommands()
This method must return a list of safe POST commands.
ilLMPresentationLinker $linker
getHeaderAction(bool $a_redraw=false)
showNavRestrictionDueToQuestions()
Show message if navigation to page is not allowed due to unanswered questions.
showInfoScreen()
info screen call from inside learning module
getCurrentFrameSet()
get frames of current frame set
attrib2arr(?DOMNamedNodeMap $a_attributes)
showPrintViewSelection()
show selection screen for print view
ILIAS GlobalScreen Services $global_screen
ilLMSubMenu()
output learning module submenu
setContentStyles()
Set content style.
initScreenHead(string $a_active_tab="info")
basicPageGuiInit(\ilPageObjectGUI $a_page_gui)
ILIAS Notes GUIService $notes_gui
handleCodeParagraph(int $page_id, int $paragraph_id, string $title, string $text)
store paragraph into file directory files/codefile_$pg_id_$paragraph_id/downloadtitle
determineLayout()
Determine layout.
ILIAS COPage Xsl XslManager $xsl
infoScreen()
this one is called from the info button in the repository not very nice to set cmdClass/Cmd manually,...
ILIAS Style Content GUIService $content_style_gui
getHTML(array $pars)
Get HTML (called by kiosk mode through ilCtrl)
ilNavigationHistory $nav_history
getFocusLink(int $a_ref_id, int $a_obj_id, int $a_return_ref_id)
Get focused link (used in learning objectives courses)
refreshToc()
Refresh toc (called if questions have been answered correctly)
showNoPageAccess()
Show info message, if page is not accessible in public area.
ILIAS Notes DomainService $notes
injectTemplate(ilGlobalTemplateInterface $tpl)
observeNoteAction(int $a_lm_id, int $a_page_id, string $a_type, string $a_action, int $a_note_id)
Generate new ilNote and send Notifications to the users informing that there are new comments in the ...
showNoPublicAccess()
Show info message, if page is not accessible in public area.
__construct(string $a_export_format="", bool $a_all_languages=false, string $a_export_dir="", bool $claim_repo_context=true, ?array $query_params=null, bool $embed_mode=false)
Learning module presentation linker.
Main service init and factory.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
hasPredIncorrectAnswers(int $a_obj_id, bool $a_ignore_unlock=false)
Has predecessing incorrect answers.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
language handling
loadLanguageModule(string $a_module)
Load language module.
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...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Class ilObjUserTrackingGUI.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static _getMapAreasIntLinks(int $a_mob_id)
get all internal links of map areas of a mob
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Last visited history for repository items.
This class represents a (nested) list of checkboxes (could be extended for radio items,...
static hasOptOut(int $obj_id)
Is opt out (disable notification) allowed?
static setNotification(int $type, int $user_id, int $id, bool $status=true)
Set notification status for object and user.
static hasNotification(int $type, int $user_id, int $id)
Check notification status for object and user.
static _checkPreconditionsOfPage(int $cont_ref_id, int $cont_obj_id, int $page_id)
checks whether the preconditions of a page are fulfilled or not
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static includePresentationJS(?ilGlobalTemplateInterface $a_tpl=null)
Include media object presentation JS.
static isTypeAllowed(string $a_type)
User class.
static prepareJsLinks(string $redraw_url, string $notes_url, string $tags_url, ?ilGlobalTemplateInterface $tpl=null)
Insert js/ajax links into template.
Class ilPageObjectGUI.
setStyleId(int $a_styleid)
setOutputMode(string $a_mode=self::PRESENTATION)
setOfflineDirectory(string $offdir)
setSourcecodeDownloadScript(string $script_name)
setFullscreenLink(string $a_fullscreen_link)
setFileDownloadLink(string $a_download_link)
Class ilPageObject Handles PageObjects of ILIAS Learning Modules (see ILIAS DTD)
static _exists(string $a_parent_type, int $a_id, string $a_lang="", bool $a_no_cache=false)
Checks whether page exists.
static _lookupActive(int $a_id, string $a_parent_type, bool $a_check_scheduled_activation=false, string $a_lang="-")
lookup activation status
This class represents a property form user interface.
This class represents a property in a property form.
This class represents an option in a radio group.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static resetRatingForUserAndObject(int $a_obj_id, string $a_obj_type, int $a_sub_obj_id, string $a_sub_obj_type, int $a_user_id)
Reset rating for a user and an object.
static writeRatingForUserAndObject(int $a_obj_id, string $a_obj_type, ?int $a_sub_obj_id, ?string $a_sub_obj_type, int $a_user_id, int $a_rating, int $a_category_id=0)
Write rating for a user and an object.
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 ...
Session based immediate storage.
ILIAS Setting Class.
static shortenTextExtended(string $a_str, int $a_len, bool $a_dots=false, bool $a_next_blank=false, bool $a_keep_extension=false)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static _getPresentationTitle(int $a_st_id, string $a_mode=self::CHAPTER_TITLE, bool $a_include_numbers=false, bool $a_time_scheduled_activation=false, bool $a_force_content=false, int $a_lm_id=0, string $a_lang="-", bool $a_include_short=false)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
setBackTarget(string $a_title, string $a_target, string $a_frame="")
special template class to simplify handling of ITX/PEAR
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Tree class data representation in hierachical trees using the Nested Set Model with Gaps by Joe Celco...
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 getStyleSheetLocation(string $mode="output", string $a_css_name="")
get full style sheet file name (path inclusive) of current user
static initConnection(?ilGlobalTemplateInterface $a_main_tpl=null)
Init YUI Connection module.
static initjQuery(?ilGlobalTemplateInterface $a_tpl=null)
inits and adds the jQuery JS-File to the global or a passed template
const IL_INST_ID
Definition: constants.php:40
const ANONYMOUS_USER_ID
Definition: constants.php:27
return['delivery_method'=> 'php',]
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
exit
$info
Definition: entry_point.php:21
printToString()
Use this method to get the finally rendered page as string.
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.
getOnLoadCodeForAsynch()
Get js onload code for ajax calls.
get(string $part=self::DEFAULT_BLOCK)
Renders the given block and returns the html string.
printToStdout(string $part=self::DEFAULT_BLOCK, bool $has_tabs=true, bool $skip_main_menu=false)
Interface ilAccessHandler This interface combines all available interfaces which can be called via gl...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
if(! $DIC->user() ->getId()||!ilLTIConsumerAccess::hasCustomProviderCreationAccess()) $params
Definition: ltiregstart.php:31
$service
Definition: ltiresult.php:36
$path
Definition: ltiservices.php:30
getService(string &$path)
$post
Definition: ltitoken.php:46
form( $class_path, string $cmd, string $submit_caption="")
global $lng
Definition: privfeed.php:31
global $ilSetting
Definition: privfeed.php:31
$ilErr
Definition: raiseError.php:33
if(!file_exists('../ilias.ini.php'))
global $DIC
Definition: shib_login.php:26
$GLOBALS["DIC"]
Definition: wac.php:54
$lang
Definition: xapiexit.php:25