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