self::TEMPLATES_ROOT_PATHS . '/Page/Error/403.html', 404 => self::TEMPLATES_ROOT_PATHS . '/Page/Error/404.html', 500 => self::TEMPLATES_ROOT_PATHS . '/Page/Error/500.html' ]; const REDIRECT_FALLBACK = 'https://opentalent.fr'; /** * Status code of the response * @var int */ protected $statusCode; /** * Configuration of the error handler as set in site configuration. * @var array */ protected $errorHandlerConfiguration; /** * @var ViewInterface */ protected $view; public function __construct(int $statusCode, array $configuration) { $this->statusCode = $statusCode; $this->errorHandlerConfiguration = $configuration; $this->view = GeneralUtility::makeInstance(TemplateView::class); $this->view->setTemplateRootPaths([self::TEMPLATES_ROOT_PATHS]); $this->view->setLayoutRootPaths([self::LAYOUTS_ROOT_PATHS]); $this->view->setPartialRootPaths([self::PARTIALS_ROOT_PATHS]); $this->view->setTemplatePathAndFilename( GeneralUtility::getFileAbsFileName(self::TEMPLATE_FILES[$statusCode]) ); } /** * @param ServerRequestInterface $request * @param string $message * @param array $reasons * @return ResponseInterface */ public function handlePageError( ServerRequestInterface $request, string $message, array $reasons = [] ): ResponseInterface { $homeUri = "https://opentalent.fr"; $title = 'Page introuvable'; // This variable role is to prevent redirection loop, $isCircular = preg_match('/.*\/page-introuvable/', $request->getUri()->getPath()); $pageRepository = GeneralUtility::makeInstance(OtPageRepository::class); $site = $pageRepository->getCurrentSite(); if ($site && !$isCircular){ $homeUri = $site->getBase(); $rootUid = $site->getRootPageId(); $rootPage = $pageRepository->getPage($rootUid); if (!empty($rootPage)) { $title = $rootPage['title']; $subPages = $pageRepository->getAllSubpagesForPage($rootUid, true); foreach ($subPages as $page) { if ($page['slug'] == '/page-introuvable') { $errorHandler = GeneralUtility::makeInstance( PageContentErrorHandler::class, $this->statusCode, [ 'errorHandler' => 'Page', 'errorContentSource' => 't3://page?uid=' . $page['uid'] ] ); return $errorHandler->handlePageError($request, $message, $reasons); } } } else { $title = "Page inexistante"; $homeUri = self::REDIRECT_FALLBACK; } } // At this point, the site has not been determined or // this site has no subpage with slug '/page-introuvable' $this->view->assignMultiple([ 'request' => $request, 'message' => $message, 'reasons' => $reasons, 'homeUri' => $homeUri, 'siteTitle' => $title ]); return new HtmlResponse($this->view->render(), $this->statusCode); } }