/** * @inherit */ public function handleError(\R3H6\Error404page\Domain\Model\Error $error) { if ($error->getStatusCode() !== Error::STATUS_CODE_FORBIDDEN) { return false; } if (!$error->getPid()) { return false; } if ($this->frontendUser->isLoggedIn()) { return false; } /** @var \R3H6\Error404page\Configuration\PageTsConfig $pageTsConfig */ $pageTsConfig = $this->pageTsConfigManager->getPageTsConfig($error->getPid()); $parameter = (string) $pageTsConfig->get('redirectError403To'); if ($parameter === 'auto') { $loginPage = $this->pageRepository->findLoginPageForError($error); if ($loginPage !== null) { $parameter = (string) $loginPage->getUid(); } else { $parameter = null; } } if (MathUtility::canBeInterpretedAsInteger($parameter)) { $this->cacheTags[] = 'pageId_' . $parameter; if ($this->frontendController->isDefaultType() === false) { $parameter .= ',' . $this->frontendController->getType(); } if ($this->frontendController->isDefaultLanguage() === false || $this->frontendController->isDefaultGetVar('L') === true) { $parameter .= ' - - - &L=' . $this->frontendController->getSystemLanguageUid(); } } $this->getLogger()->debug(sprintf('Redirect parameter "%s"', $parameter)); if ($parameter) { $this->redirect = ''; $this->redirect .= $this->frontendController->typoLink(array('parameter' => $parameter, 'forceAbsoluteUrl' => true)); $this->redirect .= strpos($this->redirect, '?') === false ? '?' : '&'; $this->redirect .= 'redirect_url=' . $error->getUrl(); return true; } return false; }
/** * * @param Error $error [description] * @return \R3H6\Error404page\Domain\Model\Page|null */ public function findLoginPageForError(Error $error) { if ($error->getPid()) { $rows = $this->getDatabaseConnection()->exec_SELECTgetRows('pid', 'tt_content', "CType='login'" . $this->pageRepository->enableFields('tt_content')); // Do not return a page if there is only one found, it could belong to an other domain! $rootLine = $this->pageRepository->getRootLine($error->getPid()); // Search for a login page within the rootline from the requested page. foreach ($rows as $row) { foreach ($rootLine as $pageRecord) { if ((int) $pageRecord['uid'] === (int) $row['pid']) { return $this->findByIdentifier($rows['pid']); } } } // Search first login page with same root page. foreach ($rows as $row) { $loginRootLine = $this->pageRepository->getRootLine($row['pid']); if ($rootLine[0]['uid'] === $loginRootLine[0]['uid']) { return $this->findByIdentifier($row['pid']); } } } return null; }