diff --git a/typo3/sysext/backend/Classes/Controller/PageLayoutController.php b/typo3/sysext/backend/Classes/Controller/PageLayoutController.php index be3f4f48df0db58eea98dd41f1cf43b19c178d1a..bcf1fc930f9177dfd400e2e442ac70a39931a7a1 100644 --- a/typo3/sysext/backend/Classes/Controller/PageLayoutController.php +++ b/typo3/sysext/backend/Classes/Controller/PageLayoutController.php @@ -76,7 +76,7 @@ class PageLayoutController /** * Current ids page record * - * @var array + * @var array|bool * @internal */ public $pageinfo; @@ -161,7 +161,7 @@ class PageLayoutController protected $uriBuilder; /** - * @var PageLayoutContext + * @var PageLayoutContext|null */ protected $context; @@ -186,11 +186,14 @@ class PageLayoutController // Load page info array $this->pageinfo = BackendUtility::readPageAccess($this->id, $this->getBackendUser()->getPagePermsClause(Permission::PAGE_SHOW)); - $this->context = GeneralUtility::makeInstance( - PageLayoutContext::class, - $this->pageinfo, - GeneralUtility::makeInstance(BackendLayoutView::class)->getBackendLayoutForPage($this->id) - ); + if ($this->pageinfo !== false) { + // If page info is not resolved, user has no access or the ID parameter was malformed. + $this->context = GeneralUtility::makeInstance( + PageLayoutContext::class, + $this->pageinfo, + GeneralUtility::makeInstance(BackendLayoutView::class)->getBackendLayoutForPage($this->id) + ); + } /** @var SiteInterface $currentSite */ $currentSite = $request->getAttribute('site'); @@ -553,29 +556,31 @@ class PageLayoutController } '); - $backendLayout = $this->context->getBackendLayout(); + if ($this->context instanceof PageLayoutContext) { + $backendLayout = $this->context->getBackendLayout(); - // Find backend layout / columns - if (!empty($backendLayout->getColumnPositionNumbers())) { - $this->colPosList = implode(',', $backendLayout->getColumnPositionNumbers()); - } - // Removing duplicates, if any - $this->colPosList = array_unique(GeneralUtility::intExplode(',', $this->colPosList)); - // Accessible columns - if (isset($this->modSharedTSconfig['properties']['colPos_list']) && trim($this->modSharedTSconfig['properties']['colPos_list']) !== '') { - $this->activeColPosList = array_unique(GeneralUtility::intExplode(',', trim($this->modSharedTSconfig['properties']['colPos_list']))); - // Match with the list which is present in the colPosList for the current page - if (!empty($this->colPosList) && !empty($this->activeColPosList)) { - $this->activeColPosList = array_unique(array_intersect( - $this->activeColPosList, - $this->colPosList - )); + // Find backend layout / columns + if (!empty($backendLayout->getColumnPositionNumbers())) { + $this->colPosList = implode(',', $backendLayout->getColumnPositionNumbers()); } - } else { - $this->activeColPosList = $this->colPosList; + // Removing duplicates, if any + $this->colPosList = array_unique(GeneralUtility::intExplode(',', $this->colPosList)); + // Accessible columns + if (isset($this->modSharedTSconfig['properties']['colPos_list']) && trim($this->modSharedTSconfig['properties']['colPos_list']) !== '') { + $this->activeColPosList = array_unique(GeneralUtility::intExplode(',', trim($this->modSharedTSconfig['properties']['colPos_list']))); + // Match with the list which is present in the colPosList for the current page + if (!empty($this->colPosList) && !empty($this->activeColPosList)) { + $this->activeColPosList = array_unique(array_intersect( + $this->activeColPosList, + $this->colPosList + )); + } + } else { + $this->activeColPosList = $this->colPosList; + } + $this->activeColPosList = implode(',', $this->activeColPosList); + $this->colPosList = implode(',', $this->colPosList); } - $this->activeColPosList = implode(',', $this->activeColPosList); - $this->colPosList = implode(',', $this->colPosList); $content .= $this->getHeaderFlashMessagesForCurrentPid(); @@ -626,51 +631,59 @@ class PageLayoutController $this->pageRenderer->loadRequireJsModule('TYPO3/CMS/Backend/LayoutModule/Paste'); $this->pageRenderer->addInlineLanguageLabelFile('EXT:backend/Resources/Private/Language/locallang_layout.xlf'); - $backendLayout = $this->context->getBackendLayout(); - - $configuration = $this->context->getDrawingConfiguration(); - $configuration->setDefaultLanguageBinding(!empty($this->modTSconfig['properties']['defLangBinding'])); - $configuration->setActiveColumns(GeneralUtility::trimExplode(',', $this->activeColPosList)); - $configuration->setShowHidden((bool)$this->MOD_SETTINGS['tt_content_showHidden']); - $configuration->setLanguageColumns($this->MOD_MENU['language']); - $configuration->setShowNewContentWizard(empty($this->modTSconfig['properties']['disableNewContentElementWizard'])); - $configuration->setSelectedLanguageId((int)$this->MOD_SETTINGS['language']); - if ($this->MOD_SETTINGS['function'] == 2) { - $configuration->setLanguageMode(true); - } + $tableOutput = ''; + $numberOfHiddenElements = 0; - $numberOfHiddenElements = $this->getNumberOfHiddenElements($configuration->getLanguageColumns()); + if ($this->context instanceof PageLayoutContext) { + // Context may not be set, which happens if the page module is viewed by a user with no access to the + // current page, or if the ID parameter is malformed. In this case we do not resolve any backend layout + // or other page structure information and we do not render any "table output" for the module. + $backendLayout = $this->context->getBackendLayout(); - if (GeneralUtility::makeInstance(Features::class)->isFeatureEnabled('fluidBasedPageModule')) { - $pageLayoutDrawer = $this->context->getBackendLayoutRenderer(); + $configuration = $this->context->getDrawingConfiguration(); + $configuration->setDefaultLanguageBinding(!empty($this->modTSconfig['properties']['defLangBinding'])); + $configuration->setActiveColumns(GeneralUtility::trimExplode(',', $this->activeColPosList)); + $configuration->setShowHidden((bool)$this->MOD_SETTINGS['tt_content_showHidden']); + $configuration->setLanguageColumns($this->MOD_MENU['language']); + $configuration->setShowNewContentWizard(empty($this->modTSconfig['properties']['disableNewContentElementWizard'])); + $configuration->setSelectedLanguageId((int)$this->MOD_SETTINGS['language']); + if ($this->MOD_SETTINGS['function'] == 2) { + $configuration->setLanguageMode(true); + } - $pageActionsCallback = null; - if ($this->context->isPageEditable()) { - $languageOverlayId = 0; - $pageLocalizationRecord = BackendUtility::getRecordLocalization('pages', $this->id, (int)$this->current_sys_language); - if (is_array($pageLocalizationRecord)) { - $pageLocalizationRecord = reset($pageLocalizationRecord); + $numberOfHiddenElements = $this->getNumberOfHiddenElements($configuration->getLanguageColumns()); + + if (GeneralUtility::makeInstance(Features::class)->isFeatureEnabled('fluidBasedPageModule')) { + $pageLayoutDrawer = $this->context->getBackendLayoutRenderer(); + + $pageActionsCallback = null; + if ($this->context->isPageEditable()) { + $languageOverlayId = 0; + $pageLocalizationRecord = BackendUtility::getRecordLocalization('pages', $this->id, (int)$this->current_sys_language); + if (is_array($pageLocalizationRecord)) { + $pageLocalizationRecord = reset($pageLocalizationRecord); + } + if (!empty($pageLocalizationRecord['uid'])) { + $languageOverlayId = $pageLocalizationRecord['uid']; + } + $pageActionsCallback = 'function(PageActions) { + PageActions.setPageId(' . (int)$this->id . '); + PageActions.setLanguageOverlayId(' . $languageOverlayId . '); + }'; } - if (!empty($pageLocalizationRecord['uid'])) { - $languageOverlayId = $pageLocalizationRecord['uid']; + $this->pageRenderer->loadRequireJsModule('TYPO3/CMS/Backend/PageActions', $pageActionsCallback); + $tableOutput = $pageLayoutDrawer->drawContent(); + } else { + $dbList = PageLayoutView::createFromPageLayoutContext($this->context); + // Setting up the tt_content columns to show + $colList = array_keys($backendLayout->getUsedColumns()); + if ($this->colPosList !== '') { + $colList = array_intersect(GeneralUtility::intExplode(',', $this->colPosList), $colList); } - $pageActionsCallback = 'function(PageActions) { - PageActions.setPageId(' . (int)$this->id . '); - PageActions.setLanguageOverlayId(' . $languageOverlayId . '); - }'; - } - $this->pageRenderer->loadRequireJsModule('TYPO3/CMS/Backend/PageActions', $pageActionsCallback); - $tableOutput = $pageLayoutDrawer->drawContent(); - } else { - $dbList = PageLayoutView::createFromPageLayoutContext($this->context); - // Setting up the tt_content columns to show - $colList = array_keys($backendLayout->getUsedColumns()); - if ($this->colPosList !== '') { - $colList = array_intersect(GeneralUtility::intExplode(',', $this->colPosList), $colList); + // The order of the rows: Default is left(1), Normal(0), right(2), margin(3) + $dbList->tt_contentConfig['cols'] = implode(',', $colList); + $tableOutput = $dbList->getTable_tt_content($this->id); } - // The order of the rows: Default is left(1), Normal(0), right(2), margin(3) - $dbList->tt_contentConfig['cols'] = implode(',', $colList); - $tableOutput = $dbList->getTable_tt_content($this->id); } if ($this->getBackendUser()->check('tables_select', 'tt_content') && $numberOfHiddenElements > 0) {