ILIAS  release_9 Revision v9.13-25-g2c18ec4c24f
class.ilPageObjectGUI.php
Go to the documentation of this file.
1 <?php
2 
21 
34 {
35  public const PRESENTATION = "presentation";
36  public const EDIT = "edit";
37  public const PREVIEW = "preview";
38  public const OFFLINE = "offline";
39  public const PRINTING = "print";
40  protected \ILIAS\TestQuestionPool\QuestionInfoService $questioninfo;
41  protected \ILIAS\COPage\Page\PageManager $pm;
42  protected \ILIAS\COPage\Link\LinkManager $link;
43  protected \ILIAS\COPage\InternalGUIService $gui;
44  protected \ILIAS\COPage\PC\PCDefinition $pc_definition;
45  protected \ILIAS\COPage\Xsl\XslManager $xsl;
46  protected \ILIAS\COPage\Editor\GUIService $editor_gui;
47  protected \ILIAS\Notes\Service $notes;
48  protected int $requested_ref_id;
49  protected int $requested_pg_id;
50  protected string $requested_file_id;
51  protected string $requested_transl;
52  protected int $requested_old_nr;
55  protected string $exp_target_script = "";
56  protected string $exp_id = "";
57  protected string $exp_frame = "";
58  protected string $act_meth = "";
59  protected object $act_obj;
60  public string $page_back_title = "";
61  protected int $notes_parent_id = 0;
63  protected int $styleid = 0;
64  protected bool $enabledpagefocus;
65  protected string $link_xml;
66  protected int $old_nr = 0;
67 
68  protected int $id;
69  protected string $language;
71  protected ilLanguage $lng;
72  protected ilCtrl $ctrl;
73  protected ilTabsGUI $tabs_gui;
75  protected ilLogger $log;
76  protected ilObjUser $user;
77  protected ilHelpGUI $help;
79  protected string $output_mode = "";
80  public string $presentation_title = "";
81  public string $target_script = "";
82  public string $return_location = "";
83  public string $target_var = "";
84  public string $template_output_var = "";
85  public bool $output2template = false;
86  public string $link_params = "";
87  public string $sourcecode_download_script = "";
88  public bool $change_comments = false;
89  public bool $activation = false;
90  public bool $activated = true;
91  public bool $editpreview = false;
92  public bool $use_meta_data = false;
93  public ?ilObject $meta_data_rep_obj = null;
94  public int $meta_data_sub_obj_id = 0;
95  public string $meta_data_type = "";
96  public ?object $meta_data_observer_obj = null;
97  public string $meta_data_observer_func = "";
98  public bool $link_xml_set = false;
99  public bool $enableediting = true;
100  public bool $rawpagecontent = false;
101  public bool $enabledcontentincludes = false;
102  public bool $compare_mode = false;
103  public ?ilPageConfig $page_config = null;
104  public bool $tabs_enabled = true;
105  public bool $render_page_container = false;
106  private bool $abstract_only = false;
107  protected string $parent_type = "";
108  protected string $file_download_link = '';
109  protected string $fullscreen_link = '';
110  protected string $link_frame = '';
111  protected \ILIAS\GlobalScreen\ScreenContext\ContextServices $tool_context;
112  public string $pl_start = "{{{{{";
113  public string $pl_end = "}}}}}";
114  protected \ILIAS\DI\UIServices $ui;
115  protected \ILIAS\COPage\PageLinker $page_linker;
116  protected string $abstract_pcid = ""; // pcid of single paragraph
118  protected string $open_place_holder = "";
119  protected int $requested_user_id = 0;
120  protected int $requested_q_id = 0;
121  protected int $requested_history_mode = 0;
122  protected bool $enabled_news = false;
123  protected int $news_obj_id = 0;
124  protected string $news_obj_type = "";
125  protected ?array $tab_hook = null;
126  protected string $view_page_link = "";
127  protected string $view_page_target = "";
128  protected string $offline_directory = "";
129  protected bool $notes_enabled = false;
130  protected string $prependinghtml = "";
131  protected string $header = "";
132  protected string $int_link_return = "";
133  protected bool $enabled_href = true;
134  // $adv_ref_id - $adv_type - $adv_subtype:
135  // Object, that defines the adv md records being used.
136  protected ?int $adv_ref_id = null;
137  protected ?string $adv_type = null;
138  protected ?string $adv_subtype = null;
139  protected string $concrete_lang = "";
140  protected string $profile_back_url = "";
141 
143  protected \ILIAS\COPage\Compare\PageCompare $compare;
144 
152  public function __construct(
153  string $a_parent_type,
154  int $a_id,
155  int $a_old_nr = 0,
156  bool $a_prevent_get_id = false,
157  string $a_lang = "",
158  string $concrete_lang = ""
159  ) {
160  global $DIC;
161 
162  $this->log = ilLoggerFactory::getLogger('copg');
163  $this->tpl = $DIC->ui()->mainTemplate();
164  $this->ctrl = $DIC->ctrl();
165  $this->lng = $DIC->language();
166  $this->tabs_gui = $DIC->tabs();
167  $this->access = $DIC->access();
168  $this->user = $DIC->user();
169  $this->help = $DIC["ilHelp"];
170  $this->ui = $DIC->ui();
171  $this->toolbar = $DIC->toolbar();
172  $this->component_factory = $DIC["component.factory"];
173 
174  $this->request = $DIC
175  ->copage()
176  ->internal()
177  ->gui()
178  ->page()
179  ->editRequest();
180 
181  $this->questioninfo = $DIC->testQuestionPool()->questionInfo();
182 
183  $this->requested_old_nr = $this->request->getInt("old_nr");
184  $this->requested_transl = $this->request->getString("transl");
185  $this->requested_file_id = $this->request->getString("file_id");
186  $this->requested_ref_id = $this->request->getInt("ref_id");
187  $this->requested_pg_id = $this->request->getInt("pg_id");
188  $this->concrete_lang = $concrete_lang;
189 
190  $this->setParentType($a_parent_type);
191  $this->setId($a_id);
192  if ($a_old_nr == 0 && !$a_prevent_get_id && $this->requested_old_nr > 0) {
193  $a_old_nr = $this->requested_old_nr;
194  }
195  $this->setOldNr($a_old_nr);
196 
197  if ($a_lang == "" && $this->requested_transl != '') {
198  $this->setLanguage($this->requested_transl);
199  } else {
200  if ($a_lang == "") {
201  $a_lang = "-";
202  }
203  $this->setLanguage($a_lang);
204  }
205 
206 
207  $this->setOutputMode(self::PRESENTATION);
208  $this->setEnabledPageFocus(true);
209  $this->initPageObject();
210  $this->setPageConfig($this->getPageObject()->getPageConfig());
211 
212  $this->page_linker = new ilPageLinker(get_class($this));
213 
214  $this->output2template = true;
215 
216  $this->template_output_var = "PAGE_CONTENT";
217  $this->change_comments = false;
218  $this->page_back_title = $this->lng->txt("page");
219  $this->lng->loadLanguageModule("content");
220  $this->lng->loadLanguageModule("copg");
221 
222  $this->tool_context = $DIC->globalScreen()->tool()->context();
223 
224  $this->setTemplateOutput(false);
225 
226  $this->ctrl->saveParameter($this, "transl");
227 
228 
229  $this->requested_user_id = $this->request->getInt("user");
230  $this->requested_q_id = $this->request->getInt("q_id");
231  $this->requested_history_mode = $this->request->getInt("history_mode");
232 
233  $int_service = $DIC
234  ->copage()
235  ->internal();
236 
237  $this->edit_repo = $int_service
238  ->repo()
239  ->edit();
240 
241  $this->afterConstructor();
242  $this->xsl = $int_service->domain()->xsl();
243  $this->compare = $int_service->domain()->compare();
244  $this->pc_definition = $DIC
245  ->copage()
246  ->internal()
247  ->domain()
248  ->pc()
249  ->definition();
250  $this->gui = $DIC->copage()->internal()->gui();
251  $this->link = $DIC->copage()->internal()->domain()->link();
252  $this->pm = $DIC->copage()->internal()->domain()->page();
253  $this->editor_gui = $DIC->copage()->internal()->gui()->edit();
254  $this->notes = $DIC->notes();
255  }
256 
257  public function setTemplate(ilGlobalTemplateInterface $main_tpl): void
258  {
259  $this->tpl = $main_tpl;
260  }
261 
262  public function afterConstructor(): void
263  {
264  }
265 
270  public function setAdvMdRecordObject(
271  int $a_adv_ref_id,
272  string $a_adv_type,
273  string $a_adv_subtype = "-"
274  ): void {
275  $this->adv_ref_id = $a_adv_ref_id;
276  $this->adv_type = $a_adv_type;
277  $this->adv_subtype = $a_adv_subtype;
278  }
279 
283  public function getAdvMdRecordObject(): ?array
284  {
285  if ($this->adv_type === null) {
286  return null;
287  }
289  }
290 
294  final protected function initPageObject(): void
295  {
297  $this->getParentType(),
298  $this->getId(),
299  $this->getOldNr(),
300  $this->getLanguage()
301  );
302  $page->setConcreteLang($this->concrete_lang);
303  $this->setPageObject($page);
304  }
305 
306  public function setParentType(string $a_val): void
307  {
308  $this->parent_type = $a_val;
309  }
310 
311  public function getParentType(): string
312  {
313  return $this->parent_type;
314  }
315 
316  public function setId(int $a_val): void
317  {
318  $this->id = $a_val;
319  }
320 
321  public function getId(): int
322  {
323  return $this->id;
324  }
325 
329  public function setOldNr(int $a_val): void
330  {
331  $this->old_nr = $a_val;
332  }
333 
334  public function getOldNr(): int
335  {
336  return $this->old_nr;
337  }
338 
339  public function setLanguage(string $a_val): void
340  {
341  $this->language = $a_val;
342  }
343 
344  public function getLanguage(): string
345  {
346  if ($this->language == "") {
347  return "-";
348  }
349 
350  return $this->language;
351  }
352 
353  public function setEnablePCType(
354  string $a_pc_type,
355  bool $a_val
356  ): void {
357  $this->getPageConfig()->setEnablePCType($a_pc_type, $a_val);
358  }
359 
360  public function getEnablePCType(string $a_pc_type): bool
361  {
362  return $this->getPageConfig()->getEnablePCType($a_pc_type);
363  }
364 
365  public function setPageConfig(ilPageConfig $a_val): void
366  {
367  $this->page_config = $a_val;
368  }
369 
370  public function getPageConfig(): ilPageConfig
371  {
372  return $this->page_config;
373  }
374 
375  public function setPageObject(ilPageObject $a_pg_obj): void
376  {
377  $this->obj = $a_pg_obj;
378  }
379 
380  public function getPageObject(): ilPageObject
381  {
382  return $this->obj;
383  }
384 
388  public function setOutputMode(
389  string $a_mode = self::PRESENTATION
390  ): void {
391  $this->output_mode = $a_mode;
392  }
393 
394  public function getOutputMode(): string
395  {
396  return $this->output_mode;
397  }
398 
399  public function setTemplateOutput(bool $a_output = true): void
400  {
401  $this->output2template = $a_output;
402  }
403 
404  public function outputToTemplate(): bool
405  {
406  return $this->output2template;
407  }
408 
409  public function setPresentationTitle(string $a_title = ""): void
410  {
411  $this->presentation_title = $a_title;
412  }
413 
414  public function getPresentationTitle(): string
415  {
417  }
418 
419  public function setHeader(string $a_title = ""): void
420  {
421  $this->header = $a_title;
422  }
423 
424  public function getHeader(): string
425  {
426  return $this->header;
427  }
428 
429  public function setLinkParams(string $l_params = ""): void
430  {
431  $this->link_params = $l_params;
432  }
433 
434  public function getLinkParams(): string
435  {
436  return $this->link_params;
437  }
438 
439  public function setLinkFrame(string $l_frame = ""): void
440  {
441  $this->link_frame = $l_frame;
442  }
443 
444  public function getLinkFrame(): string
445  {
446  return $this->link_frame;
447  }
448 
449  public function setPageLinker(\ILIAS\COPage\PageLinker $page_linker): void
450  {
451  $this->page_linker = $page_linker;
452  }
453 
454  public function getLinkXML(): string
455  {
456  return $this->link_xml;
457  }
458 
459  public function setQuestionHTML(array $question_html): void
460  {
461  $this->getPageConfig()->setQuestionHTML($question_html);
462  }
463 
464  public function getQuestionHTML(): array
465  {
466  return $this->getPageConfig()->getQuestionHTML();
467  }
468 
469  public function setTemplateTargetVar(string $a_variable): void
470  {
471  $this->target_var = $a_variable;
472  }
473 
474  public function getTemplateTargetVar(): string
475  {
476  return $this->target_var;
477  }
478 
479  public function getTemplateOutputVar(): string
480  {
482  }
483 
484  public function setSourcecodeDownloadScript(string $script_name): void
485  {
486  $this->sourcecode_download_script = $script_name;
487  }
488 
489  public function getSourcecodeDownloadScript(): string
490  {
492  }
493 
494  public function setTabs(ilTabsGUI $a_tabs): void
495  {
496  $this->tabs_gui = $a_tabs;
497  }
498 
499  public function setPageBackTitle(string $a_title): void
500  {
501  $this->page_back_title = $a_title;
502  }
503 
504  public function setFileDownloadLink(string $a_download_link): void
505  {
506  $this->file_download_link = $a_download_link;
507  }
508 
509  public function getFileDownloadLink(): string
510  {
512  }
513 
514  public function setFullscreenLink(string $a_fullscreen_link): void
515  {
516  $this->fullscreen_link = $a_fullscreen_link;
517  }
518 
519  public function getFullscreenLink(): string
520  {
521  return $this->fullscreen_link;
522  }
523 
524  public function setIntLinkReturn(string $a_return): void
525  {
526  $this->int_link_return = $a_return;
527  }
528 
529  public function enableChangeComments(bool $a_enabled): void
530  {
531  $this->change_comments = $a_enabled;
532  }
533 
534  public function isEnabledChangeComments(): bool
535  {
536  return $this->change_comments;
537  }
538 
539  public function enableNotes(bool $a_enabled, int $a_parent_id): void
540  {
541  $this->notes_enabled = $a_enabled;
542  $this->notes_parent_id = $a_parent_id;
543  }
544 
545  public function isEnabledNotes(): bool
546  {
547  return $this->notes_enabled;
548  }
549 
553  public function setOfflineDirectory(string $offdir): void
554  {
555  $this->offline_directory = $offdir;
556  }
557 
558  public function getOfflineDirectory(): string
559  {
561  }
562 
563 
567  public function setViewPageLink(string $a_link, string $a_target = ""): void
568  {
569  $this->view_page_link = $a_link;
570  $this->view_page_target = $a_target;
571  }
572 
573  public function getViewPageLink(): string
574  {
575  return $this->view_page_link;
576  }
577 
578  public function getViewPageTarget(): string
579  {
581  }
582 
583  public function getViewPageText(): string
584  {
585  return $this->lng->txt("cont_presentation_view");
586  }
587 
588  public function setActivationListener(
589  object $a_obj,
590  string $a_meth
591  ): void {
592  $this->act_obj = $a_obj;
593  $this->act_meth = $a_meth;
594  }
595 
596  public function setEnabledNews(
597  bool $a_enabled,
598  int $a_news_obj_id = 0,
599  string $a_news_obj_type = ""
600  ): void {
601  $this->enabled_news = $a_enabled;
602  $this->news_obj_id = $a_news_obj_id;
603  $this->news_obj_type = $a_news_obj_type;
604  }
605 
606  public function getEnabledNews(): bool
607  {
608  return $this->enabled_news;
609  }
610 
611  public function setTabHook(
612  object $a_object,
613  string $a_function
614  ): void {
615  $this->tab_hook = array("obj" => $a_object, "func" => $a_function);
616  }
617 
621  public function setEditPreview(
622  bool $a_editpreview
623  ): void {
624  $this->editpreview = $a_editpreview;
625  }
626 
627  public function getEditPreview(): bool
628  {
629  return $this->editpreview;
630  }
631 
632  public function setEnabledTabs(bool $a_enabledtabs): void
633  {
634  $this->tabs_enabled = $a_enabledtabs;
635  }
636 
637  public function getEnabledTabs(): bool
638  {
639  return $this->tabs_enabled;
640  }
641 
642  public function setEnabledPageFocus(bool $a_enabledpagefocus): void
643  {
644  $this->enabledpagefocus = $a_enabledpagefocus;
645  }
646 
647  public function setOpenPlaceHolder(string $a_val): void
648  {
649  $this->open_place_holder = $a_val;
650  }
651 
652  public function getOpenPlaceHolder(): string
653  {
655  }
656 
657  public function getEnabledPageFocus(): bool
658  {
660  }
661 
662  public function setPrependingHtml(string $a_prependinghtml): void
663  {
664  $this->prependinghtml = $a_prependinghtml;
665  }
666 
667  public function getPrependingHtml(): string
668  {
669  return $this->prependinghtml;
670  }
671 
672  public function setEnableEditing(bool $a_enableediting): void
673  {
674  $this->enableediting = $a_enableediting;
675  }
676 
677  public function getEnableEditing(): bool
678  {
679  return $this->enableediting;
680  }
681 
685  public function setRawPageContent(bool $a_rawpagecontent): void
686  {
687  $this->rawpagecontent = $a_rawpagecontent;
688  }
689 
690  public function getRawPageContent(): bool
691  {
692  return $this->rawpagecontent;
693  }
694 
695  public function setStyleId(int $a_styleid): void
696  {
697  $this->styleid = $a_styleid;
698  }
699 
700  public function getStyleId(): int
701  {
702  return $this->styleid;
703  }
704 
705  public function setCompareMode(bool $a_val): void
706  {
707  $this->compare_mode = $a_val;
708  }
709 
710  public function getCompareMode(): bool
711  {
712  return $this->compare_mode;
713  }
714 
718  public function setAbstractOnly(
719  bool $a_val,
720  string $pcid = ""
721  ): void {
722  $this->abstract_only = $a_val;
723  $this->abstract_pcid = $pcid;
724  }
725 
726  public function getAbstractOnly(): bool
727  {
728  return $this->abstract_only;
729  }
730 
731  public function setRenderPageContainer(bool $a_val): void
732  {
733  $this->render_page_container = $a_val;
734  }
735 
736  public function getRenderPageContainer(): bool
737  {
739  }
740 
741  public function getDisabledText(): string
742  {
743  return $this->lng->txt("inactive");
744  }
745 
746  public function getEnabledHref(): bool
747  {
748  return $this->enabled_href;
749  }
750 
751  public function setEnabledHref(bool $enable): void
752  {
753  $this->enabled_href = $enable;
754  }
755 
764  public function activateMetaDataEditor(
765  ilObject $a_rep_obj,
766  string $a_type,
767  int $a_sub_obj_id,
768  object $a_observer_obj = null,
769  string $a_observer_func = ""
770  ): void {
771  $this->use_meta_data = true;
772  $this->meta_data_rep_obj = $a_rep_obj;
773  $this->meta_data_sub_obj_id = $a_sub_obj_id;
774  $this->meta_data_type = $a_type;
775  $this->meta_data_observer_obj = $a_observer_obj;
776  $this->meta_data_observer_func = $a_observer_func;
777  }
778 
779  public function determineFileDownloadLink(): string
780  {
781  $file_download_link = $this->getFileDownloadLink();
782  if ($this->getFileDownloadLink() == "" && $this->getOutputMode() != "offline") {
783  $file_download_link = $this->ctrl->getLinkTarget($this, "downloadFile");
784  }
785  return $file_download_link;
786  }
787 
788  public function determineFullscreenLink(): string
789  {
790  $fullscreen_link = $this->getFullscreenLink();
791  if ($this->getFullscreenLink() == "" && $this->getOutputMode() != "offline") {
792  $fullscreen_link = $this->ctrl->getLinkTarget($this, "displayMediaFullscreen", "", false, false);
793  }
794  return $fullscreen_link;
795  }
796 
797  public function determineSourcecodeDownloadScript(): string
798  {
800  if ($this->sourcecode_download_script == "" && $this->getOutputMode() != "offline") {
801  $l = $this->ctrl->getLinkTarget($this, "");
802  }
803  return $l;
804  }
805 
809  public function getComponentPluginsXML(): string
810  {
811  $xml = "";
812  if ($this->getOutputMode() == "edit") {
813  foreach ($this->component_factory->getActivePluginsInSlot("pgcp") as $plugin) {
814  if ($plugin->isValidParentType($this->getPageObject()->getParentType())) {
815  $xml .= '<ComponentPlugin Name="' . $plugin->getPluginName() .
816  '" InsertText="' . $plugin->txt(ilPageComponentPlugin::TXT_CMD_INSERT) . '" />';
817  }
818  }
819  }
820  if ($xml != "") {
821  $xml = "<ComponentPlugins>" . $xml . "</ComponentPlugins>";
822  }
823  return $xml;
824  }
825 
826 
830  public function executeCommand(): string
831  {
832  $ret = "";
833  $next_class = $this->ctrl->getNextClass($this);
834  if ($next_class !== "") {
835  $this->ctrl->setReturn($this, "edit");
836  }
837  $this->log->debug("next_class: " . $next_class);
838  if ($next_class == "" && $this->ctrl->getCmd() == "edit") {
839  $this->tabs_gui->clearTargets();
840  } else {
841  $this->getTabs();
842  }
843 
844 
845  switch ($next_class) {
846  case 'ilobjectmetadatagui':
847  $this->setBackToEditTabs();
848  $md_gui = new ilObjectMetaDataGUI($this->meta_data_rep_obj, $this->meta_data_type, $this->meta_data_sub_obj_id);
849  if (is_object($this->meta_data_observer_obj)) {
850  $md_gui->addMDObserver(
851  $this->meta_data_observer_obj,
852  $this->meta_data_observer_func,
853  "General"
854  );
855  }
856  // set adv metadata record dobject
857  if ($this->adv_type != "") {
858  $md_gui->setAdvMdRecordObject($this->adv_ref_id, $this->adv_type, $this->adv_subtype);
859  }
860  $this->ctrl->forwardCommand($md_gui);
861  break;
862 
863  case "ileditclipboardgui":
864  $this->setBackToEditTabs();
865  $clip_gui = new ilEditClipboardGUI();
866  $clip_gui->setPageBackTitle($this->page_back_title);
867  $ret = $this->ctrl->forwardCommand($clip_gui);
868  break;
869 
870  // notes
871  case "ilnotegui":
872  case "ilcommentgui":
873  $html = $this->edit();
874  $this->tabs_gui->setTabActive("edit");
875  return $html;
876 
877  case 'ilpublicuserprofilegui':
878  $profile_gui = new ilPublicUserProfileGUI($this->requested_user_id);
879  $ret = $this->ctrl->forwardCommand($profile_gui);
880  break;
881 
882  case "ilpageeditorgui":
883  $this->setEditorToolContext();
884 
885  if (!$this->getEnableEditing()) {
886  $this->tpl->setOnScreenMessage('failure', $this->lng->txt("permission_denied"), true);
887  $this->ctrl->redirect($this, "preview");
888  }
889  $page_editor = new ilPageEditorGUI($this->getPageObject(), $this);
890  $page_editor->setHeader($this->getHeader());
891  $page_editor->setPageBackTitle($this->page_back_title);
892  $page_editor->setIntLinkReturn($this->int_link_return);
893  //$page_editor->executeCommand();
894  $ret = $this->ctrl->forwardCommand($page_editor);
895  break;
896 
897  case 'ilnewsitemgui':
898  $news_item_gui = new ilNewsItemGUI();
899  $news_item_gui->setEnableEdit(true);
900  $news_item_gui->setContextObjId($this->news_obj_id);
901  $news_item_gui->setContextObjType($this->news_obj_type);
902  $news_item_gui->setContextSubObjId($this->obj->getId());
903  $news_item_gui->setContextSubObjType("pg");
904 
905  $ret = $this->ctrl->forwardCommand($news_item_gui);
906  break;
907 
908  case "ilpropertyformgui":
909  $form = $this->initOpenedContentForm();
910  $this->ctrl->forwardCommand($form);
911  break;
912 
913  case "ilinternallinkgui":
914  $this->lng->loadLanguageModule("content");
915  $link_gui = new ilInternalLinkGUI("Media_Media", 0);
916 
917  $link_gui->filterLinkType("PageObject_FAQ");
918  $link_gui->filterLinkType("GlossaryItem");
919  $link_gui->filterLinkType("Media_Media");
920  $link_gui->filterLinkType("Media_FAQ");
921 
922  $link_gui->setFilterWhiteList(true);
923  $this->ctrl->forwardCommand($link_gui);
924  break;
925 
926  case "ilquestioneditgui":
927  $this->setQEditTabs("question");
928  $edit_gui = new ilQuestionEditGUI();
929  $edit_gui->setPageConfig($this->getPageConfig());
930  $edit_gui->setSelfAssessmentEditingMode(true);
931  $ret = $this->ctrl->forwardCommand($edit_gui);
932  $this->tpl->setContent($ret);
933  break;
934 
935  case 'ilassquestionfeedbackeditinggui':
936 
938 
939  // set tabs
940  $this->setQEditTabs("feedback");
941 
942  // load required lang mods
943  $this->lng->loadLanguageModule("assessment");
944 
945  // set context tabs
946  $questionGUI = assQuestionGUI::_getQuestionGUI(
947  $this->questioninfo->getQuestionType(
948  $this->requested_q_id
949  ),
951  );
952  $questionGUI->object->setObjId(0);
953  $questionGUI->object->setSelfAssessmentEditingMode(true);
954  $questionGUI->object->setPreventRteUsage($this->getPageConfig()->getPreventRteUsage());
955 
956  // forward to ilAssQuestionFeedbackGUI
957  $gui = new ilAssQuestionFeedbackEditingGUI($questionGUI, $this->ctrl, $this->access, $this->tpl, $this->tabs_gui, $this->lng);
958  $this->ctrl->forwardCommand($gui);
959  break;
960 
961 
962  case 'ilLearninghistorygui':
963  $user_id = null;
964  if ($this->getPageObject()->getParentType() == "prtf") {
965  $user_id = ilObject::_lookupOwner($this->getPageObject()->getPortfolioId());
966  }
967  $hist_gui = new ilLearningHistoryGUI();
968  $hist_gui->setUserId($user_id);
969  $this->ctrl->forwardCommand($hist_gui);
970  break;
971 
972  default:
973  $cmd = $this->ctrl->getCmd("preview");
974  // presentation view
975  if ($this->getViewPageLink() != "" && $cmd != "edit") {
976  $this->tabs_gui->addNonTabbedLink(
977  "pres_view",
978  $this->getViewPageText(),
979  $this->getViewPageLink(),
980  $this->getViewPageTarget()
981  );
982  }
983  $ret = $this->$cmd();
984  if ($this->getOutputMode() == self::PREVIEW && $cmd == "preview") {
985  $this->showEditToolbar();
986  }
987  break;
988  }
989  //echo "+$ret+";
990  return (string) $ret;
991  }
992 
996  public function setQEditTabs(string $a_active): void
997  {
998  $this->tabs_gui->clearTargets();
999 
1000  $this->tabs_gui->setBackTarget(
1001  $this->lng->txt("back"),
1002  $this->ctrl->getLinkTarget($this, "edit")
1003  );
1004 
1005  $this->ctrl->setParameterByClass("ilquestioneditgui", "q_id", $this->requested_q_id);
1006  $this->tabs_gui->addTab(
1007  "question",
1008  $this->lng->txt("question"),
1009  $this->ctrl->getLinkTargetByClass("ilquestioneditgui", "editQuestion")
1010  );
1011 
1012  $this->ctrl->setParameterByClass("ilAssQuestionFeedbackEditingGUI", "q_id", $this->requested_q_id);
1013  $this->tabs_gui->addTab(
1014  "feedback",
1015  $this->lng->txt("feedback"),
1016  $this->ctrl->getLinkTargetByClass("ilAssQuestionFeedbackEditingGUI", ilAssQuestionFeedbackEditingGUI::CMD_SHOW)
1017  );
1018 
1019  $this->tabs_gui->activateTab($a_active);
1020  }
1021 
1022  public function onFeedbackEditingForwarding(): void
1023  {
1024  }
1025 
1026  public function deactivatePage(): void
1027  {
1028  $this->getPageObject()->setActivationStart(null);
1029  $this->getPageObject()->setActivationEnd(null);
1030  $this->getPageObject()->setActive(false);
1031  $this->getPageObject()->update();
1032  $this->ctrl->redirect($this, "edit");
1033  }
1034 
1035  public function activatePage(): void
1036  {
1037  $this->getPageObject()->setActivationStart(null);
1038  $this->getPageObject()->setActivationEnd(null);
1039  $this->getPageObject()->setActive(true);
1040  $this->getPageObject()->update();
1041  $this->ctrl->redirect($this, "edit");
1042  }
1043 
1047  protected function showEditToolbar(): void
1048  {
1049  $ui = $this->ui;
1050  $lng = $this->lng;
1051  if ($this->getEnableEditing()) {
1052  $b = $ui->factory()->button()->standard(
1053  $lng->txt("edit_page"),
1054  $this->ctrl->getLinkTarget($this, "edit")
1055  );
1056  $this->toolbar->addComponent($b);
1057  }
1058  }
1059 
1063  public function showPage(): string
1064  {
1065  $main_tpl = $this->tpl;
1066  $sn_arr = [];
1067 
1068  $sel_js_mode = '';
1069  $paragraph_plugin_string = '';
1070  $disable_auto_margins = '';
1071 
1072  // jquery and jquery ui are always provided for components
1075 
1076  // $this->initSelfAssessmentRendering();
1078 
1079  $main_tpl->addJavaScript("./Services/COPage/js/ilCOPagePres.js");
1080 
1081  // needed for overlays in iim
1082  ilOverlayGUI::initJavascript();
1083 
1085 
1086  // init template
1087  if ($this->getOutputMode() == "edit") {
1088  $this->initEditing();
1089  if (!$this->getPageObject()->getEditLock()) {
1090  return "";
1091  }
1092 
1093  $this->getPageObject()->buildDom();
1094 
1095  $this->log->debug("ilPageObjectGUI, showPage() in edit mode.");
1096 
1097  $tpl = new ilTemplate("tpl.page_edit_wysiwyg.html", true, true, "Services/COPage");
1098  // to do: status dependent class
1099  $tpl->setVariable("CLASS_PAGE_TD", "ilc_Page");
1100 
1101  // user comment
1102  if ($this->isEnabledChangeComments()) {
1103  $tpl->setCurrentBlock("change_comment");
1104  $tpl->setVariable("TXT_ADD_COMMENT", $this->lng->txt("cont_add_change_comment"));
1105  $tpl->parseCurrentBlock();
1106  }
1107 
1108  if ($this->getPageConfig()->getUsePageContainer()) {
1109  $tpl->setVariable("PAGE_CONTAINER_CLASS", "ilc_page_cont_PageContainer");
1110  }
1111 
1112  $tpl->setVariable(
1113  "WYSIWYG_ACTION",
1114  $this->ctrl->getFormActionByClass("ilpageeditorgui", "", "", true)
1115  );
1116 
1117  // determine media, html and javascript mode
1118  $sel_js_mode = "enable";
1119 
1120  // show prepending html
1121  $tpl->setVariable("PREPENDING_HTML", $this->getPrependingHtml());
1122 
1123 
1124  // get js files for JS enabled editing
1125  if ($sel_js_mode == "enable") {
1126  // add int link parts
1127  $tpl->setCurrentBlock("int_link_prep");
1128  $tpl->setVariable("INT_LINK_PREP", ilInternalLinkGUI::getInitHTML(
1129  $this->ctrl->getLinkTargetByClass(
1130  array("ilpageeditorgui", "ilinternallinkgui"),
1131  "",
1132  false,
1133  true,
1134  false
1135  )
1136  ));
1137  $tpl->parseCurrentBlock();
1138 
1139  $this->editor_gui->init()->initUI($main_tpl);
1140  }
1141  } else {
1142  // presentation or preview here
1143 
1144  $tpl = new ilTemplate("tpl.page.html", true, true, "Services/COPage");
1145  if ($this->getEnabledPageFocus()) {
1146  $tpl->touchBlock("page_focus");
1147  }
1148  // presentation
1149  if ($this->isPageContainerToBeRendered()) {
1150  $tpl->touchBlock("page_container_1");
1151  $tpl->touchBlock("page_container_2");
1152  $tpl->touchBlock("page_container_3");
1153  }
1154 
1155  // history
1156  $c_old_nr = $this->getPageObject()->old_nr;
1157  if ($c_old_nr > 0 || $this->getCompareMode() || ($this->requested_history_mode == 1)) {
1158  $hist_info =
1159  $this->getPageObject()->getHistoryInfo($c_old_nr);
1160 
1161  if (!$this->getCompareMode()) {
1162  $this->ctrl->setParameter($this, "history_mode", "1");
1163 
1164  // previous revision
1165  if (isset($hist_info["previous"])) {
1166  $tpl->setCurrentBlock("previous_rev");
1167  $tpl->setVariable("TXT_PREV_REV", $this->lng->txt("cont_previous_rev"));
1168  $this->ctrl->setParameter($this, "old_nr", $hist_info["previous"]["nr"]);
1169  $tpl->setVariable(
1170  "HREF_PREV",
1171  $this->ctrl->getLinkTarget($this, "preview")
1172  );
1173  } else {
1174  $tpl->setCurrentBlock("previous_rev_disabled");
1175  $tpl->setVariable("TXT_PREV_REV", $this->lng->txt("cont_previous_rev"));
1176  }
1177  $tpl->parseCurrentBlock();
1178 
1179  // next revision
1180  if ($c_old_nr > 0) {
1181  $tpl->setCurrentBlock("next_rev");
1182  $tpl->setVariable("TXT_NEXT_REV", $this->lng->txt("cont_next_rev"));
1183  $this->ctrl->setParameter($this, "old_nr", $hist_info["next"]["nr"] ?? 0);
1184  $tpl->setVariable(
1185  "HREF_NEXT",
1186  $this->ctrl->getLinkTarget($this, "preview")
1187  );
1188  $tpl->parseCurrentBlock();
1189 
1190  // latest revision
1191  $tpl->setCurrentBlock("latest_rev");
1192  $tpl->setVariable("TXT_LATEST_REV", $this->lng->txt("cont_latest_rev"));
1193  $this->ctrl->setParameter($this, "old_nr", "");
1194  $tpl->setVariable(
1195  "HREF_LATEST",
1196  $this->ctrl->getLinkTarget($this, "preview")
1197  );
1198  $tpl->parseCurrentBlock();
1199  }
1200 
1201  $this->ctrl->setParameter($this, "history_mode", "");
1202 
1203  // rollback
1204  if ($c_old_nr > 0 && $this->user->getId() != ANONYMOUS_USER_ID) {
1205  $tpl->setCurrentBlock("rollback");
1206  $this->ctrl->setParameter($this, "old_nr", $c_old_nr);
1207  $tpl->setVariable(
1208  "HREF_ROLLBACK",
1209  $this->ctrl->getLinkTarget($this, "rollbackConfirmation")
1210  );
1211  $this->ctrl->setParameter($this, "old_nr", "");
1212  $tpl->setVariable(
1213  "TXT_ROLLBACK",
1214  $this->lng->txt("cont_rollback")
1215  );
1216  $tpl->parseCurrentBlock();
1217  }
1218  }
1219 
1220  $tpl->setCurrentBlock("hist_nav");
1221  $tpl->setVariable("TXT_REVISION", $this->lng->txt("cont_revision"));
1222  $tpl->setVariable(
1223  "VAL_REVISION_DATE",
1224  ilDatePresentation::formatDate(new ilDateTime($hist_info["current"]["hdate"], IL_CAL_DATETIME))
1225  );
1226  $tpl->setVariable(
1227  "VAL_REV_USER",
1228  ilUserUtil::getNamePresentation($hist_info["current"]["user_id"])
1229  );
1230  $tpl->parseCurrentBlock();
1231  }
1232  }
1233  if ($this->getOutputMode() != self::PRESENTATION &&
1234  $this->getOutputMode() != self::OFFLINE &&
1235  $this->getOutputMode() != self::PREVIEW &&
1236  $this->getOutputMode() != self::PRINTING) {
1237  $tpl->setVariable("FORMACTION", $this->ctrl->getFormActionByClass("ilpageeditorgui"));
1238  }
1239 
1240  // output media object edit list (of media links)
1241  if ($this->getOutputMode() == "edit") {
1243  $this->obj->getParentType() . ":pg",
1244  $this->obj->getId(),
1245  $this->obj->getLanguage()
1246  );
1247  $mob_links = array();
1248  foreach ($links as $link) {
1249  if ($link["type"] == "mob") {
1250  if (ilObject::_exists($link["id"]) && ilObject::_lookupType($link["id"]) == "mob") {
1251  $mob_links[$link["id"]] = ilObject::_lookupTitle($link["id"]) . " [" . $link["id"] . "]";
1252  }
1253  }
1254  }
1255 
1256  // linked media objects
1257  if (count($mob_links) > 0) {
1258  $tpl->setCurrentBlock("med_link");
1259  $tpl->setVariable("TXT_LINKED_MOBS", $this->lng->txt("cont_linked_mobs"));
1260  $tpl->setVariable(
1261  "SEL_MED_LINKS",
1262  ilLegacyFormElementsUtil::formSelect(0, "mob_id", $mob_links, false, true)
1263  );
1264  $tpl->setVariable("TXT_EDIT_MEDIA", $this->lng->txt("cont_edit_mob"));
1265  $tpl->setVariable("TXT_COPY_TO_CLIPBOARD", $this->lng->txt("cont_copy_to_clipboard"));
1266  //$this->tpl->setVariable("TXT_COPY_TO_POOL", $this->lng->txt("cont_copy_to_mediapool"));
1267  $tpl->parseCurrentBlock();
1268  }
1269 
1270  // content snippets used
1271  $this->getPageObject()->buildDom();
1273  $this->getPageObject(),
1274  $this->getPageObject()->getDomDoc()
1275  );
1276  if (count($snippets) > 0) {
1277  foreach ($snippets as $s) {
1278  $sn_arr[$s["id"]] = ilMediaPoolPage::lookupTitle($s["id"]);
1279  }
1280  $tpl->setCurrentBlock("med_link");
1281  $tpl->setVariable("TXT_CONTENT_SNIPPETS_USED", $this->lng->txt("cont_snippets_used"));
1282  $tpl->setVariable(
1283  "SEL_SNIPPETS",
1284  ilLegacyFormElementsUtil::formSelect(0, "ci_id", $sn_arr, false, true)
1285  );
1286  $tpl->setVariable("TXT_SHOW_INFO", $this->lng->txt("cont_show_info"));
1287  $tpl->parseCurrentBlock();
1288  }
1289 
1290  // scheduled activation?
1291  if (!$this->getPageObject()->getActive() &&
1292  $this->getPageObject()->getActivationStart() != "" &&
1293  $this->getPageConfig()->getEnableScheduledActivation()) {
1294  $tpl->setCurrentBlock("activation_txt");
1295  $tpl->setVariable("TXT_SCHEDULED_ACTIVATION", $this->lng->txt("cont_scheduled_activation"));
1296  $tpl->setVariable(
1297  "SA_FROM",
1299  new ilDateTime(
1300  $this->getPageObject()->getActivationStart(),
1302  )
1303  )
1304  );
1305  $tpl->setVariable(
1306  "SA_TO",
1308  new ilDateTime(
1309  $this->getPageObject()->getActivationEnd(),
1311  )
1312  )
1313  );
1314  $tpl->parseCurrentBlock();
1315  }
1316  }
1317 
1318  // get content
1319  $builded = $this->obj->buildDom();
1320 
1321  // manage hierarchical ids
1322  if ($this->getOutputMode() == "edit") {
1323  // add pc ids, if necessary
1324  if (!$this->obj->checkPCIds()) {
1325  $this->obj->insertPCIds();
1326  $this->obj->update(true, true);
1327  }
1328 
1329  $this->obj->addFileSizes();
1330  $this->obj->addHierIDs();
1331  } else {
1332  $this->obj->addFileSizes();
1333  }
1334 
1335  //echo "<br>-".htmlentities($this->obj->getXMLContent())."-<br><br>"; exit;
1336  //echo "<br>-".htmlentities($this->getLinkXML())."-"; exit;
1337 
1338  // set default link xml, if nothing was set yet
1339  if (!$this->link_xml_set) {
1340  $this->setDefaultLinkXml();
1341  }
1342 
1343  $template_xml = '';
1344 
1345  $link_xml = $this->getLinkXML();
1346 
1347  // disable/enable auto margins
1348  if ($this->getStyleId() > 0) {
1349  if (ilObject::_lookupType($this->getStyleId()) == "sty") {
1350  $style = new ilObjStyleSheet($this->getStyleId());
1351  $template_xml = $style->getTemplateXML();
1352  $disable_auto_margins = "n";
1353  if ($style->lookupStyleSetting("disable_auto_margins")) {
1354  $disable_auto_margins = "y";
1355  }
1356  }
1357  }
1358 
1359  $append_footnotes = "y";
1360  if ($this->getAbstractOnly()) {
1361  if (!$this->abstract_pcid) {
1362  $content = "<dummy><PageObject><PageContent><Paragraph>" .
1363  $this->obj->getFirstParagraphText() . $link_xml .
1364  "</Paragraph></PageContent></PageObject></dummy>";
1365  } else {
1366  $append_footnotes = "n";
1367  $par = $this->obj->getParagraphForPCID($this->abstract_pcid);
1368  $content = "<dummy><PageObject><PageContent><Paragraph Characteristic='" . $par->getCharacteristic() . "'>" .
1369  $par->getText() . $link_xml .
1370  "</Paragraph></PageContent></PageObject>" . $this->obj->getMultimediaXML() . "</dummy>";
1371  }
1372  } else {
1373  $content = $this->obj->getXMLFromDom(
1374  false,
1375  true,
1376  true,
1377  $link_xml . $template_xml . $this->getComponentPluginsXML(),
1378  false,
1379  $this->getStyleId()
1380  );
1381  }
1382 
1383  // check validation errors
1384  if ($builded !== true) {
1385  $this->displayValidationError($builded);
1386  } else {
1387  $this->displayValidationError((string) $this->edit_repo->getPageError());
1388  }
1389  $this->edit_repo->clearPageError();
1390 
1391  // get title
1392  $pg_title = $this->getPresentationTitle();
1393  $col_path = '';
1394  $row_path = '';
1395  $cell_path = '';
1396  $item_path = '';
1397  if ($this->getOutputMode() == "edit") {
1398  $col_path = ilUtil::getImagePath("object/col.svg");
1399  $row_path = ilUtil::getImagePath("object/row.svg");
1400  $item_path = ilUtil::getImagePath("page_editor/icon_peadl.svg");
1401  $cell_path = ilUtil::getImagePath("object/cell.svg");
1402  }
1403 
1404  if ($this->getOutputMode() != "offline") {
1405  $enlarge_path = ilUtil::getImagePath("media/enlarge.svg");
1406  $wb_path = ilFileUtils::getWebspaceDir("output") . "/";
1407  } else {
1408  $enlarge_path = "images/media/enlarge.svg";
1409  $wb_path = "";
1410  }
1411  $pg_title_class = ($this->getOutputMode() == "print")
1412  ? "ilc_PrintPageTitle"
1413  : "";
1414 
1415  // page splitting only for learning modules and
1416  // digital books
1417  $enable_split_new = ($this->obj->getParentType() == "lm")
1418  ? "y"
1419  : "n";
1420 
1421  // page splitting to next page only for learning modules and
1422  // digital books if next page exists in tree
1423  if (($this->obj->getParentType() == "lm") &&
1425  $this->obj->getParentId(),
1426  $this->obj->getId()
1427  )) {
1428  $enable_split_next = "y";
1429  } else {
1430  $enable_split_next = "n";
1431  }
1432 
1433  $img_path = ilUtil::getImagePath("", false, $this->getOutputMode(), $this->getOutputMode() == "offline");
1434 
1435 
1436  if ($this->getPageConfig()->getEnablePCType("Tabs")) {
1439  }
1440 
1441  // needed for placeholders
1442  $this->tpl->addCss(ilObjStyleSheet::getBaseContentStylePath());
1443 
1444  $file_download_link = $this->determineFileDownloadLink();
1445  $fullscreen_link = $this->determineFullscreenLink();
1446  $this->sourcecode_download_script = $this->determineSourcecodeDownloadScript();
1447 
1448  // default values for various parameters (should be used by
1449  // all instances in the future)
1450  $media_mode = ($this->getOutputMode() == "edit")
1451  ? $this->user->getPref("ilPageEditor_MediaMode")
1452  : "enable";
1453 
1454  $paste = (ilEditClipboard::getAction() == "copy" &&
1455  $this->getOutputMode() == "edit");
1456 
1457  $flv_video_player = ilPlayerUtil::getFlashVideoPlayerFilename(true);
1458 
1459  $cfg = $this->getPageConfig();
1460 
1461  $current_ts = time();
1462 
1463  $enable_href = $this->getEnabledHref();
1464  if ($this->getOutputMode() == self::EDIT) {
1465  $enable_href = false;
1466  }
1467 
1468  // added UTF-8 encoding otherwise umlaute are converted too
1469  $params = array('mode' => $this->getOutputMode(), 'pg_title' => htmlentities($pg_title, ENT_QUOTES, "UTF-8"),
1470  'enable_placeholder' => $cfg->getEnablePCType("PlaceHolder") ? "y" : "n",
1471  'pg_id' => $this->obj->getId(), 'pg_title_class' => $pg_title_class,
1472  'webspace_path' => $wb_path, 'enlarge_path' => $enlarge_path,
1473  'img_col' => $col_path,
1474  'img_row' => $row_path,
1475  'img_cell' => $cell_path,
1476  'img_item' => $item_path,
1477  'acc_save_url' => "./ilias.php?baseClass=ilaccordionpropertiesstoragegui&cmd=setOpenedTab" .
1478  "&user_id=" . $this->user->getId(),
1479  'append_footnotes' => $append_footnotes,
1480  'compare_mode' => $this->getCompareMode() ? "y" : "n",
1481  'enable_split_new' => $enable_split_new,
1482  'enable_split_next' => $enable_split_next,
1483  'link_params' => $this->link_params,
1484  'file_download_link' => $file_download_link,
1485  'fullscreen_link' => $fullscreen_link,
1486  'img_path' => $img_path,
1487  'parent_id' => $this->obj->getParentId(),
1488  'download_script' => $this->sourcecode_download_script,
1489  'encoded_download_script' => urlencode($this->sourcecode_download_script),
1490  'enable_rep_objects' => $cfg->getEnablePCType("Resources") ? "y" : "n",
1491  'enable_login_page' => $cfg->getEnablePCType("LoginPageElement") ? "y" : "n",
1492  'enable_map' => ($cfg->getEnablePCType("Map") && ilMapUtil::isActivated()) ? "y" : "n",
1493  'enable_tabs' => $cfg->getEnablePCType("Tabs") ? "y" : "n",
1494  'enable_sa_qst' => $cfg->getEnableSelfAssessment() ? "y" : "n",
1495  'enable_file_list' => $cfg->getEnablePCType("FileList") ? "y" : "n",
1496  'enable_content_includes' => $cfg->getEnablePCType("ContentInclude") ? "y" : "n",
1497  'enable_content_templates' => (count($this->getPageObject()->getContentTemplates()) > 0) ? "y" : "n",
1498  'paste' => $paste ? "y" : "n",
1499  'media_mode' => $media_mode,
1500  'javascript' => $sel_js_mode,
1501  'paragraph_plugins' => $paragraph_plugin_string,
1502  'disable_auto_margins' => $disable_auto_margins,
1503  'page_toc' => $cfg->getEnablePageToc() ? "y" : "n",
1504  'enable_profile' => $cfg->getEnablePCType("Profile") ? "y" : "n",
1505  'enable_verification' => $cfg->getEnablePCType("Verification") ? "y" : "n",
1506  'enable_blog' => $cfg->getEnablePCType("Blog") ? "y" : "n",
1507  'enable_skills' => $cfg->getEnablePCType("Skills") ? "y" : "n",
1508  'enable_learning_history' => $cfg->getEnablePCType("LearningHistory") ? "y" : "n",
1509  'enable_qover' => "n",
1510  'enable_consultation_hours' => $cfg->getEnablePCType("ConsultationHours") ? "y" : "n",
1511  'enable_my_courses' => $cfg->getEnablePCType("MyCourses") ? "y" : "n",
1512  'enable_amd_page_list' => $cfg->getEnablePCType("AMDPageList") ? "y" : "n",
1513  'current_ts' => $current_ts,
1514  'enable_html_mob' => ilObjMediaObject::isTypeAllowed("html") ? "y" : "n",
1515  'flv_video_player' => $flv_video_player,
1516  'page_perma_link' => $this->getPagePermaLink(),
1517  'activated_protection' =>
1518  ($this->getPageConfig()->getSectionProtection() == \ilPageConfig::SEC_PROTECT_PROTECTED) ? "y" : "n",
1519  'protection_text' => $this->lng->txt("cont_sec_protected_text"),
1520  'enable_href' => $enable_href
1521  );
1522  if ($this->link_frame != "") { // todo other link types
1523  $params["pg_frame"] = $this->link_frame;
1524  }
1525 
1526  //$content = str_replace("&nbsp;", "", $content);
1527 
1528  // this ensures that cache is emptied with every update
1529  $params["version"] = ILIAS_VERSION;
1530  // ensure no cache hit, if included files/media objects have been changed
1531  $params["incl_elements_date"] = $this->obj->getLastUpdateOfIncludedElements();
1532 
1533 
1534  // should be modularized
1535  $md5_adds = ilPCSection::getCacheTriggerString($this->getPageObject());
1536  // run xslt
1537  $md5 = md5(serialize($params) . $link_xml . $template_xml . $md5_adds);
1538 
1539  //$a = microtime();
1540 
1541  // check cache (same parameters, non-edit mode and rendered time
1542  // > last change
1543  $is_error = false;
1544  if (($this->getOutputMode() == "preview" || $this->getOutputMode() == "presentation") &&
1545  !$this->getCompareMode() &&
1546  !$this->getAbstractOnly() &&
1547  $md5 == $this->obj->getRenderMd5() &&
1548  ($this->obj->getLastChange() < $this->obj->getRenderedTime()) &&
1549  $this->obj->getRenderedTime() != "" &&
1550  $this->obj->old_nr == 0) {
1551  // cache hit
1552  $output = $this->obj->getRenderedContent();
1553  } else {
1554  $this->log->debug("Calling XSLT, content: " . substr($content, 0, 100));
1555  try {
1556  $output = $this->xsl->process($content, $params);
1557  } catch (Exception $e) {
1558  $output = "";
1559  if ($this->getOutputMode() == "edit") {
1560  $output = "<pre>" . $e->getMessage() . "<br>" . htmlentities($content) . "</pre>";
1561  $is_error = true;
1562  }
1563  }
1564  if (($this->getOutputMode() == "presentation" || $this->getOutputMode() == "preview")
1565  && !$this->getAbstractOnly()
1566  && $this->obj->old_nr == 0) {
1567  $this->obj->writeRenderedContent($output, $md5);
1568  }
1569  }
1570 
1571  if (!$is_error) {
1572  // unmask user html
1573  if (($this->getOutputMode() != "edit" ||
1574  $this->user->getPref("ilPageEditor_HTMLMode") != "disable")
1575  && !$this->getPageConfig()->getPreventHTMLUnmasking()) {
1576  $output = str_replace("&lt;", "<", $output);
1577  $output = str_replace("&gt;", ">", $output);
1578  }
1579  $output = str_replace("&amp;", "&", $output);
1580 
1581  $output = ilMathJax::getInstance()->insertLatexImages($output);
1582 
1583  // insert page snippets
1584  //$output = $this->insertContentIncludes($output);
1585 
1586  // insert resource blocks
1587  $output = $this->insertResources($output);
1588 
1589  // insert page toc
1590  if ($this->getPageConfig()->getEnablePageToc()) {
1591  $output = $this->insertPageToc($output);
1592  }
1593 
1594  // insert advanced output trigger
1595  $output = $this->insertAdvTrigger($output);
1596 
1597  // workaround for preventing template engine
1598  // from hiding paragraph text that is enclosed
1599  // in curly brackets (e.g. "{a}", see ilLMEditorGUI::executeCommand())
1600  $output = $this->replaceCurlyBrackets($output);
1601 
1602  // remove all newlines (important for code / pre output)
1603  $output = str_replace("\n", "", $output);
1604 
1605  //echo htmlentities($output);
1606  $output = $this->postOutputProcessing($output);
1607  //echo htmlentities($output);
1608  if ($this->getOutputMode() == "edit" &&
1609  !$this->getPageObject()->getActive($this->getPageConfig()->getEnableScheduledActivation())) {
1610  $output = '<div class="copg-disabled-page"><div class="ilCopgDisabledText">' . $this->getDisabledText() . '</div>' . $output . '</div>';
1611  }
1612 
1613  // for all page components...
1614  $defs = $this->pc_definition->getPCDefinitions();
1615  foreach ($defs as $def) {
1616  $pc_class = $def["pc_class"];
1617  $pc_obj = new $pc_class($this->getPageObject());
1618  $pc_obj->setSourcecodeDownloadScript($this->determineSourcecodeDownloadScript());
1619  $pc_obj->setFileDownloadLink($this->determineFileDownloadLink());
1620  $pc_obj->setFullscreenLink($this->determineFullscreenLink());
1621  $pc_obj->setProfileBackUrl($this->getProfileBackUrl());
1622 
1623  // post xsl page content modification by pc elements
1624  $output = $pc_obj->modifyPageContentPostXsl($output, $this->getOutputMode(), $this->getAbstractOnly());
1625  }
1626  }
1627 
1628  $this->addResourcesToTemplate($main_tpl);
1629 
1630  // $output = $this->selfAssessmentRendering($output);
1631 
1632  // output
1633  if ($this->ctrl->isAsynch() && !$this->getRawPageContent() &&
1634  $this->getOutputMode() == "edit") {
1635  // e.g. ###3:110dad8bad6df8620071a0a693a2d328###
1636  $up_pc = $this->request->getString("updated_pc_id_str");
1637  if ($up_pc != "") {
1638  echo $up_pc;
1639  }
1640  $tpl->setVariable($this->getTemplateOutputVar(), $output);
1641  $tpl->setCurrentBlock("edit_page");
1642  $tpl->parseCurrentBlock();
1643  echo $tpl->get("edit_page");
1644  exit;
1645  }
1646  $edit_init = "";
1647  if ($this->getOutputMode() === "edit") {
1648  $edit_init = $this->editor_gui->init()->getInitHtml($this->getOpenPlaceHolder());
1649  }
1650  if ($this->outputToTemplate()) {
1651  $tpl->setVariable($this->getTemplateOutputVar(), $output);
1652  $this->tpl->setVariable($this->getTemplateTargetVar(), $tpl->get() . $edit_init);
1653  return $output;
1654  } else {
1655  if ($this->getRawPageContent()) { // e.g. needed in glossaries
1656  return $output . $edit_init;
1657  } else {
1658  $tpl->setVariable($this->getTemplateOutputVar(), $output);
1659  return $tpl->get() . $edit_init;
1660  }
1661  }
1662  }
1663 
1664  public function replaceCurlyBrackets(string $output): string
1665  {
1666  //echo "<br><br>".htmlentities($output);
1667 
1668  while (is_int($start = strpos($output, "<!--ParStart-->")) &&
1669  is_int($end = strpos($output, "<!--ParEnd-->", $start))) {
1670  $output = substr($output, 0, $start) .
1671  str_replace(
1672  array("{","}"),
1673  array("&#123;","&#125;"),
1674  substr($output, $start + 15, $end - ($start + 15))
1675  ) .
1676  substr($output, $end + 13);
1677  }
1678 
1679  // $output = str_replace("{", "&#123;", $output);
1680  // $output = str_replace("}", "&#125;", $output);
1681  //echo "<br><br>".htmlentities($output);
1682  return $output;
1683  }
1684 
1688  public function getActivationCaptions(): array
1689  {
1690  return array("deactivatePage" => $this->lng->txt("cont_deactivate_page"),
1691  "activatePage" => $this->lng->txt("cont_activate_page"));
1692  }
1693 
1697  public function setEditMode(): void
1698  {
1699  $media_mode = $this->request->getString("media_mode");
1700  $html_mode = $this->request->getString("html_mode");
1701  $js_mode = $this->request->getString("js_mode");
1702  if ($media_mode != "") {
1703  if ($media_mode == "disable") {
1704  $this->user->writePref("ilPageEditor_MediaMode", "disable");
1705  } else {
1706  $this->user->writePref("ilPageEditor_MediaMode", "");
1707  }
1708  }
1709  if ($html_mode != "") {
1710  if ($html_mode == "disable") {
1711  $this->user->writePref("ilPageEditor_HTMLMode", "disable");
1712  } else {
1713  $this->user->writePref("ilPageEditor_HTMLMode", "");
1714  }
1715  }
1716  if ($js_mode != "") {
1717  if ($js_mode == "disable") {
1718  $this->user->writePref("ilPageEditor_JavaScript", "disable");
1719  } else {
1720  $this->user->writePref("ilPageEditor_JavaScript", "");
1721  }
1722  }
1723 
1724  $this->ctrl->redirect($this, "edit");
1725  }
1726 
1727 
1731  public static function getTinyMenu(
1732  string $a_par_type,
1733  bool $a_int_links = false,
1734  bool $a_wiki_links = false,
1735  bool $a_keywords = false,
1736  $a_style_id = 0,
1737  $a_paragraph_styles = true,
1738  $a_save_return = true,
1739  $a_anchors = false,
1740  $a_save_new = true,
1741  $a_user_links = false,
1742  \ILIAS\COPage\Editor\Server\UIWrapper $ui_wrapper = null
1743  ): string {
1744  global $DIC;
1745 
1746  $lng = $DIC->language();
1747  $lng->loadLanguageModule("copg");
1748  $ctrl = $DIC->ctrl();
1749  $ui = $DIC->ui();
1750 
1751  $style_service = $DIC->contentStyle()->internal();
1752  $style_access_manager = $style_service->domain()->access(
1753  0,
1754  $DIC->user()->getId()
1755  );
1756  $char_manager = $style_service->domain()->characteristic(
1757  $a_style_id,
1758  $style_access_manager
1759  );
1760 
1761  $aset = new ilSetting("adve");
1762 
1763  $f = static function (string $type, string $code) use ($char_manager, $lng): string {
1764  $title = $char_manager->getPresentationTitle("text_inline", $type);
1765  if ($title === $type) {
1766  $title = $lng->txt("cont_char_style_" . $code);
1767  }
1768  return $title;
1769  };
1770 
1771  // character styles
1772  $chars = [];
1773  if ($a_style_id === 0) {
1774  $chars = array(
1775  "Comment" => array("code" => "com", "txt" => $f("Comment", "com")),
1776  "Quotation" => array("code" => "quot", "txt" => $f("Quotation", "quot")),
1777  "Accent" => array("code" => "acc", "txt" => $f("Accent", "acc")),
1778  "Code" => array("code" => "code", "txt" => $f("Code", "code"))
1779  );
1780  }
1781  foreach (ilPCParagraphGUI::_getTextCharacteristics($a_style_id, true) as $c) {
1782  if (in_array($c, ["Strong", "Important", "Emph"])) {
1783  continue;
1784  }
1785  if (!isset($chars[$c])) {
1786  $title = $char_manager->getPresentationTitle("text_inline", $c);
1787  switch ($c) {
1788  case "CodeInline":
1789  $chars["Code"] = array("code" => "code", "txt" => $f("Code", "code"));
1790  break;
1791  case "Comment":
1792  $chars["Comment"] = array("code" => "com", "txt" => $f("Comment", "com"));
1793  break;
1794  case "Quotation":
1795  $chars["Quotation"] = array("code" => "quot", "txt" => $f("Quotation", "quot"));
1796  break;
1797  case "Accent":
1798  $chars["Accent"] = array("code" => "acc", "txt" => $f("Accent", "acc"));
1799  break;
1800  default:
1801  $chars[$c] = array("code" => "", "txt" => $title);
1802  break;
1803  }
1804  }
1805  }
1806  $char_formats = [];
1807  foreach ($chars as $key => $char) {
1809  $a_par_type,
1810  "active_" . $char["code"],
1811  true
1812  )) {
1813  $t = "text_inline";
1814  $tag = "span";
1815  switch ($key) {
1816  case "Code": $tag = "code";
1817  break;
1818  }
1819  $html = '<' . $tag . ' class="ilc_' . $t . '_' . $key . '" style="font-size:90%; margin-top:2px; margin-bottom:2px; position:static;">' . $char["txt"] . "</" . $tag . ">";
1820  $char_formats[] = ["text" => $html, "action" => "selection.format", "data" => ["format" => $key]];
1821  }
1822  }
1823 
1824 
1825  $numbered_list = $ui->renderer()->render(
1826  $ui->factory()->symbol()->glyph()->numberedlist(null)
1827  );
1828 
1829  $bullet_list = $ui->renderer()->render(
1830  $ui->factory()->symbol()->glyph()->bulletlist(null)
1831  );
1832 
1833  $indent = $ui->renderer()->render(
1834  $ui->factory()->symbol()->glyph()->listindent(null)
1835  );
1836 
1837  $outdent = $ui->renderer()->render(
1838  $ui->factory()->symbol()->glyph()->listoutdent(null)
1839  );
1840 
1841  // menu
1842  $str = "str";
1843  $emp = "emp";
1844  $imp = "imp";
1845  if ($aset->get("use_physical")) {
1846  $str = "B";
1847  $emp = "I";
1848  $imp = "U";
1849  }
1850  $c_formats = [];
1851  foreach (["str", "emp", "imp", "sup", "sub"] as $c) {
1853  $a_par_type,
1854  "active_" . $c,
1855  true
1856  )) {
1857  switch ($c) {
1858  case "str":
1859  $c_formats[] = ["text" => '<span class="ilc_text_inline_Strong">' . $str . '</span>',
1860  "action" => "selection.format",
1861  "data" => ["format" => "Strong"],
1862  "aria-label" => $lng->txt("cont_text_str")
1863  ];
1864  break;
1865  case "emp":
1866  $c_formats[] = ["text" => '<span class="ilc_text_inline_Emph">' . $emp . '</span>',
1867  "action" => "selection.format",
1868  "data" => ["format" => "Emph"],
1869  "aria-label" => $lng->txt("cont_text_emp")
1870  ];
1871  break;
1872  case "imp":
1873  $c_formats[] = ["text" => '<span class="ilc_text_inline_Important">' . $imp . '</span>',
1874  "action" => "selection.format",
1875  "data" => ["format" => "Important"],
1876  "aria-label" => $lng->txt("cont_text_imp")
1877  ];
1878  break;
1879  case "sup":
1880  $c_formats[] = ["text" => 'x<sup>2</sup>',
1881  "action" => "selection.format",
1882  "data" => ["format" => "Sup"],
1883  "aria-label" => $lng->txt("cont_text_sup")
1884  ];
1885  break;
1886  case "sub":
1887  $c_formats[] = ["text" => 'x<sub>2</sub>',
1888  "action" => "selection.format",
1889  "data" => ["format" => "Sub"],
1890  "aria-label" => $lng->txt("cont_text_sub")
1891  ];
1892  break;
1893  }
1894  }
1895  }
1896  $c_formats[] = ["text" => "<i>A</i>",
1897  "action" => $char_formats,
1898  "aria-label" => $lng->txt("copg_more_character_formats")
1899  ];
1900  $c_formats[] = ["text" => '<i><strong><u>T</u></strong><sub>x</sub></i>',
1901  "action" => "selection.removeFormat",
1902  "data" => [],
1903  "aria-label" => $lng->txt("copg_remove_formats")
1904  ];
1905  $menu = [
1906  "cont_char_format" => $c_formats,
1907  "cont_lists" => [
1908  [
1909  "text" => $bullet_list,
1910  "action" => "list.bullet",
1911  "data" => [],
1912  "aria-label" => $lng->txt("cont_bullet_list")
1913  ],
1914  [
1915  "text" => $numbered_list,
1916  "action" => "list.number",
1917  "data" => [],
1918  "aria-label" => $lng->txt("cont_numbered_list")
1919  ],
1920  [
1921  "text" => $outdent,
1922  "action" => "list.outdent",
1923  "data" => [],
1924  "aria-label" => $lng->txt("cont_list_outdent")
1925  ],
1926  [
1927  "text" => $indent,
1928  "action" => "list.indent",
1929  "data" => [],
1930  "aria-label" => $lng->txt("cont_list_indent")
1931  ]
1932  ]
1933  ];
1934 
1935  // bullet lists
1936  $ulists = ilPCListGUI::_getListCharacteristics($a_style_id, "list_u");
1937  $olists = ilPCListGUI::_getListCharacteristics($a_style_id, "list_o");
1938  $ilists = ilPCListGUI::_getListCharacteristics($a_style_id, "list_item");
1939  if (count($ulists) > 1) {
1940  $la = [];
1941  foreach ($ulists as $c) {
1942  $la[] = ["action" => "list.bulletStyle", "text" => $c, "data" => ["format" => $c]];
1943  }
1944  $menu["copg_list_styles"][] = ["text" => $lng->txt("copg_list_style"), "action" => $la];
1945  }
1946  if (count($olists) > 1) {
1947  $la = [];
1948  foreach ($olists as $c) {
1949  $la[] = ["action" => "list.numberStyle", "text" => $c, "data" => ["format" => $c]];
1950  }
1951  $menu["copg_list_styles"][] = ["text" => $lng->txt("copg_list_style"), "action" => $la];
1952  }
1953  if (count($ilists) > 1) {
1954  $la = [];
1955  foreach ($ilists as $c) {
1956  $la[] = ["action" => "list.itemStyle", "text" => $c, "data" => ["format" => $c]];
1957  }
1958  $menu["copg_list_styles"][] = ["text" => $lng->txt("copg_list_item_style"), "action" => $la];
1959  }
1960 
1961  // more...
1962 
1963  // links
1964  $links = [];
1965  if ($a_wiki_links) {
1966  $links[] = ["text" => $lng->txt("cont_wiki_link_dialog"), "action" => "link.wikiSelection", "data" => [
1967  "url" => $ctrl->getLinkTargetByClass("ilwikipagegui", "")]];
1968  $links[] = ["text" => "[[" . $lng->txt("cont_wiki_page") . "]]", "action" => "link.wiki", "data" => []];
1969  }
1970  if ($a_int_links) {
1971  $links[] = ["text" => $lng->txt("cont_text_iln_link"), "action" => "link.internal", "data" => []];
1972  }
1974  $a_par_type,
1975  "active_xln",
1976  true
1977  )) {
1978  $links[] = ["text" => $lng->txt("cont_text_xln"), "action" => "link.external", "data" => []];
1979  }
1980  if ($a_user_links) {
1981  $links[] = ["text" => $lng->txt("cont_link_user"), "action" => "link.user", "data" => []];
1982  }
1983 
1984 
1985  // more
1986  $menu["cont_more_functions"] = [];
1987  $menu["cont_more_functions"][] = ["text" => $lng->txt("cont_link") . '<i class="mce-ico mce-i-link"></i>', "action" => $links];
1988 
1989  if ($a_keywords) {
1990  $menu["cont_more_functions"][] = ["text" => $lng->txt("cont_keyword"), "action" => "selection.keyword", "data" => []];
1991  }
1992  $mathJaxSetting = new ilSetting("MathJax");
1994  $a_par_type,
1995  "active_tex",
1996  true
1997  )) {
1998  if ($mathJaxSetting->get("enable") || defined("URL_TO_LATEX")) {
1999  $menu["cont_more_functions"][] = ["text" => 'Tex', "action" => "selection.tex", "data" => []];
2000  }
2001  }
2003  $a_par_type,
2004  "active_fn",
2005  true
2006  )) {
2007  $menu["cont_more_functions"][] = ["text" => $lng->txt("cont_footnote"), "action" => "selection.fn", "data" => []];
2008  }
2009  if ($a_anchors) {
2010  $menu["cont_more_functions"][] = ["text" => $lng->txt("cont_anchor"), "action" => "selection.anchor", "data" => []];
2011  }
2012 
2013  $btpl = new ilTemplate("tpl.tiny_menu.html", true, true, "Services/COPage");
2014 
2015  foreach ($menu as $section_title => $section) {
2016  foreach ($section as $item) {
2017  if (is_array($item["action"])) {
2018  $buttons = [];
2019  foreach ($item["action"] as $i) {
2020  $buttons[] = $ui_wrapper->getButton(
2021  $i["text"],
2022  "par-action",
2023  $i["action"],
2024  $i["data"],
2025  "",
2026  false,
2027  $i["aria-label"] ?? ""
2028  );
2029  }
2030  $dd = $ui->factory()->dropdown()->standard($buttons)->withLabel($item["text"])
2031  ->withAriaLabel($item["aria-label"] ?? "");
2032  $btpl->setCurrentBlock("button");
2033  $btpl->setVariable("BUTTON", $ui->renderer()->renderAsync($dd));
2034  } else {
2035  $b = $ui_wrapper->getRenderedButton(
2036  $item["text"],
2037  "par-action",
2038  $item["action"],
2039  $item["data"],
2040  "",
2041  false,
2042  $item["aria-label"] ?? ""
2043  );
2044  $btpl->setCurrentBlock("button");
2045  $btpl->setVariable("BUTTON", $b);
2046  }
2047  $btpl->parseCurrentBlock();
2048  }
2049  $btpl->setCurrentBlock("section");
2050  $btpl->setVariable("TXT_SECTION", $lng->txt($section_title));
2051  $btpl->parseCurrentBlock();
2052  }
2053 
2054 
2055  if ($a_paragraph_styles) {
2056  $sel = new \ParagraphStyleSelector($ui_wrapper, $a_style_id);
2057  $dd = $sel->getStyleSelector(" ");
2058  $btpl->setCurrentBlock("par_edit");
2059  $btpl->setVariable("TXT_PAR_FORMAT", $lng->txt("cont_par_format"));
2060 
2061  $btpl->setVariable("STYLE_SELECTOR", $ui->renderer()->render($dd));
2062 
2063  $btpl->parseCurrentBlock();
2064  }
2065 
2066  // block styles
2067  $sel = new \SectionStyleSelector($ui_wrapper, $a_style_id);
2068  $dd = $sel->getStyleSelector(" ", $type = "par-action", $action = "sec.class", $attr = "class", true);
2069  $btpl->setVariable("TXT_BLOCK", $lng->txt("cont_sur_block_format"));
2070  $btpl->setVariable("BLOCK_STYLE_SELECTOR", $ui->renderer()->render($dd));
2071 
2072 
2073  $btpl->setVariable("TINY_HEADER", $lng->txt("cont_text_editing"));
2074  $btpl->setVariable(
2075  "SPLIT_BUTTON",
2076  $ui_wrapper->getRenderedButton($lng->txt("cont_quit_text_editing"), "par-action", "save.return")
2077  );
2078 
2079  /*
2080  $btpl->setVariable(
2081  "CANCEL_BUTTON",
2082  $ui_wrapper->getRenderedButton($lng->txt("cancel"), "par-action", "component.cancel")
2083  );*/
2084 
2085  $btpl->setVariable("TXT_SAVING", $lng->txt("cont_saving"));
2086  $btpl->setVariable("SRC_LOADER", \ilUtil::getImagePath("media/loader.svg"));
2088  "ilAdvSelListAnchorElement_char_style_selection",
2089  $lng->txt("cont_more_character_styles"),
2090  "iltinymenu_bd"
2091  );
2092 
2093  return $btpl->get();
2094  }
2095 
2096  public function setDefaultLinkXml(): void
2097  {
2098  $this->page_linker->setProfileBackUrl($this->getProfileBackUrl());
2099  $this->page_linker->setOffline($this->getOutputMode() == self::OFFLINE);
2100  $this->setLinkXml($this->page_linker->getLinkXML($this->getPageObject()->getInternalLinks()));
2101  }
2102 
2103  public function setLinkXml(string $xml): void
2104  {
2105  $this->link_xml = $xml;
2106  $this->link_xml_set = true;
2107  }
2108 
2109 
2110  public function getProfileBackUrl(): string
2111  {
2112  if ($this->profile_back_url != "") {
2113  return $this->profile_back_url;
2114  }
2115  if ($this->getOutputMode() === self::OFFLINE ||
2116  $this->getOutputMode() === self::PRINTING) {
2117  return "";
2118  }
2119  return $this->ctrl->getLinkTargetByClass(strtolower(get_class($this)), "preview");
2120  }
2121 
2122  public function setProfileBackUrl(string $url): void
2123  {
2124  $this->profile_back_url = $url;
2125  }
2126 
2127 
2128  public function downloadFile(): void
2129  {
2130  $this->getPageObject()->buildDom();
2131  $cm = $this->pm->content($this->getPageObject()->getDomDoc());
2132  $cm->downloadFile(
2133  $this->getPageObject(),
2134  $this->requested_file_id
2135  );
2136  }
2137 
2138  public function displayMediaFullscreen(): void
2139  {
2140  $this->displayMedia(true);
2141  }
2142 
2143  public function displayMedia(bool $a_fullscreen = false): void
2144  {
2145  $tpl = new ilGlobalTemplate("tpl.fullscreen.html", true, true, "Modules/LearningModule");
2146  $tpl->setCurrentBlock("ilMedia");
2147 
2148  //$int_links = $page_object->getInternalLinks();
2149  $med_links = ilMediaItem::_getMapAreasIntLinks($this->request->getMobId());
2150 
2151  // @todo
2152  $link_xml = $this->page_linker->getLinkXML($med_links);
2153 
2154  $media_obj = new ilObjMediaObject($this->request->getMobId());
2155  if ($this->request->getPageType() === "mep") {
2156  $pg_obj = new ilMediaPoolPage($this->request->getPageId());
2157  } else {
2158  $pg_obj = $this->getPageObject();
2159  }
2160  $pg_obj->buildDom();
2161 
2162  $xml = "<dummy>";
2163  if ($this->requested_pg_id > 0) {
2164  $xml .= $pg_obj->getMediaAliasElement($this->request->getMobId());
2165  } else {
2166  $xml .= $media_obj->getXML(IL_MODE_ALIAS);
2167  }
2168  $xml .= $media_obj->getXML(IL_MODE_OUTPUT);
2169  $xml .= $link_xml;
2170  $xml .= "</dummy>";
2171 
2172  $mode = "media";
2173  if ($a_fullscreen) {
2174  $mode = "fullscreen";
2175  }
2176 
2177  //echo "XML:".htmlentities($xml);
2178  // determine target frames for internal links
2179  $wb_path = ilFileUtils::getWebspaceDir("output") . "/";
2180  $enlarge_path = ilUtil::getImagePath("media/enlarge.svg");
2181  $params = array('mode' => $mode, 'enlarge_path' => $enlarge_path,
2182  'link_params' => "ref_id=" . $this->requested_ref_id,'fullscreen_link' => "",
2183  'enable_html_mob' => ilObjMediaObject::isTypeAllowed("html") ? "y" : "n",
2184  'ref_id' => $this->requested_ref_id, 'webspace_path' => $wb_path);
2185  $output = $this->xsl->process($xml, $params);
2186 
2187  // unmask user html
2190  $tpl->setVariable("MEDIA_CONTENT", $output);
2191 
2192  // add js
2194  //$tpl->fillJavaScriptFiles();
2195  //$tpl->fillCssFiles();
2196 
2197  $tpl->printToStdout();
2198  exit;
2199  }
2200 
2204  public function download_paragraph(): void
2205  {
2206  $pg_obj = $this->getPageObject();
2207  $pg_obj->buildDom();
2208  $pg_obj->sendParagraph(
2209  $this->request->getString("par_id"),
2210  $this->request->getString("downloadtitle")
2211  );
2212  }
2213 
2214  public function insertPageToc(string $a_output): string
2215  {
2216  // extract all headings
2217  $offsets = [];
2218  $cpos = 0;
2219  while (is_int($pos = strpos($a_output, "ilPageTocH", $cpos))) {
2220  $offsets[] = $pos;
2221  $cpos = $pos + 1;
2222  }
2223 
2224  $page_heads = array();
2225  foreach ($offsets as $os) {
2226  $level = (int) substr($a_output, $os + 10, 1);
2227  if (in_array($level, array(1,2,3))) {
2228  $anchor = str_replace(
2229  "TocH",
2230  "TocA",
2231  substr($a_output, $os, strpos($a_output, "-->", $os) - $os)
2232  );
2233 
2234  // get heading
2235  $tag_start = stripos($a_output, "<h" . $level . " ", $os);
2236  $tag_end = stripos($a_output, "</h" . $level . ">", $tag_start);
2237  $head = substr($a_output, $tag_start, $tag_end - $tag_start);
2238 
2239  // get headings text
2240  $text_start = stripos($head, ">") + 1;
2241  $text_end = strripos($head, "<!--", $text_start);
2242  $text = substr($head, $text_start, $text_end - $text_start);
2243  $page_heads[] = array("level" => $level, "text" => $text,
2244  "anchor" => $anchor);
2245  }
2246  }
2247  if (count($page_heads) > 1) {
2248  $listing = $this->gui->listing();
2249  // todo: inject?
2250  /*$list->setListClass("ilc_page_toc_PageTOCList");
2251  $list->setItemClass("ilc_page_toc_PageTOCItem");*/
2252  $i = 0;
2253  $c_depth = 1;
2254  $c_par[1] = 0;
2255  $c_par[2] = 0;
2256  $page_toc_ph = "<!--PageTocPH-->";
2257  foreach ($page_heads as $ind => $h) {
2258  $i++;
2259  $par = 0;
2260 
2261  // check if we have a parent for one level up
2262  $par = 0;
2263  if ($h["level"] == 2 && $c_par[1] > 0) {
2264  $par = $c_par[1];
2265  }
2266  if ($h["level"] == 3 && $c_par[2] > 0) {
2267  $par = $c_par[2];
2268  }
2269 
2270  $h["text"] = str_replace($page_toc_ph, "", $h["text"]);
2271 
2272  $listing->node(
2273  $this->ui->factory()->legacy("<a href='#" . $h["anchor"] . "' class='ilc_page_toc_PageTOCLink'>" . $h["text"] . "</a>"),
2274  (string) $i,
2275  (string) ($par)
2276  );
2277 
2278  // set the node as current parent of the level
2279  if ($h["level"] == 1) {
2280  $c_par[1] = $i;
2281  $c_par[2] = 0;
2282  }
2283  if ($h["level"] == 2) {
2284  $c_par[2] = $i;
2285  }
2286  }
2287 
2288  $tpl = new ilTemplate(
2289  "tpl.page_toc.html",
2290  true,
2291  true,
2292  "Services/COPage"
2293  );
2294  $tpl->setVariable("PAGE_TOC", $listing->autoNumbers(true)->render());
2295  $tpl->setVariable("TXT_PAGE_TOC", $this->lng->txt("cont_page_toc"));
2296  $tpl->setVariable("TXT_HIDE", $this->lng->txt("hide"));
2297  $tpl->setVariable("TXT_SHOW", $this->lng->txt("show"));
2298 
2299  $a_output = str_replace(
2300  "{{{{{PageTOC}}}}}",
2301  $tpl->get(),
2302  $a_output
2303  );
2304  $numbers = $listing->getNumbers();
2305 
2306  if (count($numbers) > 0) {
2307  foreach ($numbers as $n) {
2308  $a_output = (strpos($a_output, $page_toc_ph) !== false)
2309  ? substr_replace($a_output, $n . " ", strpos($a_output, $page_toc_ph), strlen($page_toc_ph))
2310  : $a_output;
2311  }
2312  }
2313  } else {
2314  $a_output = str_replace(
2315  "{{{{{PageTOC}}}}}",
2316  "",
2317  $a_output
2318  );
2319  }
2320 
2321  return $a_output;
2322  }
2323 
2324  public function insertResources(string $a_output): string
2325  {
2326  // this is edit mode only
2327  if ($this->getEnablePCType("Resources") &&
2328  ($this->getOutputMode() == "edit" || $this->getOutputMode() == "preview")) {
2329  $a_output = ilPCResourcesGUI::insertResourcesIntoPageContent($a_output);
2330  }
2331  return $a_output;
2332  }
2333 
2334 
2335 
2339  public function insertAdvTrigger(string $a_output): string
2340  {
2341  if (!$this->getAbstractOnly()) {
2342  $a_output = str_replace(
2343  "{{{{{LV_show_adv}}}}}",
2344  $this->lng->txt("cont_show_adv"),
2345  $a_output
2346  );
2347  $a_output = str_replace(
2348  "{{{{{LV_hide_adv}}}}}",
2349  $this->lng->txt("cont_hide_adv"),
2350  $a_output
2351  );
2352  } else {
2353  $a_output = str_replace(
2354  "{{{{{LV_show_adv}}}}}",
2355  "",
2356  $a_output
2357  );
2358  $a_output = str_replace(
2359  "{{{{{LV_hide_adv}}}}}",
2360  "",
2361  $a_output
2362  );
2363  }
2364 
2365  return $a_output;
2366  }
2367 
2368 
2373  public function postOutputProcessing(string $a_output): string
2374  {
2375  return $a_output;
2376  }
2377 
2378 
2382  public function previewHistory(): void
2383  {
2384  $this->preview();
2385  }
2386 
2387  public function preview(): string
2388  {
2389  if ($this->requested_history_mode) {
2390  $this->setBackToHistoryTabs();
2391  } else {
2392  $this->tabs_gui->activateTab("cont_preview");
2393  }
2394  $this->setOutputMode(self::PREVIEW);
2395  return $this->showPage();
2396  }
2397 
2401  protected function setEditorToolContext(): void
2402  {
2403  $collection = $this->tool_context->current()->getAdditionalData();
2404  if ($collection->exists(ilCOPageEditGSToolProvider::SHOW_EDITOR)) {
2405  $collection->replace(ilCOPageEditGSToolProvider::SHOW_EDITOR, true);
2406  } else {
2407  $collection->add(ilCOPageEditGSToolProvider::SHOW_EDITOR, true);
2408  }
2409  }
2410 
2411  protected function initEditing(): void
2412  {
2413  // editing allowed?
2414  if (!$this->getEnableEditing()) {
2415  $this->tpl->setOnScreenMessage('failure', $this->lng->txt("permission_denied"), true);
2416  $this->ctrl->redirect($this, "preview");
2417  }
2418 
2419  // not so nive workaround for container pages, bug #0015831
2420  $ptype = $this->getParentType();
2421  if ($ptype == "cont" && $this->requested_ref_id > 0) {
2422  $ptype = ilObject::_lookupType($this->requested_ref_id, true);
2423  }
2424  $this->setScreenIdComponent();
2425  $this->help->setScreenId("edit_" . $ptype);
2426 
2427  // edit lock
2428  if (!$this->getPageObject()->getEditLock()) {
2429  $this->showEditLockInfo();
2430  return;
2431  } else {
2432  $this->setEditorToolContext();
2433  }
2434 
2435  $this->lng->toJS("paste");
2436  $this->lng->toJS("delete");
2437  $this->lng->toJS("cont_delete_content");
2438  $this->lng->toJS("copg_confirm_el_deletion");
2439  $this->lng->toJS("cont_saving");
2440  $this->lng->toJS("cont_ed_par");
2441  $this->lng->toJS("cont_no_block");
2442  $this->lng->toJS("copg_error");
2443  $this->lng->toJS("cont_ed_click_to_add_pg");
2444  $this->lng->toJS("cont_ed_new_item_after");
2445  $this->lng->toJS("cont_ed_new_item_before");
2446  $this->lng->toJS("cont_ed_item_up");
2447  $this->lng->toJS("cont_ed_item_down");
2448  $this->lng->toJS("cont_ed_delete_item");
2449  $this->lng->toJS("copg_edit_iframe_title");
2450  $this->lng->toJS("copg_par_format_selection");
2451  // workaroun: we need this js for the new editor version, e.g. for new section form to work
2452  // @todo: solve this in a smarter way
2453  $this->tpl->addJavaScript("./Services/UIComponent/AdvancedSelectionList/js/AdvancedSelectionList.js");
2456  }
2457 
2458  protected function showEditLockInfo(): void
2459  {
2460  $info = $this->lng->txt("content_no_edit_lock");
2461  $lock = $this->getPageObject()->getEditLockInfo();
2462  $info .= "</br>" . $this->lng->txt("content_until") . ": " .
2463  ilDatePresentation::formatDate(new ilDateTime($lock["edit_lock_until"], IL_CAL_UNIX));
2464  $info .= "</br>" . $this->lng->txt("obj_usr") . ": " .
2465  ilUserUtil::getNamePresentation($lock["edit_lock_user"]);
2466 
2467  $back_link = $this->ui->factory()->link()->standard(
2468  $this->lng->txt("back"),
2469  $this->ctrl->getLinkTarget($this, "finishEditing")
2470  );
2471 
2472  $mbox = $this->ui->factory()->messageBox()->info($info)
2473  ->withLinks([$back_link]);
2474  $rendered_mbox = $this->ui->renderer()->render($mbox);
2475 
2476  if (!$this->ctrl->isAsynch()) {
2477  $this->tpl->setContent($rendered_mbox);
2478  } else {
2479  echo $rendered_mbox;
2480  exit;
2481  }
2482  }
2483 
2484  public function edit(): string
2485  {
2486  $this->setOutputMode(self::EDIT);
2487  $html = $this->showPage();
2488 
2489  if ($this->isEnabledNotes()) {
2490  $html .= "<br /><br />" . $this->getNotesHTML();
2491  }
2492 
2493  return $html;
2494  }
2495 
2496  public function getBlockingInfoMessage(): string
2497  {
2498  $ui = $this->ui;
2499 
2500  $lock = $this->getPageObject()->getEditLockInfo();
2501  $info = $this->lng->txt("cont_got_lock_release");
2502  $info = str_replace("%1", ilDatePresentation::formatDate(new ilDateTime($lock["edit_lock_until"], IL_CAL_UNIX)), $info);
2503 
2504  $mbox = $ui->factory()->messageBox()->info($info);
2505 
2506  return $ui->renderer()->render($mbox);
2507  }
2508 
2509  public function insertJSAtPlaceholder(): string
2510  {
2511  $pl_pc_id = $this->request->getPlaceholderPCId();
2512  $this->obj->buildDom();
2513  $this->obj->addHierIDs();
2514  $this->setOpenPlaceHolder($pl_pc_id);
2515  return $this->edit();
2516  }
2517 
2518  public function presentation(string $a_mode = self::PRESENTATION): string
2519  {
2520  $this->setOutputMode($a_mode);
2521 
2522  return $this->showPage();
2523  }
2524 
2525  public function getHTML(): string
2526  {
2527  $this->getTabs("preview");
2528  return $this->showPage();
2529  }
2530 
2534  public function showMediaFullscreen(int $a_style_id = 0): void
2535  {
2536  $this->tpl = new ilGlobalTemplate("tpl.fullscreen.html", true, true, "Services/COPage");
2537  $this->tpl->setCurrentBlock("ContentStyle");
2538  $this->tpl->setVariable("LOCATION_CONTENT_STYLESHEET", 0);
2539  $this->tpl->parseCurrentBlock();
2540 
2541  $this->tpl->setVariable(
2542  "PAGETITLE",
2543  " - " . ilObject::_lookupTitle($this->request->getMobId())
2544  );
2545  $this->tpl->setVariable("LOCATION_STYLESHEET", ilUtil::getStyleSheetLocation());
2546  $this->tpl->setCurrentBlock("ilMedia");
2547 
2548  $media_obj = new ilObjMediaObject($this->request->getMobId());
2549  if ($this->requested_pg_id > 0) {
2550  $pg_obj = ilPageObjectFactory::getInstance($this->obj->getParentType(), $this->requested_pg_id);
2551  $pg_obj->buildDom();
2552 
2553  $xml = "<dummy>";
2554  // todo: we get always the first alias now (problem if mob is used multiple
2555  // times in page)
2556  $xml .= $pg_obj->getMediaAliasElement($this->request->getMobId());
2557  } else {
2558  $xml = "<dummy>";
2559  $xml .= $media_obj->getXML(IL_MODE_ALIAS);
2560  }
2561  $xml .= $media_obj->getXML(IL_MODE_OUTPUT);
2562  $xml .= "</dummy>";
2563 
2564 
2565  $wb_path = ilFileUtils::getWebspaceDir("output") . "/";
2566  $mode = "fullscreen";
2567  $params = array('mode' => $mode,
2568  'enable_html_mob' => ilObjMediaObject::isTypeAllowed("html") ? "y" : "n",
2569  'webspace_path' => $wb_path);
2570  $output = $this->xsl->process($xml, $params);
2571 
2572  // unmask user html
2573  $this->tpl->setVariable("MEDIA_CONTENT", $output);
2574  }
2575 
2581  public function displayValidationError($a_error): void
2582  {
2583  if (is_array($a_error)) {
2584  $error_str = "<strong>Error(s):</strong><br>";
2585  foreach ($a_error as $error) {
2586  $err_mess = implode(" - ", $error);
2587  if (!is_int(strpos($err_mess, ":0:"))) {
2588  $error_str .= htmlentities($err_mess) . "<br />";
2589  }
2590  }
2591  $this->tpl->setVariable("MESSAGE", $error_str);
2592  }
2593  }
2594 
2595  protected function setBackToEditTabs(): void
2596  {
2597  $this->tabs_gui->clearTargets();
2598  $this->tabs_gui->setBackTarget(
2599  $this->lng->txt("back"),
2600  $this->ctrl->getLinkTarget($this, "edit")
2601  );
2602  }
2603 
2604  protected function setBackToHistoryTabs(): void
2605  {
2606  $this->tabs_gui->clearTargets();
2607  $this->tabs_gui->setBackTarget(
2608  $this->lng->txt("back"),
2609  $this->ctrl->getLinkTarget($this, "history")
2610  );
2611  }
2612 
2616  public function history(): string
2617  {
2618  if (!$this->getEnableEditing()) {
2619  return "";
2620  }
2621 
2622  $this->setBackToEditTabs();
2623 
2624  $this->tpl->addJavaScript("./Services/COPage/js/page_history.js");
2625 
2626  $table_gui = new ilPageHistoryTableGUI($this, "history");
2627  $table_gui->setId("hist_table");
2628  $entries = $this->getPageObject()->getHistoryEntries();
2629  $entries[] = array('page_id' => $this->getPageObject()->getId(),
2630  'parent_type' => $this->getPageObject()->getParentType(),
2631  'hdate' => $this->getPageObject()->getLastChange(),
2632  'parent_id' => $this->getPageObject()->getParentId(),
2633  'nr' => 0,
2634  'sortkey' => 999999,
2635  'user' => $this->getPageObject()->last_change_user);
2636  $table_gui->setData($entries);
2637  return $table_gui->getHTML();
2638  }
2639 
2643  public function rollbackConfirmation(): void
2644  {
2645  if (!$this->getEnableEditing()) {
2646  return;
2647  }
2648 
2649  $c_gui = new ilConfirmationGUI();
2650 
2651  // set confirm/cancel commands
2652  $this->ctrl->setParameter($this, "rollback_nr", $this->requested_old_nr);
2653  $c_gui->setFormAction($this->ctrl->getFormAction($this, "rollback"));
2654  $c_gui->setHeaderText($this->lng->txt("cont_rollback_confirmation"));
2655  $c_gui->setCancel($this->lng->txt("cancel"), "history");
2656  $c_gui->setConfirm($this->lng->txt("confirm"), "rollback");
2657 
2658  $hentry = $this->obj->getHistoryEntry($this->requested_old_nr);
2659 
2660  $c_gui->addItem(
2661  "id[]",
2662  $this->requested_old_nr,
2664  );
2665 
2666  $this->tpl->setContent($c_gui->getHTML());
2667  }
2668 
2672  public function rollback(): void
2673  {
2674  if (!$this->getEnableEditing()) {
2675  return;
2676  }
2677 
2678  $hentry = $this->obj->getHistoryEntry(
2679  $this->request->getString("rollback_nr")
2680  );
2681 
2682  if ($hentry["content"] != "") {
2683  $this->obj->setXMLContent($hentry["content"]);
2684  $this->obj->buildDom(true);
2685  if ($this->obj->update()) {
2686  $this->ctrl->redirect($this, "history");
2687  }
2688  }
2689  $this->ctrl->redirect($this, "history");
2690  }
2691 
2692  public function setScreenIdComponent(): void
2693  {
2694  $this->help->setScreenIdComponent("copg");
2695  }
2696 
2697  public function getMetaDataLink(): string
2698  {
2699  $mdtab = "";
2700  if ($this->use_meta_data) {
2701  $mdgui = new ilObjectMetaDataGUI(
2702  $this->meta_data_rep_obj,
2703  $this->meta_data_type,
2704  $this->meta_data_sub_obj_id
2705  );
2706  $mdtab = $mdgui->getTab();
2707  if ($mdtab) {
2708  $this->tabs_gui->addTarget(
2709  "meta_data",
2710  $mdtab,
2711  "",
2712  "ilobjectmetadatagui"
2713  );
2714  }
2715  }
2716  return (string) $mdtab;
2717  }
2718 
2719  public function getTabs(string $a_activate = ""): void
2720  {
2721  if (in_array($this->getOutputMode(), [self::OFFLINE])) {
2722  return;
2723  }
2724  $this->setScreenIdComponent();
2725 
2726  if (!$this->getEnabledTabs()) {
2727  return;
2728  }
2729 
2730  // back to upper context
2731  if (!$this->getEditPreview()) {
2732  $this->tabs_gui->addTarget("pg", $this->ctrl->getLinkTarget($this, "preview"), array("", "preview"));
2733  } else {
2734  $this->tabs_gui->addTarget("cont_preview", $this->ctrl->getLinkTarget($this, "preview"), array("", "preview"));
2735  }
2736 
2737  if ($this->use_meta_data) {
2738  $mdgui = new ilObjectMetaDataGUI(
2739  $this->meta_data_rep_obj,
2740  $this->meta_data_type,
2741  $this->meta_data_sub_obj_id
2742  );
2743  $mdtab = $mdgui->getTab();
2744  if ($mdtab) {
2745  $this->tabs_gui->addTarget(
2746  "meta_data",
2747  $mdtab,
2748  "",
2749  "ilobjectmetadatagui"
2750  );
2751  }
2752  }
2753 
2754  $lm_set = new ilSetting("lm");
2755 
2756  // external hook to add tabs
2757  if (is_array($this->tab_hook)) {
2758  $func = $this->tab_hook["func"];
2759  $this->tab_hook["obj"]->$func();
2760  }
2761  }
2762 
2766  public function compareVersion(): string
2767  {
2768  if (!$this->getEnableEditing()) {
2769  return "";
2770  }
2771  $this->setBackToHistoryTabs();
2772  $tpl = new ilTemplate("tpl.page_compare.html", true, true, "Services/COPage");
2773 
2774  $pg = $this->obj;
2775  $l_page = ilPageObjectFactory::getInstance($pg->getParentType(), $pg->getId(), $this->request->getInt("left"), $pg->getLanguage());
2776  $r_page = ilPageObjectFactory::getInstance($pg->getParentType(), $pg->getId(), $this->request->getInt("right"), $pg->getLanguage());
2777 
2778  $compare = $this->compare->compare(
2779  $this->getPageObject(),
2780  $l_page,
2781  $r_page
2782  );
2783 
2784  // left page
2785  $lpage = $compare["l_page"];
2786  $cfg = $this->getPageConfig();
2787  $cfg->setPreventHTMLUnmasking(true);
2788 
2789  $this->setOutputMode(self::PREVIEW);
2790  $this->setPageObject($lpage);
2791  $this->setPresentationTitle($this->getPresentationTitle());
2792  $this->setCompareMode(true);
2793 
2794  $lhtml = $this->showPage();
2795  $lhtml = $this->replaceDiffTags($lhtml);
2796  $lhtml = str_replace("&lt;br /&gt;", "<br />", $lhtml);
2797  $tpl->setVariable("LEFT", $lhtml);
2798 
2799  // right page
2800  $rpage = $compare["r_page"];
2801  $this->setPageObject($rpage);
2802  $this->setPresentationTitle($this->getPresentationTitle());
2803  $this->setCompareMode(true);
2804  $this->setOutputMode(self::PREVIEW);
2805 
2806  $rhtml = $this->showPage();
2807  $rhtml = $this->replaceDiffTags($rhtml);
2808  $rhtml = str_replace("&lt;br /&gt;", "<br />", $rhtml);
2809  $tpl->setVariable("RIGHT", $rhtml);
2810 
2811  $tpl->setVariable("TXT_NEW", $this->lng->txt("cont_pc_new"));
2812  $tpl->setVariable("TXT_MODIFIED", $this->lng->txt("cont_pc_modified"));
2813  $tpl->setVariable("TXT_DELETED", $this->lng->txt("cont_pc_deleted"));
2814 
2815  return $tpl->get();
2816  }
2817 
2818  public function replaceDiffTags(string $a_html): string
2819  {
2820  $a_html = str_replace("[ilDiffInsStart]", '<span class="ilDiffIns">', $a_html);
2821  $a_html = str_replace("[ilDiffDelStart]", '<span class="ilDiffDel">', $a_html);
2822  $a_html = str_replace("[ilDiffInsEnd]", '</span>', $a_html);
2823  $a_html = str_replace("[ilDiffDelEnd]", '</span>', $a_html);
2824 
2825  return $a_html;
2826  }
2827 
2831  public function editActivation(): void
2832  {
2833  $this->setBackToEditTabs();
2834 
2835  $atpl = new ilTemplate("tpl.page_activation.php", true, true, "Services/COPage");
2836  $this->initActivationForm();
2837  $this->getActivationFormValues();
2838  $atpl->setVariable("FORM", $this->form->getHTML());
2839  $this->tpl->setContent($atpl->get());
2840  }
2841 
2845  public function initActivationForm(): void
2846  {
2847  $this->form = new ilPropertyFormGUI();
2848  $this->form->setFormAction($this->ctrl->getFormAction($this));
2849  $this->form->setTitle($this->lng->txt("cont_page_activation"));
2850 
2851  // activation type radio
2852  $rad = new ilRadioGroupInputGUI($this->lng->txt("cont_activation"), "activation");
2853  $rad_op1 = new ilRadioOption($this->lng->txt("cont_activated"), "activated");
2854 
2855  $rad->addOption($rad_op1);
2856  $rad_op2 = new ilRadioOption($this->lng->txt("cont_deactivated"), "deactivated");
2857  $rad->addOption($rad_op2);
2858  $rad_op3 = new ilRadioOption($this->lng->txt("cont_scheduled_activation"), "scheduled");
2859 
2860  $dt_prop = new ilDateTimeInputGUI($this->lng->txt("cont_start"), "start");
2861  $dt_prop->setRequired(true);
2862  $dt_prop->setShowTime(true);
2863  $rad_op3->addSubItem($dt_prop);
2864  $dt_prop2 = new ilDateTimeInputGUI($this->lng->txt("cont_end"), "end");
2865  $dt_prop2->setRequired(true);
2866  $dt_prop2->setShowTime(true);
2867  $rad_op3->addSubItem($dt_prop2);
2868 
2869  // show activation information
2870  $cb = new ilCheckboxInputGUI($this->lng->txt("cont_show_activation_info"), "show_activation_info");
2871  $cb->setInfo($this->lng->txt("cont_show_activation_info_info"));
2872  $rad_op3->addSubItem($cb);
2873 
2874 
2875  $rad->addOption($rad_op3);
2876 
2877  $this->form->addCommandButton("saveActivation", $this->lng->txt("save"));
2878 
2879  $this->form->addItem($rad);
2880  }
2881 
2885  public function getActivationFormValues(): void
2886  {
2887  $activation = "deactivated";
2888  if ($this->getPageObject()->getActive()) {
2889  $activation = "activated";
2890  }
2891 
2892  $dt_prop = $this->form->getItemByPostVar("start");
2893  if ($this->getPageObject()->getActivationStart() != "") {
2894  $activation = "scheduled";
2895  $dt_prop->setDate(new ilDateTime(
2896  $this->getPageObject()->getActivationStart(),
2898  ));
2899  }
2900  $dt_prop = $this->form->getItemByPostVar("end");
2901  if ($this->getPageObject()->getActivationEnd() != "") {
2902  $activation = "scheduled";
2903  $dt_prop->setDate(new ilDateTime(
2904  $this->getPageObject()->getActivationEnd(),
2906  ));
2907  }
2908 
2909  $this->form->getItemByPostVar("activation")->setValue($activation);
2910  $this->form->getItemByPostVar("show_activation_info")->setChecked($this->getPageObject()->getShowActivationInfo());
2911  }
2912 
2916  public function saveActivation(): void
2917  {
2918  $this->initActivationForm();
2919 
2920  if ($this->form->checkInput()) {
2921  $this->getPageObject()->setActive(true);
2922  $this->getPageObject()->setActivationStart(null);
2923  $this->getPageObject()->setActivationEnd(null);
2924  $this->getPageObject()->setShowActivationInfo(
2925  $this->request->getString("show_activation_info")
2926  );
2927  $activation = $this->request->getString("activation");
2928  if ($activation == "deactivated") {
2929  $this->getPageObject()->setActive(false);
2930  }
2931  if ($activation == "scheduled") {
2932  $this->getPageObject()->setActive(false);
2933  $this->getPageObject()->setActivationStart(
2934  $this->form->getItemByPostVar("start")->getDate()->get(IL_CAL_DATETIME)
2935  );
2936  $this->getPageObject()->setActivationEnd(
2937  $this->form->getItemByPostVar("end")->getDate()->get(IL_CAL_DATETIME)
2938  );
2939  }
2940  $this->getPageObject()->update();
2941  $this->tpl->setOnScreenMessage('success', $this->lng->txt("msg_obj_modified"), true);
2942  $this->ctrl->redirect($this, "editActivation");
2943  }
2944  $this->form->setValuesByPost();
2945  $this->tpl->setContent($this->form->getHTML());
2946  }
2947 
2951  public function getNotesHTML(
2952  object $a_content_object = null,
2953  bool $a_enable_private_notes = true,
2954  bool $a_enable_public_notes = false,
2955  bool $a_enable_notes_deletion = false,
2956  callable $a_callback = null,
2957  bool $export = false
2958  ): string {
2959  // scorm 2004 page gui
2960  if (!$a_content_object) {
2961  throw new ilException("No content object given.");
2962  /*
2963  $notes_gui = new ilNoteGUI(
2964  $this->notes_parent_id,
2965  $this->obj->getId(),
2966  "pg"
2967  );
2968 
2969  $a_enable_private_notes = true;
2970  $a_enable_public_notes = true;
2971  $a_enable_notes_deletion = false;
2972  $notes_gui->setUseObjectTitleHeader(false);*/
2973  }
2974  // wiki page gui, blog posting gui
2975  else {
2976  /*
2977  $notes_gui = new ilNoteGUI(
2978  $a_content_object->getParentId(),
2979  $a_content_object->getId(),
2980  $a_content_object->getParentType()
2981  );*/
2982  $comments_gui = $this->notes->gui()->getCommentsGUI(
2983  $a_content_object->getParentId(),
2984  $a_content_object->getId(),
2985  $a_content_object->getParentType()
2986  );
2987  $comments_gui->setUseObjectTitleHeader(false);
2988  }
2989 
2990  if ($a_enable_private_notes) {
2991  $comments_gui->enablePrivateNotes();
2992  }
2993  if ($a_enable_public_notes) {
2994  $comments_gui->enablePublicNotes();
2995  if ($a_enable_notes_deletion) {
2996  $comments_gui->enablePublicNotesDeletion(true);
2997  }
2998  }
2999  if ($export) {
3000  $comments_gui->setExportMode();
3001  }
3002 
3003  if ($a_callback) {
3004  $comments_gui->addObserver($a_callback);
3005  }
3006 
3007  $next_class = $this->ctrl->getNextClass($this);
3008  if (in_array($next_class, ["ilnotegui", "ilcommentgui"])) {
3009  $html = $this->ctrl->forwardCommand($comments_gui);
3010  } else {
3011  $html = $comments_gui->getListHTML();
3012  }
3013  return $html;
3014  }
3015 
3019  public function processAnswer(): void
3020  {
3022  $this->request->getString("type"),
3023  $this->request->getString("id"),
3024  $this->request->getString("answer")
3025  );
3026  }
3027 
3028 
3029  //
3030  // Initially opened content (e.g. used in learning modules), that
3031  // is presented in another than the main content area (e.g. a picture in
3032  // the bottom left area)
3033  //
3034 
3038  public function initialOpenedContent(): void
3039  {
3040  $this->tabs_gui->activateTab("edit");
3041  $form = $this->initOpenedContentForm();
3042  $this->tpl->setContent($form->getHTML());
3043  }
3044 
3046  {
3047  $form = new ilPropertyFormGUI();
3048 
3049  // link input
3050  $ac = new ilLinkInputGUI($this->lng->txt('cont_resource'), 'opened_content');
3052  $ac->setInternalLinkDefault("Media_Media", 0);
3053  $ac->setInternalLinkFilterTypes(array("PageObject_FAQ", "GlossaryItem", "Media_Media", "Media_FAQ"));
3054  $val = $this->obj->getInitialOpenedContent();
3055  if (($val["id"] ?? '') != "" && ($val["type"] ?? '') != "") {
3056  $ac->setValue($val["type"] . "|" . $val["id"] . "|" . $val["target"]);
3057  }
3058 
3059  $form->addItem($ac);
3060 
3061  $form->addCommandButton("saveInitialOpenedContent", $this->lng->txt("save"));
3062  $form->addCommandButton("edit", $this->lng->txt("cancel"));
3063  $form->setTitle($this->lng->txt("cont_initial_attached_content"));
3064  $form->setFormAction($this->ctrl->getFormAction($this));
3065 
3066  return $form;
3067  }
3068 
3069  public function saveInitialOpenedContent(): void
3070  {
3071  $this->obj->saveInitialOpenedContent(
3072  $this->request->getString("opened_content_ajax_type"),
3073  $this->request->getInt("opened_content_ajax_id"),
3074  $this->request->getString("opened_content_ajax_target")
3075  );
3076 
3077  $this->tpl->setOnScreenMessage('success', $this->lng->txt("msg_obj_modified"));
3078  $this->ctrl->redirect($this, "edit");
3079  }
3080 
3084 
3085 
3089  public function switchToLanguage(): void
3090  {
3091  $l = $this->request->getString("totransl");
3092  $p = $this->getPageObject();
3093  if (!$this->checkLangPageAvailable($p->getId(), $l)) {
3095  return;
3096  }
3097  $this->ctrl->setParameter($this, "transl", $l);
3098  $this->ctrl->redirect($this, "edit");
3099  }
3100 
3101  protected function checkLangPageAvailable(int $id, string $lang): bool
3102  {
3103  $p = $this->getPageObject();
3104  return ilPageObject::_exists($this->getParentType(), $id, $lang);
3105  }
3106 
3110  public function confirmPageTranslationCreation(): void
3111  {
3112  $l = $this->request->getString("totransl");
3113  $this->ctrl->setParameter($this, "totransl", $l);
3114  $this->lng->loadLanguageModule("meta");
3115 
3116  $cgui = new ilConfirmationGUI();
3117  $cgui->setFormAction($this->ctrl->getFormAction($this));
3118  $cgui->setHeaderText($this->lng->txt("cont_page_translation_does_not_exist") . ": " .
3119  $this->lng->txt("meta_l_" . $l));
3120  $cgui->setCancel($this->lng->txt("cancel"), "editMasterLanguage");
3121  $cgui->setConfirm($this->lng->txt("confirm"), "createPageTranslation");
3122  $this->tpl->setContent($cgui->getHTML());
3123  }
3124 
3128  public function editMasterLanguage(): void
3129  {
3130  $this->ctrl->setParameter($this, "transl", "-");
3131  $this->ctrl->redirect($this, "edit");
3132  }
3133 
3137  public function createPageTranslation(): void
3138  {
3139  $l = $this->request->getString("totransl");
3140 
3142  $this->getPageObject()->getParentType(),
3143  $this->getPageObject()->getId(),
3144  0,
3145  "-"
3146  );
3147 
3148  $p->copyPageToTranslation($l);
3149  $this->ctrl->setParameter($this, "transl", $l);
3150  $this->ctrl->redirect($this, "edit");
3151  }
3152 
3156  public function releasePageLock(): void
3157  {
3158  $this->getPageObject()->releasePageLock();
3159  $this->tpl->setOnScreenMessage('success', $this->lng->txt("cont_page_lock_released"), true);
3160  $this->finishEditing();
3161  }
3162 
3163  public function finishEditing(): void
3164  {
3165  $this->ctrl->redirect($this, "preview");
3166  }
3167 
3168  protected function isPageContainerToBeRendered(): bool
3169  {
3170  return (
3171  $this->getRenderPageContainer() || ($this->getOutputMode() == self::PREVIEW && $this->getPageConfig()->getUsePageContainer())
3172  );
3173  }
3174 
3175  public function getPagePermaLink(): string
3176  {
3177  return "";
3178  }
3179 
3183  protected function addResourcesToTemplate(ilGlobalTemplateInterface $tpl): void
3184  {
3185  $collector = new \ILIAS\COPage\ResourcesCollector($this->getOutputMode(), $this->getPageObject());
3186 
3187  foreach ($collector->getJavascriptFiles() as $js) {
3188  $tpl->addJavaScript($js);
3189  }
3190 
3191  foreach ($collector->getCssFiles() as $css) {
3192  $tpl->addCss($css);
3193  }
3194 
3195  foreach ($collector->getOnloadCode() as $code) {
3196  $tpl->addOnLoadCode($code);
3197  }
3198  }
3199 
3203  public function getAdditionalPageActions(): array
3204  {
3205  return [];
3206  }
3207 
3208  public function afterDeleteContents(): void
3209  {
3210  }
3211 
3212 }
printToStdout(string $part=self::DEFAULT_BLOCK, bool $has_tabs=true, bool $skip_main_menu=false)
static getWebspaceDir(string $mode="filesystem")
get webspace directory
ILIAS DI UIServices $ui
setLinkFrame(string $l_frame="")
setEditPreview(bool $a_editpreview)
Set Display first Edit tab, then Preview tab, instead of Page and Edit.
history()
Get history table as HTML.
releasePageLock()
Release page lock.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static getTinyMenu(string $a_par_type, bool $a_int_links=false, bool $a_wiki_links=false, bool $a_keywords=false, $a_style_id=0, $a_paragraph_styles=true, $a_save_return=true, $a_anchors=false, $a_save_new=true, $a_user_links=false, \ILIAS\COPage\Editor\Server\UIWrapper $ui_wrapper=null)
Get Tiny Menu.
setOpenPlaceHolder(string $a_val)
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 lookupSettingByParentType(string $a_par_type, string $a_name, string $a_default='0')
Lookup setting by parent type.
setActivationListener(object $a_obj, string $a_meth)
ILIAS COPage Page PageManager $pm
exit
Definition: login.php:29
static getInitHTML(string $a_url)
Get initialisation HTML to use internal link editing.
rollbackConfirmation()
Rollback confirmation.
setEditorToolContext()
Set editor tool context.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
setAllowedLinkTypes(string $a_val)
Set allowed link types (LIST, BOTH, INT, EXT)
initActivationForm()
Init activation form.
getLinkTargetByClass( $a_class, string $a_cmd=null, string $a_anchor=null, bool $is_async=false, bool $has_xml_style=false)
const ILIAS_VERSION
postOutputProcessing(string $a_output)
Finalizing output processing.
const IL_CAL_DATETIME
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
editMasterLanguage()
Edit master language.
ILIAS COPage PageLinker $page_linker
const ANONYMOUS_USER_ID
Definition: constants.php:27
static getLogger(string $a_component_id)
Get component logger.
static collectContentIncludes(ilPageObject $a_page, DOMDocument $a_domdoc)
get all content includes that are used within the page
enableNotes(bool $a_enabled, int $a_parent_id)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
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...
setViewPageLink(string $a_link, string $a_target="")
set link for "view page" button
setParentType(string $a_val)
ILIAS GlobalScreen ScreenContext ContextServices $tool_context
special template class to simplify handling of ITX/PEAR
setOutputMode(string $a_mode=self::PRESENTATION)
touchBlock(string $block)
overwrites ITX::touchBlock.
if(! $DIC->user() ->getId()||!ilLTIConsumerAccess::hasCustomProviderCreationAccess()) $params
Definition: ltiregstart.php:33
setPageBackTitle(string $a_title)
Class ChatMainBarProvider .
replaceCurlyBrackets(string $output)
setPageLinker(\ILIAS\COPage\PageLinker $page_linker)
static includePresentationJS(ilGlobalTemplateInterface $a_tpl=null)
Include media object presentation JS.
static getImagePath(string $img, string $module_path="", string $mode="output", bool $offline=false)
get image path (for images located in a template directory)
compareVersion()
Compares two revisions of the page.
Help GUI class.
static initJS(ilGlobalTemplateInterface $a_main_tpl=null)
Class ilPageObjectGUI.
getAdvMdRecordObject()
Get adv md record type.
static _getListCharacteristics(int $a_style_id, string $type)
User Interface for NewsItem entities.
static formatDate(ilDateTime $date, bool $a_skip_day=false, bool $a_include_wd=false, bool $include_seconds=false)
setLanguage(string $a_val)
setTemplateTargetVar(string $a_variable)
get(string $part=self::DEFAULT_BLOCK)
Renders the given block and returns the html string.
confirmPageTranslationCreation()
Confirm page translation creation.
static formSelect( $selected, string $varname, array $options, bool $multiple=false, bool $direct_text=false, int $size=0, string $style_class="", array $attribs=[], bool $disabled=false)
Builds a select form field with options and shows the selected option first.
setPageConfig(ilPageConfig $a_val)
static lookupTitle(int $a_page_id)
setEnabledPageFocus(bool $a_enabledpagefocus)
ILIAS COPage InternalGUIService $gui
presentation(string $a_mode=self::PRESENTATION)
static _lookupOwner(int $obj_id)
Lookup owner user ID for object ID.
EditSessionRepository $edit_repo
loadLanguageModule(string $a_module)
Load language module.
setOfflineDirectory(string $offdir)
setHeader(string $a_title="")
Internal link selector.
setQEditTabs(string $a_active)
Set question editing tabs.
setVariable(string $variable, $value='')
Sets the given variable to the given value.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
showEditToolbar()
Show edit toolbar.
executeCommand()
execute command
getActivationFormValues()
Get values for activation form.
const IL_CAL_UNIX
saveActivation()
Save Activation.
switchToLanguage()
Switch to language.
insertResources(string $a_output)
static getStyleSheetLocation(string $mode="output", string $a_css_name="", string $a_css_location="")
get full style sheet file name (path inclusive) of current user
static saveQuestionAnswer(string $a_type, int $a_id, string $a_answer)
static hasSuccessorPage(int $a_cont_obj_id, int $a_page_id)
checks if page has a successor page
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
setStyleId(int $a_styleid)
replaceDiffTags(string $a_html)
static _getQuestionGUI(string $question_type='', int $question_id=-1)
Creates a question gui representation and returns the alias to the question gui.
previewHistory()
Preview history.
Page Editor GUI class.
setTabHook(object $a_object, string $a_function)
setTemplateOutput(bool $a_output=true)
This class represents a date/time property in a property form.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static insertResourcesIntoPageContent(string $a_content)
Insert resources (see also ilContainerContentGUI::determinePageEmbeddedBlocks for presentation) ...
global $DIC
Definition: feed.php:28
static addJavaScript(ilGlobalTemplate $main_tpl=null)
Add javascript files that are necessary to run accordion.
ILIAS TestQuestionPool QuestionInfoService $questioninfo
GUI class for public user profile presentation.
setAdvMdRecordObject(int $a_adv_ref_id, string $a_adv_type, string $a_adv_subtype="-")
Set object, that defines the adv md records being used.
addResourcesToTemplate(ilGlobalTemplateInterface $tpl)
Add resources to template.
static _exists(int $id, bool $reference=false, ?string $type=null)
checks if an object exists in object_data
This class represents a property in a property form.
static addCss()
Add required css.
static getNamePresentation( $a_user_id, bool $a_user_image=false, bool $a_profile_link=false, string $a_profile_back_link='', bool $a_force_first_lastname=false, bool $a_omit_login=false, bool $a_sortable=true, bool $a_return_data_array=false, $a_ctrl_path='ilpublicuserprofilegui')
Default behaviour is:
static _lookupTitle(int $obj_id)
__construct(string $a_parent_type, int $a_id, int $a_old_nr=0, bool $a_prevent_get_id=false, string $a_lang="", string $concrete_lang="")
setFormAction(string $a_formaction)
setRenderPageContainer(bool $a_val)
setRawPageContent(bool $a_rawpagecontent)
Set Get raw page content only.
static _exists(string $a_parent_type, int $a_id, string $a_lang="", bool $a_no_cache=false)
Checks whether page exists.
setEnabledHref(bool $enable)
static isTypeAllowed(string $a_type)
getComponentPluginsXML()
Put information about activated plugins into XML.
ILIAS COPage Link LinkManager $link
ilGlobalTemplateInterface $tpl
getEnablePCType(string $a_pc_type)
setPageObject(ilPageObject $a_pg_obj)
setAbstractOnly(bool $a_val, string $pcid="")
Get only abstract (first text paragraph)
Class ilPageObject Handles PageObjects of ILIAS Learning Modules (see ILIAS DTD)
ILIAS COPage Editor GUIService $editor_gui
enableChangeComments(bool $a_enabled)
ilAccessHandler $access
download_paragraph()
download source code paragraph
ilComponentFactory $component_factory
string $key
Consumer key/client ID value.
Definition: System.php:193
static _getMapAreasIntLinks(int $a_mob_id)
get all internal links of map areas of a mob
static initjQueryUI(ilGlobalTemplateInterface $a_tpl=null)
inits and adds the jQuery-UI JS-File to the global template (see included_components.txt for included components)
setFullscreenLink(string $a_fullscreen_link)
getTabs(string $a_activate="")
$url
Definition: ltiregstart.php:35
addJavaScript(string $a_js_file, bool $a_add_version_parameter=true, int $a_batch=2)
Add a javascript file that should be included in the header.
setSourcecodeDownloadScript(string $script_name)
setPresentationTitle(string $a_title="")
setRequired(bool $a_required)
static addTooltip(string $a_el_id, string $a_text, string $a_container="", string $a_my="bottom center", string $a_at="top center", bool $a_use_htmlspecialchars=true)
addOnLoadCode(string $a_code, int $a_batch=2)
Add on load code.
const IL_MODE_ALIAS
static getContentStylePath(int $a_style_id, bool $add_random=true, bool $add_token=true)
get content style path static (to avoid full reading)
addCommandButton(string $a_cmd, string $a_text, string $a_id="")
editActivation()
Edit activation (only, if scheduled page activation is activated in administration) ...
displayMedia(bool $a_fullscreen=false)
getActivationCaptions()
Get captions for activation action menu entries.
setCurrentBlock(string $part=self::DEFAULT_BLOCK)
Sets the template to the given block.
$lang
Definition: xapiexit.php:26
static isActivated()
Checks whether Map feature is activated.
setFileDownloadLink(string $a_download_link)
ILIAS Notes Service $notes
form( $class_path, string $cmd, string $submit_caption="")
setQuestionHTML(array $question_html)
ILIAS COPage Compare PageCompare $compare
initialOpenedContent()
Initially opened content.
rollback()
Rollback to a previous version.
activateMetaDataEditor(ilObject $a_rep_obj, string $a_type, int $a_sub_obj_id, object $a_observer_obj=null, string $a_observer_func="")
Activate meda data editor.
$lm_set
static initjQuery(ilGlobalTemplateInterface $a_tpl=null)
inits and adds the jQuery JS-File to the global or a passed template
static getInstance()
Singleton: get instance for use in ILIAS requests with a config loaded from the settings.
setTemplate(ilGlobalTemplateInterface $main_tpl)
EditGUIRequest $request
setEditMode()
Set edit mode.
ILIAS COPage Xsl XslManager $xsl
getAdditionalPageActions()
Get additional page actions.
static getFlashVideoPlayerFilename(bool $a_fullpath=false)
initPageObject()
Init page object.
showPage()
display content of page
link(string $caption, string $href, bool $new_viewport=false)
getNotesHTML(object $a_content_object=null, bool $a_enable_private_notes=true, bool $a_enable_public_notes=false, bool $a_enable_notes_deletion=false, callable $a_callback=null, bool $export=false)
Get html for public and/or private notes.
setIntLinkReturn(string $a_return)
Page component editing request.
const IL_MODE_OUTPUT
insertPageToc(string $a_output)
setOldNr(int $a_val)
Set old nr (historic page)
processAnswer()
Process answer.
parseCurrentBlock(string $block_name=self::DEFAULT_BLOCK)
Parses the given block.
static _lookupType(int $id, bool $reference=false)
ilPropertyFormGUI $form
setProfileBackUrl(string $url)
setEnabledTabs(bool $a_enabledtabs)
setEnabledNews(bool $a_enabled, int $a_news_obj_id=0, string $a_news_obj_type="")
static getCacheTriggerString(ilPageObject $a_page)
Get page cache update trigger string.
setPrependingHtml(string $a_prependinghtml)
ILIAS COPage PC PCDefinition $pc_definition
createPageTranslation()
Create page translation.
showMediaFullscreen(int $a_style_id=0)
show fullscreen view of media object
This class represents a external and/or internal link in a property form.
static getInstance(string $a_parent_type, int $a_id=0, int $a_old_nr=0, string $a_lang="-")
Get page object instance.
setEnablePCType(string $a_pc_type, bool $a_val)
insertAdvTrigger(string $a_output)
Insert adv content trigger.
static initMediaElementJs(ilGlobalTemplateInterface $a_tpl=null)
Init mediaelement.js scripts.
checkLangPageAvailable(int $id, string $lang)
setLinkParams(string $l_params="")
setTabs(ilTabsGUI $a_tabs)
setEnableEditing(bool $a_enableediting)
displayValidationError($a_error)
display validation error
addCss(string $a_css_file, string $media="screen")
Add a css file that should be included in the header.