ILIAS  release_8 Revision v8.19
All Data Structures Namespaces Files Functions Variables Modules Pages
class.ilContentPagePageCommandForwarder.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
25 
27 {
31  public const PRESENTATION_MODE_EDITING = 'PRESENTATION_MODE_EDITING';
32 
36  public const PRESENTATION_MODE_PRESENTATION = 'PRESENTATION_MODE_PRESENTATION';
37 
41  public const PRESENTATION_MODE_EMBEDDED_PRESENTATION = 'PRESENTATION_MODE_EMBEDDED_PRESENTATION';
42  public const PRESENTATION_MODE_PREVIEW = 'PRESENTATION_MODE_PREVIEW';
43 
44  protected string $presentationMode = self::PRESENTATION_MODE_EDITING;
46  protected ilLanguage $lng;
47  protected ilTabsGUI $tabs;
49  protected string $backUrl = '';
50  protected ilObjUser $actor;
52  protected array $updateListeners = [];
54  protected Refinery $refinery;
56  protected bool $isMediaRequest = false;
57 
58  public function __construct(
59  GlobalHttpState $http,
60  ilCtrlInterface $ctrl,
61  ilTabsGUI $tabs,
62  ilLanguage $lng,
63  ilObjContentPage $parentObject,
64  ilObjUser $actor,
65  Refinery $refinery,
66  ObjectFacade $content_style_domain
67  ) {
68  $this->http = $http;
69  $this->ctrl = $ctrl;
70  $this->tabs = $tabs;
71  $this->lng = $lng;
72  $this->parentObject = $parentObject;
73  $this->actor = $actor;
74  $this->refinery = $refinery;
75  $this->content_style_domain = $content_style_domain;
76 
77  $this->lng->loadLanguageModule('content');
78 
79  $this->backUrl = '';
80  if ($this->http->wrapper()->query()->has('backurl')) {
81  $this->backUrl = $this->http->wrapper()->query()->retrieve(
82  'backurl',
83  $this->refinery->kindlyTo()->string()
84  );
85  }
86 
87  if ($this->backUrl !== '') {
88  $this->ctrl->setParameterByClass(ilContentPagePageGUI::class, 'backurl', rawurlencode($this->backUrl));
89  }
90  }
91 
92  public function setIsMediaRequest(bool $isMediaRequest): void
93  {
94  $this->isMediaRequest = $isMediaRequest;
95  }
96 
100  public function onPageUpdate(array $parameters): void
101  {
102  foreach ($this->updateListeners as $listener) {
103  $listener(new PageUpdatedEvent($parameters['page']));
104  }
105  }
106 
107  public function addPageTabs(): void
108  {
109  $this->ctrl->setParameterByClass(ilObjectContentStyleSettingsGUI::class, self::HTTP_PARAM_PAGE_EDITOR_STYLE_CONTEXT, '1');
110  $this->tabs->addTarget(
111  'obj_sty',
112  $this->ctrl->getLinkTargetByClass(ilObjectContentStyleSettingsGUI::class),
113  'editStyleProperties',
114  strtolower(ilObjectContentStyleSettingsGUI::class)
115  );
116  $this->ctrl->setParameterByClass(ilObjContentPageGUI::class, self::HTTP_PARAM_PAGE_EDITOR_STYLE_CONTEXT, null);
117  }
118 
122  public function updateContentPageOnPageUpdate(array $parameters): void
123  {
124  $this->parentObject->update();
125  }
126 
127  public function addUpdateListener(callable $updateListener): void
128  {
129  $this->updateListeners[] = $updateListener;
130  }
131 
132  protected function getPageObjectGUI(string $language, bool $isEmbedded = false): ilContentPagePageGUI
133  {
134  $pageObjectGUI = new ilContentPagePageGUI($this->parentObject->getId(), 0, $isEmbedded, $language);
135  $pageObjectGUI->setStyleId(
136  $this->content_style_domain->getEffectiveStyleId()
137  );
138 
139  $pageObjectGUI->obj->addUpdateListener($this, 'updateContentPageOnPageUpdate', []);
140 
141  return $pageObjectGUI;
142  }
143 
144  protected function doesPageExistsForLanguage(string $language): bool
145  {
146  return ilContentPagePage::_exists($this->parentObject->getType(), $this->parentObject->getId(), $language);
147  }
148 
149  protected function ensurePageObjectExists(string $language): void
150  {
151  if (!$this->doesPageExistsForLanguage($language)) {
152  $pageObject = new ilContentPagePage();
153  $pageObject->setParentId($this->parentObject->getId());
154  $pageObject->setId($this->parentObject->getId());
155  $pageObject->setLanguage($language);
156  $pageObject->createFromXML();
157  }
158  }
159 
160  protected function setBackLinkTab(): void
161  {
162  $backUrl = $this->ctrl->getLinkTargetByClass(ilContentPagePageGUI::class, self::UI_CMD_COPAGE_EDIT);
163  if ($this->backUrl !== '') {
164  $backUrlParts = parse_url(ilUtil::stripSlashes($this->backUrl));
165 
166  $script = basename($backUrlParts['path']);
167 
168  $backUrl = './' . implode('?', [
169  $script, $backUrlParts['query']
170  ]);
171  }
172 
173  $this->tabs->setBackTarget($this->lng->txt('back'), $backUrl);
174  }
175 
176  protected function buildEditingPageObjectGUI(string $language): ilContentPagePageGUI
177  {
178  $this->tabs->clearTargets();
179 
180  $this->setBackLinkTab();
181 
182  $this->ensurePageObjectExists($language);
183 
184  $pageObjectGUI = $this->getPageObjectGUI($language);
185  $pageObjectGUI->setEnabledTabs(true);
186 
187  $page = $pageObjectGUI->getPageObject();
188  $page->addUpdateListener($this, 'onPageUpdate', ['page' => $page]);
189 
190  $pageObjectGUI->setTabHook($this, 'addPageTabs');
191 
192  return $pageObjectGUI;
193  }
194 
195  protected function buildPresentationPageObjectGUI(string $language): ilContentPagePageGUI
196  {
197  $this->ensurePageObjectExists($language);
198 
199  $pageObjectGUI = $this->getPageObjectGUI($language);
200  $pageObjectGUI->setEnabledTabs(false);
201 
202  $pageObjectGUI->setStyleId(
203  $this->content_style_domain->getEffectiveStyleId()
204  );
205 
206  return $pageObjectGUI;
207  }
208 
209  protected function buildPreviewPageObjectGUI(string $language): ilContentPagePageGUI
210  {
211  $this->ensurePageObjectExists($language);
212 
213  $pageObjectGUI = $this->getPageObjectGUI($language);
214 
215  $pageObjectGUI->setStyleId(
216  $this->content_style_domain->getEffectiveStyleId()
217  );
218 
219  $pageObjectGUI->setTabHook($this, 'addPageTabs');
220 
221  return $pageObjectGUI;
222  }
223 
224  protected function buildEmbeddedPresentationPageObjectGUI(string $language): ilContentPagePageGUI
225  {
226  $this->ensurePageObjectExists($language);
227 
228  $pageObjectGUI = $this->getPageObjectGUI($language, true);
229  $pageObjectGUI->setEnabledTabs(false);
230 
231  $pageObjectGUI->setStyleId(
232  $this->content_style_domain->getEffectiveStyleId()
233  );
234 
235  return $pageObjectGUI;
236  }
237 
238  public function setPresentationMode(string $presentationMode): void
239  {
240  $this->presentationMode = $presentationMode;
241  }
242 
249  public function forward(string $ctrlLink = ''): string
250  {
251  $ot = ilObjectTranslation::getInstance($this->parentObject->getId());
252  $language = $ot->getEffectiveContentLang($this->actor->getCurrentLanguage(), $this->parentObject->getType());
253 
254  switch ($this->presentationMode) {
255  case self::PRESENTATION_MODE_EDITING:
256 
257  $pageObjectGui = $this->buildEditingPageObjectGUI($this->isMediaRequest ? $language : '');
258  return (string) $this->ctrl->forwardCommand($pageObjectGui);
259 
260  case self::PRESENTATION_MODE_PREVIEW:
261  $pageObjectGui = $this->buildPreviewPageObjectGUI($this->isMediaRequest ? $language : '');
262  return $this->ctrl->getHTML($pageObjectGui);
263 
264  case self::PRESENTATION_MODE_PRESENTATION:
265  $pageObjectGUI = $this->buildPresentationPageObjectGUI($language);
266 
267  if (is_string($ctrlLink) && $ctrlLink !== '') {
268  $pageObjectGUI->setFileDownloadLink($ctrlLink . '&cmd=' . self::UI_CMD_COPAGE_DOWNLOAD_FILE);
269  $pageObjectGUI->setFullscreenLink($ctrlLink . '&cmd=' . self::UI_CMD_COPAGE_DISPLAY_FULLSCREEN);
270  $pageObjectGUI->setSourcecodeDownloadScript($ctrlLink . '&cmd=' . self::UI_CMD_COPAGE_DOWNLOAD_PARAGRAPH);
271  }
272 
273  return $this->ctrl->getHTML($pageObjectGUI);
274 
275  case self::PRESENTATION_MODE_EMBEDDED_PRESENTATION:
276  $pageObjectGUI = $this->buildEmbeddedPresentationPageObjectGUI($language);
277 
278  if (is_string($ctrlLink) && $ctrlLink !== '') {
279  $pageObjectGUI->setFileDownloadLink($ctrlLink . '&cmd=' . self::UI_CMD_COPAGE_DOWNLOAD_FILE);
280  $pageObjectGUI->setFullscreenLink($ctrlLink . '&cmd=' . self::UI_CMD_COPAGE_DISPLAY_FULLSCREEN);
281  $pageObjectGUI->setSourcecodeDownloadScript($ctrlLink . '&cmd=' . self::UI_CMD_COPAGE_DOWNLOAD_PARAGRAPH);
282  }
283 
284  return $pageObjectGUI->getHTML();
285 
286  default:
287  throw new ilException('Unknown presentation mode given');
288  }
289  }
290 }
Interface GlobalHttpState.
getPageObjectGUI(string $language, bool $isEmbedded=false)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static stripSlashes(string $a_str, bool $a_strip_html=true, string $a_allow="")
const PRESENTATION_MODE_EMBEDDED_PRESENTATION
presentation mode for embedded presentation, e.g.
External facade for object content styles.
static http()
Fetches the global http state from ILIAS.
static _exists(string $a_parent_type, int $a_id, string $a_lang="", bool $a_no_cache=false)
Checks whether page exists.
static getInstance(int $obj_id)
const PRESENTATION_MODE_PRESENTATION
presentation mode for requesting
const PRESENTATION_MODE_EDITING
presentation mode for authoring
__construct(GlobalHttpState $http, ilCtrlInterface $ctrl, ilTabsGUI $tabs, ilLanguage $lng, ilObjContentPage $parentObject, ilObjUser $actor, Refinery $refinery, ObjectFacade $content_style_domain)