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