ErrorHandler.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. <?php
  2. namespace Opentalent\OtTemplating\Page;
  3. use Opentalent\OtCore\Page\OtPageRepository;
  4. use Psr\Http\Message\ResponseInterface;
  5. use Psr\Http\Message\ServerRequestInterface;
  6. use TYPO3\CMS\Core\Error\PageErrorHandler\PageContentErrorHandler;
  7. use TYPO3\CMS\Core\Error\PageErrorHandler\PageErrorHandlerInterface;
  8. use TYPO3\CMS\Core\Http\HtmlResponse;
  9. use TYPO3\CMS\Core\Utility\GeneralUtility;
  10. use TYPO3\CMS\Extbase\Object\ObjectManager;
  11. use TYPO3\CMS\Fluid\View\TemplateView;
  12. use TYPO3Fluid\Fluid\View\ViewInterface;
  13. class ErrorHandler implements PageErrorHandlerInterface
  14. {
  15. const TEMPLATES_ROOT_PATHS = 'EXT:ot_templating/Resources/Private/Templates';
  16. const LAYOUTS_ROOT_PATHS = 'EXT:ot_templating/Resources/Private/Layouts';
  17. const PARTIALS_ROOT_PATHS = 'EXT:ot_templating/Resources/Private/Partials';
  18. const TEMPLATE_FILES = [
  19. 403 => self::TEMPLATES_ROOT_PATHS . '/Page/Error/403.html',
  20. 404 => self::TEMPLATES_ROOT_PATHS . '/Page/Error/404.html',
  21. 500 => self::TEMPLATES_ROOT_PATHS . '/Page/Error/500.html'
  22. ];
  23. const REDIRECT_FALLBACK = 'https://opentalent.fr';
  24. /**
  25. * Status code of the response
  26. * @var int
  27. */
  28. protected $statusCode;
  29. /**
  30. * Configuration of the error handler as set in site configuration.
  31. * @var array
  32. */
  33. protected $errorHandlerConfiguration;
  34. /**
  35. * @var ViewInterface
  36. */
  37. protected $view;
  38. public function __construct(int $statusCode, array $configuration)
  39. {
  40. $this->statusCode = $statusCode;
  41. $this->errorHandlerConfiguration = $configuration;
  42. $this->view = GeneralUtility::makeInstance(TemplateView::class);
  43. $this->view->setTemplateRootPaths([self::TEMPLATES_ROOT_PATHS]);
  44. $this->view->setLayoutRootPaths([self::LAYOUTS_ROOT_PATHS]);
  45. $this->view->setPartialRootPaths([self::PARTIALS_ROOT_PATHS]);
  46. $this->view->setTemplatePathAndFilename(
  47. GeneralUtility::getFileAbsFileName(self::TEMPLATE_FILES[$statusCode])
  48. );
  49. }
  50. /**
  51. * @param ServerRequestInterface $request
  52. * @param string $message
  53. * @param array $reasons
  54. * @return ResponseInterface
  55. */
  56. public function handlePageError(
  57. ServerRequestInterface $request,
  58. string $message,
  59. array $reasons = []
  60. ): ResponseInterface {
  61. $homeUri = "https://opentalent.fr";
  62. $title = 'Page introuvable';
  63. // This variable role is to prevent redirection loop,
  64. $isCircular = preg_match('/.*\/page-introuvable/', $request->getUri()->getPath());
  65. $pageRepository = GeneralUtility::makeInstance(ObjectManager::class)->get(OtPageRepository::class);
  66. $site = $pageRepository->getCurrentSite();
  67. if ($site && !$isCircular){
  68. $homeUri = $site->getBase();
  69. $rootUid = $site->getRootPageId();
  70. $rootPage = $pageRepository->getPage($rootUid);
  71. if (!empty($rootPage)) {
  72. $title = $rootPage['title'];
  73. $subPages = $pageRepository->getAllSubpagesForPage($rootUid, true);
  74. foreach ($subPages as $page) {
  75. if ($page['slug'] == '/page-introuvable') {
  76. $errorHandler = GeneralUtility::makeInstance(
  77. PageContentErrorHandler::class,
  78. $this->statusCode,
  79. [
  80. 'errorHandler' => 'Page',
  81. 'errorContentSource' => 't3://page?uid=' . $page['uid']
  82. ]
  83. );
  84. return $errorHandler->handlePageError($request, $message, $reasons);
  85. }
  86. }
  87. } else {
  88. $title = "Page inexistante";
  89. $homeUri = self::REDIRECT_FALLBACK;
  90. }
  91. }
  92. // At this point, the site has not been determined or
  93. // this site has no subpage with slug '/page-introuvable'
  94. $this->view->assignMultiple([
  95. 'request' => $request,
  96. 'message' => $message,
  97. 'reasons' => $reasons,
  98. 'homeUri' => $homeUri,
  99. 'siteTitle' => $title
  100. ]);
  101. return new HtmlResponse($this->view->render(), $this->statusCode);
  102. }
  103. }