‪TYPO3CMS  ‪main
PageInformationFactory.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use Psr\EventDispatcher\EventDispatcherInterface;
21 use Psr\Http\Message\ServerRequestInterface;
22 use Psr\Log\LoggerInterface;
44 
63 final readonly class ‪PageInformationFactory
64 {
65  public function ‪__construct(
66  private ‪Context $context,
67  private EventDispatcherInterface $eventDispatcher,
68  private LoggerInterface $logger,
69  private ‪RecordAccessVoter $accessVoter,
70  private ‪ErrorController $errorController,
71  private ‪SysTemplateRepository $sysTemplateRepository,
72  private ‪PageLayoutResolver $pageLayoutResolver,
73  ) {}
74 
88  public function ‪create(ServerRequestInterface $request): ‪PageInformation
89  {
90  // Set Initial, not yet validated values from routing.
91  $pageInformation = new ‪PageInformation();
92  $pageInformation->setId($request->getAttribute('routing')->getPageId());
93  if (‪$GLOBALS['TYPO3_CONF_VARS']['FE']['enable_mount_pids'] ?? false) {
94  $mountPoint = (string)($request->getAttribute('routing')->getArguments()['MP'] ?? '');
95  // Ensure no additional arguments are given via the &MP=123-345,908-172 (e.g. "/")
96  $pageInformation->setMountPoint(preg_replace('/[^0-9,-]/', '', $mountPoint));
97  }
98 
99  $event = $this->eventDispatcher->dispatch(new ‪BeforePageIsResolvedEvent($request, $pageInformation));
100  $pageInformation = $event->getPageInformation();
101 
102  $pageInformation = $this->‪setPageAndRootline($request, $pageInformation);
103  $this->‪checkCrossDomainWithDirectId($request, $pageInformation);
104 
105  $event = $this->eventDispatcher->dispatch(new ‪AfterPageWithRootLineIsResolvedEvent($request, $pageInformation));
106  if ($event->getResponse()) {
107  throw new ‪PageInformationCreationFailedException($event->getResponse(), 1705419743);
108  }
109  $pageInformation = $event->getPageInformation();
110 
111  $pageInformation = $this->‪settingLanguage($request, $pageInformation);
112  $pageInformation = $this->‪setContentFromPid($request, $pageInformation);
113  $pageInformation = $this->‪setPageLayout($pageInformation);
114  $this->‪checkBackendUserAccess($request, $pageInformation);
115 
116  $event = $this->eventDispatcher->dispatch(new ‪AfterPageAndLanguageIsResolvedEvent($request, $pageInformation));
117  if ($event->getResponse()) {
118  throw new ‪PageInformationCreationFailedException($event->getResponse(), 1705420010);
119  }
120  $pageInformation = $event->getPageInformation();
121 
122  $pageInformation = $this->‪setSysTemplateRows($request, $pageInformation);
123  return $this->‪setLocalRootLine($request, $pageInformation);
124  }
125 
134  protected function ‪setPageAndRootline(ServerRequestInterface $request, ‪PageInformation $pageInformation): ‪PageInformation
135  {
136  $id = $pageInformation->‪getId();
137  $pageRepository = GeneralUtility::makeInstance(PageRepository::class);
138  $mountPoint = $pageInformation->‪getMountPoint();
139  $pageRecord = $pageRepository->getPage($id);
140 
141  if (empty($pageRecord)) {
142  // @todo: This logic could be streamlined is general. The idea of PageRepository->getPage() is
143  // to have *one* query that does all the access checks already, to save queries. Only
144  // if this goes wrong more queries are fired to find out details.
145  // This is ugly. It would be better to query the page without checks and return it, probably
146  // only doing the deleted=1 check. If that does not resolve: 404. Then apply the hidden
147  // and groups checks in PHP on the page record without further queries, to error out
148  // whenever a single step goes wrong. Or have a single method that follows this strategy
149  // and throws dedicated exceptions like a PageHiddenException or similar to catch it here
150  // and act accordingly.
151  // This strategy would turn the guesswork logic below around and would be easier to
152  // maintain and follow in general. It would also clean up the various methods with their
153  // subtle differences: getPage($id), getPage($id, true) and getPage_noCheck($id).
154  // PageRepository->getPage() did not return a page. This can have
155  // different reasons. We want to error out with different status codes.
156  $hiddenField = ‪$GLOBALS['TCA']['pages']['ctrl']['enablecolumns']['disabled'] ?? '';
157  $includeHiddenPages = $this->context->getPropertyFromAspect('visibility', 'includeHiddenPages') || $this->context->getPropertyFromAspect('backend.user', 'isLoggedIn', false);
158  if (!empty($hiddenField) && !$includeHiddenPages) {
159  // Page is hidden, user has no access. 404. This is deliberately done in default language
160  // since language overlays should not be rendered when default language is hidden.
161  $rawPageRecord = $pageRepository->getPage_noCheck($id);
162  if ($rawPageRecord === [] || $rawPageRecord[$hiddenField]) {
163  $response = $this->errorController->pageNotFoundAction(
164  $request,
165  'The requested page does not exist!',
167  );
168  throw new ‪PageInformationCreationFailedException($response, 1674144383);
169  }
170  }
171  $requestedPageRowWithoutGroupCheck = $pageRepository->getPage($id, true);
172  if (!empty($requestedPageRowWithoutGroupCheck)) {
173  // We know now the page could not be received, but the reason is *not* that the
174  // page is hidden and the user has no hidden access. So group access failed? 403.
175  $response = $this->errorController->accessDeniedAction(
176  $request,
177  'ID was not an accessible page',
178  [
180  'direct_access' => [
181  0 => $requestedPageRowWithoutGroupCheck,
182  ],
183  ],
184  );
185  throw new ‪PageInformationCreationFailedException($response, 1705325336);
186  }
187  // Else 404 for 'record not exists' or similar.
188  $response = $this->errorController->pageNotFoundAction(
189  $request,
190  'The requested page does not exist!',
192  );
193  throw new ‪PageInformationCreationFailedException($response, 1533931330);
194  }
195 
196  $pageInformation->‪setPageRecord($pageRecord);
197  $pageDoktype = (int)($pageRecord['doktype']);
198 
199  if ($pageDoktype === ‪PageRepository::DOKTYPE_SPACER || $pageDoktype === ‪PageRepository::DOKTYPE_SYSFOLDER) {
200  // Spacer and sysfolders are not accessible in frontend
201  $response = $this->errorController->pageNotFoundAction(
202  $request,
203  'The requested page does not exist!',
205  );
206  throw new ‪PageInformationCreationFailedException($response, 1533931343);
207  }
208 
209  if ($pageDoktype === ‪PageRepository::DOKTYPE_SHORTCUT) {
210  // Resolve shortcut page target.
211  // Clear mount point if page is a shortcut: If the shortcut goes to
212  // another page, we leave the rootline which the MP expects.
213  $mountPoint = '';
214  $pageInformation->‪setMountPoint($mountPoint);
215  // Saving the page so that we can check later - when we know about languages - whether we took the correct shortcut
216  // or if a translation of the page overwrites the shortcut target, and we need to follow the new target.
217  $pageInformation = $this->‪settingLanguage($request, $pageInformation);
218  // Reset vars to new state that may have been created by settingLanguage()
219  $pageRepository = GeneralUtility::makeInstance(PageRepository::class);
220  $pageRecord = $pageInformation->‪getPageRecord();
221  $pageInformation->‪setOriginalShortcutPageRecord($pageRecord);
222  try {
223  $pageRecord = $pageRepository->resolveShortcutPage($pageRecord, true);
225  $response = $this->errorController->pageNotFoundAction(
226  $request,
227  'ID was not an accessible page',
229  );
230  throw new ‪PageInformationCreationFailedException($response, 1705335065);
231  }
232  $pageInformation->‪setPageRecord($pageRecord);
233  $id = (int)$pageRecord['uid'];
234  $pageInformation->‪setId($id);
235  $pageDoktype = (int)($pageRecord['doktype'] ?? 0);
236  }
237 
238  if ($pageDoktype === ‪PageRepository::DOKTYPE_MOUNTPOINT && $pageRecord['mount_pid_ol']) {
239  // If the page is a mount point which should be overlaid with the contents of the mounted page,
240  // it must never be accessible directly, but only in the mount point context.
241  // We thus change the current page id.
242  $originalMountPointPageRecord = $pageRecord;
243  $pageInformation->‪setOriginalMountPointPageRecord($pageRecord);
244  $pageRecord = $pageRepository->getPage((int)$originalMountPointPageRecord['mount_pid']);
245  if (empty($pageRecord)) {
246  // Target mount point page not accessible for some reason.
247  $response = $this->errorController->pageNotFoundAction(
248  $request,
249  'The requested page does not exist!',
251  );
252  throw new ‪PageInformationCreationFailedException($response, 1705425523);
253  }
254  $pageInformation->‪setPageRecord($pageRecord);
255  if ($mountPoint === '' || !empty($pageInformation->‪getOriginalShortcutPageRecord())) {
256  // If the current page is a shortcut, the MP parameter will be replaced
257  $mountPoint = $pageRecord['uid'] . '-' . $originalMountPointPageRecord['uid'];
258  } else {
259  $mountPoint = $mountPoint . ',' . $pageRecord['uid'] . '-' . $originalMountPointPageRecord['uid'];
260  }
261  $pageInformation->‪setMountPoint($mountPoint);
262  $id = (int)$pageRecord['uid'];
263  $pageInformation->‪setId($id);
264  }
265 
266  // Get rootLine and error out if it can not be retrieved.
267  $pageInformation->‪setRootLine($this->‪getRootlineOrThrow($request, $id, $mountPoint));
268 
269  // Check 'extendToSubpages' in rootLine and backend user section.
270  $this->‪checkRootlineForIncludeSection($request, $pageInformation);
271  return $pageInformation;
272  }
273 
286  protected function ‪settingLanguage(ServerRequestInterface $request, ‪PageInformation $pageInformation): ‪PageInformation
287  {
288  $site = $request->getAttribute('site');
289  $language = $request->getAttribute('language', $site->getDefaultLanguage());
290  $languageAspect = ‪LanguageAspectFactory::createFromSiteLanguage($language);
291  $languageId = $languageAspect->getId();
292  $languageContentId = $languageAspect->getContentId();
293 
294  $pageRecord = $pageInformation->‪getPageRecord();
295 
296  $pageTranslationVisibility = new ‪PageTranslationVisibility((int)($pageRecord['l18n_cfg'] ?? 0));
297  if ($languageAspect->getId() > 0) {
298  // If the incoming language is set to another language than default
299  $pageRepository = GeneralUtility::makeInstance(PageRepository::class);
300  $olRec = $pageRepository->getPageOverlay($pageRecord, $languageAspect);
301  $overlaidLanguageId = (int)($olRec['sys_language_uid'] ?? 0);
302  if ($overlaidLanguageId !== $languageAspect->getId()) {
303  // If requested translation is not available
304  if ($pageTranslationVisibility->shouldHideTranslationIfNoTranslatedRecordExists()) {
305  $response = $this->errorController->pageNotFoundAction(
306  $request,
307  'Page is not available in the requested language.',
309  );
310  throw new ‪PageInformationCreationFailedException($response, 1533931388);
311  }
312  switch ($languageAspect->getLegacyLanguageMode()) {
313  case 'strict':
314  $response = $this->errorController->pageNotFoundAction(
315  $request,
316  'Page is not available in the requested language (strict).',
318  );
319  throw new ‪PageInformationCreationFailedException($response, 1533931395);
320  case 'content_fallback':
321  // Setting content uid (but leaving the sys_language_uid) when a content_fallback value was found.
322  foreach ($languageAspect->getFallbackChain() as $orderValue) {
323  if ($orderValue === '0' || $orderValue === 0 || $orderValue === '') {
324  $languageContentId = 0;
325  break;
326  }
327  if (‪MathUtility::canBeInterpretedAsInteger($orderValue) && $overlaidLanguageId === (int)$orderValue) {
328  $languageContentId = (int)$orderValue;
329  break;
330  }
331  if ($orderValue === 'pageNotFound') {
332  // The existing fallbacks have not been found, but instead of continuing page rendering
333  // with default language, a "page not found" message should be shown instead.
334  $response = $this->errorController->pageNotFoundAction(
335  $request,
336  'Page is not available in the requested language (fallbacks did not apply).',
338  );
339  throw new ‪PageInformationCreationFailedException($response, 1533931402);
340  }
341  }
342  break;
343  default:
344  // Default is that everything defaults to the default language.
345  $languageId = ($languageContentId = 0);
346  }
347  }
348 
349  // Define the language aspect again now
350  $languageAspect = new ‪LanguageAspect(
351  $languageId,
352  $languageContentId,
353  $languageAspect->getOverlayType(),
354  $languageAspect->getFallbackChain()
355  );
356 
357  // Setting localized page record if an overlay record was found (which it is only if a language is used)
358  // Doing this ensures that page properties like the page title are resolved in the correct language.
359  $pageInformation->‪setPageRecord($olRec);
360  }
361 
362  // Set the final language aspect!
363  $this->context->setAspect('language', $languageAspect);
364 
365  if ((!$languageAspect->getContentId() || !$languageAspect->getId())
366  && $pageTranslationVisibility->shouldBeHiddenInDefaultLanguage()
367  ) {
368  // If default language is not available
369  $response = $this->errorController->pageNotFoundAction(
370  $request,
371  'Page is not available in default language.',
373  );
374  throw new ‪PageInformationCreationFailedException($response, 1533931423);
375  }
376 
377  if ($languageAspect->getId() > 0) {
378  // Updating rootLine with translations if the language key is set.
379  $pageInformation->‪setRootLine(
380  $this->‪getRootlineOrThrow($request, $pageInformation->‪getId(), $pageInformation->‪getMountPoint())
381  );
382  }
383 
384  return $pageInformation;
385  }
386 
398  protected function ‪setContentFromPid(ServerRequestInterface $request, ‪PageInformation $pageInformation): ‪PageInformation
399  {
400  $contentFromPid = (int)($pageInformation->‪getPageRecord()['content_from_pid'] ?? 0);
401  if ($contentFromPid === 0) {
402  // $pageInformation->contentFromPid is always initialized, usually identical with id.
403  $pageInformation->‪setContentFromPid($pageInformation->‪getId());
404  return $pageInformation;
405  }
406  // Verify content target pid is good and resolves all access restrictions and similar.
407  $targetPageInformation = new ‪PageInformation();
408  $targetPageInformation->setId($contentFromPid);
409  $targetPageInformation = $this->‪setPageAndRootline($request, $targetPageInformation);
410  // Above call did not throw. Set the verified id.
411  $pageInformation->‪setContentFromPid($targetPageInformation->getId());
412  return $pageInformation;
413  }
414 
418  protected function ‪setPageLayout(‪PageInformation $pageInformation): ‪PageInformation
419  {
420  $pageLayout = $this->pageLayoutResolver->getLayoutForPage(
421  $pageInformation->‪getPageRecord(),
422  $pageInformation->‪getRootLine()
423  );
424  if ($pageLayout !== null) {
425  $pageInformation->‪setPageLayout($pageLayout);
426  }
427  return $pageInformation;
428  }
429 
443  protected function ‪checkRootlineForIncludeSection(ServerRequestInterface $request, ‪PageInformation $pageInformation): void
444  {
445  $rootLine = $pageInformation->‪getRootLine();
446  for ($a = 0; $a < count($rootLine); $a++) {
447  $rootLineEntry = $rootLine[$a];
448  if (!$this->accessVoter->accessGrantedForPageInRootLine($rootLineEntry, $this->context)) {
449  // accessGrantedForPageInRootLine() does the main check for 'extendToSubpages'.
450  $response = $this->errorController->accessDeniedAction(
451  $request,
452  'Subsection was found and not accessible',
453  [
455  'sub_section' => [
456  0 => $rootLineEntry,
457  ],
458  ],
459  );
460  throw new ‪PageInformationCreationFailedException($response, 1705337296);
461  }
462  if ((int)$rootLineEntry['doktype'] === ‪PageRepository::DOKTYPE_BE_USER_SECTION) {
463  // Only logged in backend users with 'PAGE_SHOW' permissions are allowed to FE render backend user sections.
464  $isBackendUserLoggedIn = $this->context->getPropertyFromAspect('backend.user', 'isLoggedIn', false);
465  if (!$isBackendUserLoggedIn) {
466  $response = $this->errorController->accessDeniedAction(
467  $request,
468  'Subsection was found and not accessible',
470  );
471  throw new ‪PageInformationCreationFailedException($response, 1705416744);
472  }
473  if (!$this->‪getBackendUser()->doesUserHaveAccess($pageInformation->‪getPageRecord(), ‪Permission::PAGE_SHOW)) {
474  $response = $this->errorController->accessDeniedAction(
475  $request,
476  'Subsection was found and not accessible',
478  );
479  throw new ‪PageInformationCreationFailedException($response, 1705337701);
480  }
481  }
482  }
483  }
484 
496  protected function ‪checkCrossDomainWithDirectId(ServerRequestInterface $request, ‪PageInformation $pageInformation): void
497  {
498  $directlyRequestedId = (int)($request->getQueryParams()['id'] ?? 0);
499  $shortcutId = (int)($pageInformation->‪getOriginalShortcutPageRecord()['uid'] ?? 0);
500  if ($directlyRequestedId && $shortcutId !== $directlyRequestedId) {
501  $rootLine = $pageInformation->‪getRootLine();
502  $siteRootPageId = $request->getAttribute('site')->getRootPageId();
503  $siteRootWithinRootlineFound = false;
504  foreach ($rootLine as $pageInRootLine) {
505  if ((int)$pageInRootLine['uid'] === $siteRootPageId) {
506  $siteRootWithinRootlineFound = true;
507  break;
508  }
509  }
510  if (!$siteRootWithinRootlineFound) {
511  $response = $this->errorController->pageNotFoundAction(
512  $request,
513  'ID was outside the domain',
515  );
516  throw new ‪PageInformationCreationFailedException($response, 1705397417);
517  }
518  }
519  }
520 
527  protected function ‪checkBackendUserAccess(ServerRequestInterface $request, ‪PageInformation $pageInformation): void
528  {
529  if ($this->context->getPropertyFromAspect('backend.user', 'isLoggedIn', false)
530  && $this->context->getPropertyFromAspect('frontend.preview', 'isPreview', false)
531  && !‪$GLOBALS['BE_USER']->doesUserHaveAccess($pageInformation->‪getPageRecord(), ‪Permission::PAGE_SHOW)
532  ) {
533  $response = $this->errorController->accessDeniedAction(
534  $request,
535  'ID was not an accessible page',
537  );
538  throw new ‪PageInformationCreationFailedException($response, 1705422293);
539  }
540  }
541 
552  protected function ‪setSysTemplateRows(ServerRequestInterface $request, ‪PageInformation $pageInformation): ‪PageInformation
553  {
554  $site = $request->getAttribute('site');
555  $rootLine = $pageInformation->‪getRootLine();
556  if ($site instanceof ‪Site && $site->‪isTypoScriptRoot()) {
557  $rootLineUntilSite = [];
558  foreach ($rootLine as $index => $rootlinePage) {
559  $rootLineUntilSite[$index] = $rootlinePage;
560  $pageId = (int)($rootlinePage['uid'] ?? 0);
561  if ($pageId === $site->getRootPageId()) {
562  break;
563  }
564  }
565  $rootLine = $rootLineUntilSite;
566  }
567  $sysTemplateRows = $this->sysTemplateRepository->getSysTemplateRowsByRootline($rootLine, $request);
568  $pageInformation->‪setSysTemplateRows($sysTemplateRows);
569  return $pageInformation;
570  }
571 
575  protected function ‪setLocalRootLine(ServerRequestInterface $request, ‪PageInformation $pageInformation): ‪PageInformation
576  {
577  $site = $request->getAttribute('site');
578  $sysTemplateRows = $pageInformation->‪getSysTemplateRows();
579  $rootLine = $pageInformation->‪getRootLine();
580  $sysTemplateRowsIndexedByPid = array_combine(array_column($sysTemplateRows, 'pid'), $sysTemplateRows);
581  $localRootline = [];
582  foreach ($rootLine as $rootlinePage) {
583  array_unshift($localRootline, $rootlinePage);
584  $pageId = (int)($rootlinePage['uid'] ?? 0);
585  if ($pageId === $site->getRootPageId() && $site->isTypoScriptRoot()) {
586  break;
587  }
588  if ($pageId > 0 && (int)($sysTemplateRowsIndexedByPid[$pageId]['root'] ?? 0) === 1) {
589  break;
590  }
591  }
592  $pageInformation->‪setLocalRootLine($localRootline);
593  return $pageInformation;
594  }
595 
601  protected function ‪getRootlineOrThrow(ServerRequestInterface $request, int $pageId, string $mountPoint): array
602  {
603  $rootLine = [];
604  try {
605  $rootLine = GeneralUtility::makeInstance(RootlineUtility::class, $pageId, $mountPoint)->get();
606  } catch (‪RootLineException) {
607  // Empty / broken rootline handled below.
608  }
609  if (!empty($rootLine)) {
610  // All good.
611  return $rootLine;
612  }
613  // Error case: Log and render error.
614  $message = 'The requested page did not have a proper connection to the tree root!';
615  $context = [
616  'pageId' => $pageId,
617  'requestUrl' => $request->getAttribute('normalizedParams')->getRequestUrl(),
618  ];
619  $this->logger->error($message, $context);
620  try {
621  $response = $this->errorController->internalErrorAction(
622  $request,
623  $message,
625  );
626  throw new ‪PageInformationCreationFailedException($response, 1533931350);
627  } catch (‪StatusException $up) {
628  $this->logger->error($message, ['exception' => $up]);
629  throw $up;
630  }
631  }
632 
634  {
635  return ‪$GLOBALS['BE_USER'] ?? null;
636  }
637 }
‪TYPO3\CMS\Frontend\Page\PageAccessFailureReasons\LANGUAGE_AND_FALLBACKS_NOT_AVAILABLE
‪const LANGUAGE_AND_FALLBACKS_NOT_AVAILABLE
Definition: PageAccessFailureReasons.php:44
‪TYPO3\CMS\Frontend\Page\PageInformation\getMountPoint
‪getMountPoint()
Definition: PageInformation.php:149
‪TYPO3\CMS\Core\TypoScript\IncludeTree\SysTemplateRepository
Definition: SysTemplateRepository.php:40
‪TYPO3\CMS\Frontend\Page\PageInformation\setMountPoint
‪setMountPoint(string $mountPoint)
Definition: PageInformation.php:141
‪TYPO3\CMS\Frontend\Page\PageInformationFactory\checkBackendUserAccess
‪checkBackendUserAccess(ServerRequestInterface $request, PageInformation $pageInformation)
Definition: PageInformationFactory.php:527
‪TYPO3\CMS\Core\Context\LanguageAspectFactory
Definition: LanguageAspectFactory.php:27
‪TYPO3\CMS\Frontend\Page\PageInformation\setLocalRootLine
‪setLocalRootLine(array $localRootLine)
Definition: PageInformation.php:170
‪TYPO3\CMS\Backend\FrontendBackendUserAuthentication
Definition: FrontendBackendUserAuthentication.php:29
‪TYPO3\CMS\Frontend\Page\PageInformation\setPageLayout
‪setPageLayout(PageLayout $pageLayout)
Definition: PageInformation.php:247
‪TYPO3\CMS\Frontend\Page\PageInformationFactory\setLocalRootLine
‪setLocalRootLine(ServerRequestInterface $request, PageInformation $pageInformation)
Definition: PageInformationFactory.php:575
‪TYPO3\CMS\Frontend\Page\PageInformationFactory\getRootlineOrThrow
‪non empty array getRootlineOrThrow(ServerRequestInterface $request, int $pageId, string $mountPoint)
Definition: PageInformationFactory.php:601
‪TYPO3\CMS\Frontend\Page\PageInformationFactory\create
‪create(ServerRequestInterface $request)
Definition: PageInformationFactory.php:88
‪TYPO3\CMS\Core\Domain\Repository\PageRepository\DOKTYPE_SHORTCUT
‪const DOKTYPE_SHORTCUT
Definition: PageRepository.php:100
‪TYPO3\CMS\Core\Context\LanguageAspectFactory\createFromSiteLanguage
‪static createFromSiteLanguage(SiteLanguage $language)
Definition: LanguageAspectFactory.php:31
‪TYPO3\CMS\Frontend\Page\PageInformation\getSysTemplateRows
‪getSysTemplateRows()
Definition: PageInformation.php:191
‪TYPO3\CMS\Core\Utility\RootlineUtility
Definition: RootlineUtility.php:39
‪TYPO3\CMS\Core\Page\PageLayoutResolver
Definition: PageLayoutResolver.php:46
‪TYPO3\CMS\Frontend\Event\BeforePageIsResolvedEvent
Definition: BeforePageIsResolvedEvent.php:31
‪TYPO3\CMS\Frontend\Page\PageInformationFactory\settingLanguage
‪settingLanguage(ServerRequestInterface $request, PageInformation $pageInformation)
Definition: PageInformationFactory.php:286
‪TYPO3\CMS\Core\Type\Bitmask\PageTranslationVisibility
Definition: PageTranslationVisibility.php:30
‪TYPO3\CMS\Frontend\Page\PageInformationFactory\setContentFromPid
‪setContentFromPid(ServerRequestInterface $request, PageInformation $pageInformation)
Definition: PageInformationFactory.php:398
‪TYPO3\CMS\Frontend\Controller\ErrorController
Definition: ErrorController.php:38
‪TYPO3\CMS\Frontend\Page\PageAccessFailureReasons\ACCESS_DENIED_INVALID_PAGETYPE
‪const ACCESS_DENIED_INVALID_PAGETYPE
Definition: PageAccessFailureReasons.php:52
‪TYPO3\CMS\Core\Context\Context
Definition: Context.php:54
‪TYPO3\CMS\Frontend\Page\PageInformation\setOriginalMountPointPageRecord
‪setOriginalMountPointPageRecord(array $originalMountPointPageRecord)
Definition: PageInformation.php:215
‪TYPO3\CMS\Frontend\Page\PageInformation\getRootLine
‪getRootLine()
Definition: PageInformation.php:162
‪TYPO3\CMS\Frontend\Page\PageInformation\setId
‪setId(int $id)
Definition: PageInformation.php:115
‪TYPO3\CMS\Core\Type\Bitmask\Permission
Definition: Permission.php:26
‪TYPO3\CMS\Frontend\Page\PageInformation\setSysTemplateRows
‪setSysTemplateRows(array $sysTemplateRows)
Definition: PageInformation.php:183
‪TYPO3\CMS\Frontend\Page\PageInformationCreationFailedException
Definition: PageInformationCreationFailedException.php:31
‪TYPO3\CMS\Core\Site\Entity\Site
Definition: Site.php:42
‪TYPO3\CMS\Frontend\Page\PageInformationFactory\__construct
‪__construct(private Context $context, private EventDispatcherInterface $eventDispatcher, private LoggerInterface $logger, private RecordAccessVoter $accessVoter, private ErrorController $errorController, private SysTemplateRepository $sysTemplateRepository, private PageLayoutResolver $pageLayoutResolver,)
Definition: PageInformationFactory.php:65
‪TYPO3\CMS\Frontend\Page\PageInformationFactory\getBackendUser
‪getBackendUser()
Definition: PageInformationFactory.php:633
‪TYPO3\CMS\Core\Error\Http\StatusException
Definition: StatusException.php:26
‪TYPO3\CMS\Core\Utility\MathUtility\canBeInterpretedAsInteger
‪static bool canBeInterpretedAsInteger(mixed $var)
Definition: MathUtility.php:74
‪TYPO3\CMS\Core\Domain\Repository\PageRepository\DOKTYPE_MOUNTPOINT
‪const DOKTYPE_MOUNTPOINT
Definition: PageRepository.php:102
‪TYPO3\CMS\Frontend\Page\PageInformationFactory\setPageAndRootline
‪setPageAndRootline(ServerRequestInterface $request, PageInformation $pageInformation)
Definition: PageInformationFactory.php:134
‪TYPO3\CMS\Frontend\Page\PageAccessFailureReasons\ACCESS_DENIED_HOST_PAGE_MISMATCH
‪const ACCESS_DENIED_HOST_PAGE_MISMATCH
Definition: PageAccessFailureReasons.php:51
‪TYPO3\CMS\Frontend\Page\PageInformation\setOriginalShortcutPageRecord
‪setOriginalShortcutPageRecord(array $originalShortcutPageRecord)
Definition: PageInformation.php:199
‪TYPO3\CMS\Frontend\Page\PageAccessFailureReasons\ACCESS_DENIED_PAGE_NOT_RESOLVED
‪const ACCESS_DENIED_PAGE_NOT_RESOLVED
Definition: PageAccessFailureReasons.php:49
‪TYPO3\CMS\Frontend\Page\PageAccessFailureReasons\LANGUAGE_DEFAULT_NOT_AVAILABLE
‪const LANGUAGE_DEFAULT_NOT_AVAILABLE
Definition: PageAccessFailureReasons.php:45
‪TYPO3\CMS\Frontend\Event\AfterPageAndLanguageIsResolvedEvent
Definition: AfterPageAndLanguageIsResolvedEvent.php:32
‪TYPO3\CMS\Frontend\Page\PageInformationFactory\checkCrossDomainWithDirectId
‪checkCrossDomainWithDirectId(ServerRequestInterface $request, PageInformation $pageInformation)
Definition: PageInformationFactory.php:496
‪TYPO3\CMS\Frontend\Page\PageAccessFailureReasons\LANGUAGE_NOT_AVAILABLE
‪const LANGUAGE_NOT_AVAILABLE
Definition: PageAccessFailureReasons.php:42
‪TYPO3\CMS\Frontend\Page\PageAccessFailureReasons\PAGE_NOT_FOUND
‪const PAGE_NOT_FOUND
Definition: PageAccessFailureReasons.php:28
‪TYPO3\CMS\Core\Domain\Repository\PageRepository\DOKTYPE_SPACER
‪const DOKTYPE_SPACER
Definition: PageRepository.php:103
‪TYPO3\CMS\Core\Domain\Repository\PageRepository\DOKTYPE_BE_USER_SECTION
‪const DOKTYPE_BE_USER_SECTION
Definition: PageRepository.php:101
‪TYPO3\CMS\Frontend\Page\PageAccessFailureReasons\ACCESS_DENIED_SUBSECTION_NOT_RESOLVED
‪const ACCESS_DENIED_SUBSECTION_NOT_RESOLVED
Definition: PageAccessFailureReasons.php:50
‪TYPO3\CMS\Frontend\Page\PageInformation\getId
‪getId()
Definition: PageInformation.php:120
‪TYPO3\CMS\Frontend\Page\PageInformation\setPageRecord
‪setPageRecord(array $pageRecord)
Definition: PageInformation.php:128
‪TYPO3\CMS\Core\Type\Bitmask\Permission\PAGE_SHOW
‪const PAGE_SHOW
Definition: Permission.php:35
‪TYPO3\CMS\Core\Domain\Repository\PageRepository\DOKTYPE_SYSFOLDER
‪const DOKTYPE_SYSFOLDER
Definition: PageRepository.php:104
‪TYPO3\CMS\Core\Context\LanguageAspect
Definition: LanguageAspect.php:57
‪TYPO3\CMS\Frontend\Page
Definition: CacheHashCalculator.php:16
‪TYPO3\CMS\Frontend\Event\AfterPageWithRootLineIsResolvedEvent
Definition: AfterPageWithRootLineIsResolvedEvent.php:31
‪TYPO3\CMS\Frontend\Page\PageInformation\getPageRecord
‪getPageRecord()
Definition: PageInformation.php:133
‪TYPO3\CMS\Frontend\Page\PageInformation\getOriginalShortcutPageRecord
‪getOriginalShortcutPageRecord()
Definition: PageInformation.php:207
‪TYPO3\CMS\Frontend\Page\PageAccessFailureReasons\LANGUAGE_NOT_AVAILABLE_STRICT_MODE
‪const LANGUAGE_NOT_AVAILABLE_STRICT_MODE
Definition: PageAccessFailureReasons.php:43
‪TYPO3\CMS\Core\Site\Entity\Site\isTypoScriptRoot
‪isTypoScriptRoot()
Definition: Site.php:329
‪TYPO3\CMS\Frontend\Page\PageInformationFactory\checkRootlineForIncludeSection
‪checkRootlineForIncludeSection(ServerRequestInterface $request, PageInformation $pageInformation)
Definition: PageInformationFactory.php:443
‪TYPO3\CMS\Core\Error\Http\ShortcutTargetPageNotFoundException
Definition: ShortcutTargetPageNotFoundException.php:23
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Utility\MathUtility
Definition: MathUtility.php:24
‪TYPO3\CMS\Frontend\Page\PageInformationFactory\setSysTemplateRows
‪setSysTemplateRows(ServerRequestInterface $request, PageInformation $pageInformation)
Definition: PageInformationFactory.php:552
‪TYPO3\CMS\Core\Exception\Page\RootLineException
Definition: RootLineException.php:24
‪TYPO3\CMS\Core\Domain\Repository\PageRepository
Definition: PageRepository.php:69
‪TYPO3\CMS\Frontend\Page\PageInformation\setRootLine
‪setRootLine(array $rootLine)
Definition: PageInformation.php:157
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Frontend\Page\PageInformation\setContentFromPid
‪setContentFromPid(int $contentFromPid)
Definition: PageInformation.php:231
‪TYPO3\CMS\Core\Domain\Access\RecordAccessVoter
Definition: RecordAccessVoter.php:31
‪TYPO3\CMS\Frontend\Page\PageInformation
Definition: PageInformation.php:30
‪TYPO3\CMS\Frontend\Page\PageAccessFailureReasons\ROOTLINE_BROKEN
‪const ROOTLINE_BROKEN
Definition: PageAccessFailureReasons.php:29
‪TYPO3\CMS\Frontend\Page\PageInformationFactory\setPageLayout
‪setPageLayout(PageInformation $pageInformation)
Definition: PageInformationFactory.php:418
‪TYPO3\CMS\Frontend\Page\PageInformationFactory
Definition: PageInformationFactory.php:64