ILIAS  trunk Revision v11.0_alpha-2638-g80c1d007f79
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;
41  protected ilLMTracker $tracker;
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;
57  protected ilSetting $settings;
59  protected ilTree $tree;
60  protected ilHelpGUI $help;
64  public ilLanguage $lng;
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;
91  protected int $requested_notification_switch = 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,
222  $embed_mode
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;
298  $lng = $this->lng;
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);
692  ilAccordionGUI::addJavaScript($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;
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 
896  if (ilNotification::hasNotification(ilNotification::TYPE_LM_PAGE, $this->user->getId(), $pg_id)) {
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() .
936  $tpl->getOnLoadCodeForAsynch();
937  }
938  }
939 
943  public function ilLMNotes(): string
944  {
945  $ilAccess = $this->access;
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(
1056  $this->linker->getLink("layout", 0, $frame_param),
1057  $frame_target,
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");
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 
2266  $lang = $this->lang;
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 }
static getWebspaceDir(string $mode="filesystem")
get webspace directory
showMessageScreen(string $a_content)
determineLayout()
Determine layout.
static _lookupActive(int $a_id, string $a_parent_type, bool $a_check_scheduled_activation=false, string $a_lang="-")
lookup activation status
static getStyleSheetLocation(string $mode="output", string $a_css_name="")
get full style sheet file name (path inclusive) of current user
This class represents an option in a radio group.
parseCurrentBlock(string $block_name=self::DEFAULT_BLOCK)
Parses the given block.
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...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
downloadFile()
download file of file lists
ilLMPresentationService $service
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
ilObjLearningModuleGUI $lm_gui
static addJavaScript(?ilGlobalTemplate $main_tpl=null)
Add javascript files that are necessary to run accordion.
const IL_INST_ID
Definition: constants.php:40
const ANONYMOUS_USER_ID
Definition: constants.php:27
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
getHeaderAction(bool $a_redraw=false)
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...
setCurrentBlock(string $part=self::DEFAULT_BLOCK)
Sets the template to the given block.
special template class to simplify handling of ITX/PEAR
getSafePostCommands()
This method must return a list of safe POST commands.
setOutputMode(string $a_mode=self::PRESENTATION)
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
hasPredIncorrectAnswers(int $a_obj_id, bool $a_ignore_unlock=false)
Has predecessing incorrect answers.
ILIAS Style Content Service $cs
Help GUI class.
Class ilPageObjectGUI.
Class handles translation mode for an object.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
setSystemStyle()
Set system style.
static getInstance(ilObjLearningModule $a_content_obj, int $a_id=0, bool $a_halt=true)
ILIAS GlobalScreen Services $global_screen
showNavRestrictionDueToQuestions()
Show message if navigation to page is not allowed due to unanswered questions.
__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)
ILIAS COPage Xsl XslManager $xsl
ILIAS Notes DomainService $notes
printToString()
Use this method to get the finally rendered page as string.
loadLanguageModule(string $a_module)
Load language module.
ILIAS COPage Dom DomUtil $dom_util
setOfflineDirectory(string $offdir)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
attrib2arr(?DOMNamedNodeMap $a_attributes)
setVariable(string $variable, $value='')
Sets the given variable to the given value.
static includePresentationJS(?ilGlobalTemplateInterface $a_tpl=null)
Include media object presentation JS.
handleCodeParagraph(int $page_id, int $paragraph_id, string $title, string $text)
store paragraph into file directory files/codefile_$pg_id_$paragraph_id/downloadtitle ...
static makeDirParents(string $a_dir)
Create a new directory and all parent directories.
initScreenHead(string $a_active_tab="info")
ilNavigationHistory $nav_history
ILIAS Style Content GUIService $content_style_gui
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.
showInfoScreen()
info screen call from inside learning module
setStyleId(int $a_styleid)
refreshToc()
Refresh toc (called if questions have been answered correctly)
$ilErr
Definition: raiseError.php:33
$path
Definition: ltiservices.php:29
ilLMSubMenu()
output learning module submenu
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...
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.
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
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.
getCurrentFrameSet()
get frames of current frame set
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 ...
initByRequest(?array $query_params=null, bool $embed_mode=false)
Init services and this class by request params.
This class represents a property in a property form.
getLMPage(int $a_id, string $a_type="")
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static addCss()
Add required css.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
$GLOBALS["DIC"]
Definition: wac.php:53
static setNotification(int $type, int $user_id, int $id, bool $status=true)
Set 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
static _exists(string $a_parent_type, int $a_id, string $a_lang="", bool $a_no_cache=false)
Checks whether page exists.
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 ...
static isTypeAllowed(string $a_type)
layout(string $a_xml="main.xml", bool $doShow=true)
static initjQuery(?ilGlobalTemplateInterface $a_tpl=null)
inits and adds the jQuery JS-File to the global or a passed template
Extension of ilPageObjectGUI for learning modules.
Class ilPageObject Handles PageObjects of ILIAS Learning Modules (see ILIAS DTD)
static _lookGlossaryTerm(int $term_id)
get glossary term
global $DIC
Definition: shib_login.php:26
setBackTarget(string $a_title, string $a_target, string $a_frame="")
offlineMode()
checks whether offline content generation is activated
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static getImagePath(string $image_name, string $module_path="", string $mode="output", bool $offline=false)
get image path (for images located in a template directory)
ilLMPresentationLinker $linker
static _getMapAreasIntLinks(int $a_mob_id)
get all internal links of map areas of a mob
setFullscreenLink(string $a_fullscreen_link)
ilJavaScript(string $a_inline="", string $a_file="", string $a_location="")
getCurrentPageId()
Get the current page id.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
setSourcecodeDownloadScript(string $script_name)
get(string $part=self::DEFAULT_BLOCK)
Renders the given block and returns the html string.
showPrintViewSelection()
show selection screen for print view
printToStdout(string $part=self::DEFAULT_BLOCK, bool $has_tabs=true, bool $skip_main_menu=false)
ILIAS Notes GUIService $notes_gui
const IL_MODE_ALIAS
Last visited history for repository items.
exit
getFocusLink(int $a_ref_id, int $a_obj_id, int $a_return_ref_id)
Get focused link (used in learning objectives courses)
ILIAS LearningModule ReadingTime ReadingTimeManager $reading_time_manager
nop()
this dummy function is needed for offline package creation
getOnLoadCodeForAsynch()
Get js onload code for ajax calls.
basicPageGuiInit(\ilPageObjectGUI $a_page_gui)
setFileDownloadLink(string $a_download_link)
showNoPageAccess()
Show info message, if page is not accessible in public area.
getUnsafeGetCommands()
This method must return a list of unsafe GET commands.
static _exists(int $a_id)
checks wether a lm content object with specified id exists or not
form( $class_path, string $cmd, string $submit_caption="")
showNoPublicAccess()
Show info message, if page is not accessible in public area.
getContent(bool $skip_nav=false)
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...
renderTabs(string $active_tab, int $current_page_id)
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&#39;t have to be page title, it may be chapter title + page title or chapter tit...
getHTML(array $pars)
Get HTML (called by kiosk mode through ilCtrl)
static prepareJsLinks(string $redraw_url, string $notes_url, string $tags_url, ?ilGlobalTemplateInterface $tpl=null)
Insert js/ajax links into template.
This class represents a (nested) list of checkboxes (could be extended for radio items, too)
global $ilSetting
Definition: privfeed.php:31
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
ilGlobalTemplateInterface $tpl
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 _lookupType(int $a_obj_id, int $a_lm_id=0)
ILIAS Style Content Object ObjectFacade $content_style_domain
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...
infoScreen()
this one is called from the info button in the repository not very nice to set cmdClass/Cmd manually...
static hasNotification(int $type, int $user_id, int $id)
Check notification status for object and user.
Session based immediate storage.
const IL_MODE_OUTPUT
$info
Definition: entry_point.php:21
static _getFrame(string $a_class)
ilLMNotes()
output notes of page
setSubObject(?string $sub_obj_type, ?int $sub_obj_id)
Set sub object attributes.
$post
Definition: ltitoken.php:46
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Class ilObjUserTrackingGUI.
static initConnection(?ilGlobalTemplateInterface $a_main_tpl=null)
Init YUI Connection module.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Class ilCommonActionDispatcherGUI.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static getInstanceFromAjaxCall()
(Re-)Build instance from ajax call
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
setContentStyles()
Set content style.
Main service init and factory.
injectTemplate(ilGlobalTemplateInterface $tpl)
static sortArray(array $array, string $a_array_sortby_key, string $a_array_sortorder="asc", bool $a_numeric=false, bool $a_keep_keys=false)
static hasOptOut(int $obj_id)
Is opt out (disable notification) allowed?