Browse Source

add error handling

Olivier Massot 5 years ago
parent
commit
85a45119fc

+ 83 - 0
ot_templating/Classes/Page/ErrorHandler.php

@@ -0,0 +1,83 @@
+<?php
+
+namespace Opentalent\OtTemplating\Page;
+
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use TYPO3\CMS\Core\Configuration\ExtensionConfiguration;
+use TYPO3\CMS\Core\Error\PageErrorHandler\PageErrorHandlerInterface;
+use TYPO3\CMS\Core\Http\HtmlResponse;
+use TYPO3\CMS\Core\Utility\GeneralUtility;
+use TYPO3\CMS\Fluid\View\TemplateView;
+use TYPO3Fluid\Fluid\View\ViewInterface;
+
+class ErrorHandler implements PageErrorHandlerInterface
+{
+    const TEMPLATES_ROOT_PATHS = 'EXT:ot_templating/Resources/Private/Templates';
+    const LAYOUTS_ROOT_PATHS = 'EXT:ot_templating/Resources/Private/Layouts';
+    const PARTIALS_ROOT_PATHS = 'EXT:ot_templating/Resources/Private/Partials';
+
+    const TEMPLATE_FILES = [
+        403 => 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'
+    ];
+
+    /**
+     * 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 {
+
+        $pageRepository = GeneralUtility::makeInstance(OtPageRepository::class);
+        $site = $pageRepository->getCurrentSite();
+        $baseUri = $site->getBase();
+
+        $this->view->assignMultiple([
+            'request' => $request,
+            'message' => $message,
+            'reasons' => $reasons,
+            'homeUri' => $baseUri,
+            'siteTitle' => $site->getConfiguration()['websiteTitle']
+        ]);
+
+        return new HtmlResponse($this->view->render(), $this->statusCode);
+    }
+}

+ 28 - 0
ot_templating/Resources/Private/Templates/Page/Error/403.html

@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html dir="ltr" lang="fr-FR">
+<head>
+    <meta charset="utf-8">
+
+    <title>{siteTitle}</title>
+    <meta name="generator" content="TYPO3 CMS" />
+    <meta name="robots" content="index,follow,archive" />
+    <meta name="viewport" content="width=device-width" />
+    <meta name="twitter:card" content="summary" />
+
+    <link rel="stylesheet"
+          type="text/css"
+          href="/typo3conf/ext/ot_templating/Resources/Public/assets/_common/style/errpages.css"/>
+</head>
+<body>
+<div id="errpage">
+    <header>
+        <h1 class="title">{siteTitle}</h1>
+    </header>
+
+    <div class="message">
+        <p>Vous n'êtes pas autorisé à consulter cette page</p>
+        <p>Avez vous pensé à vous authentifier?</p>
+        <a href="{homeUri}">Revenir à la page d'accueil</a>
+    </div>
+</div>
+</body>

+ 30 - 0
ot_templating/Resources/Private/Templates/Page/Error/404.html

@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html dir="ltr" lang="fr-FR">
+<head>
+    <meta charset="utf-8">
+
+    <title>{siteTitle}</title>
+    <meta name="generator" content="TYPO3 CMS" />
+    <meta name="robots" content="index,follow,archive" />
+    <meta name="viewport" content="width=device-width" />
+    <meta name="twitter:card" content="summary" />
+
+    <link rel="stylesheet"
+          type="text/css"
+          href="/typo3conf/ext/ot_templating/Resources/Public/assets/_common/style/errpages.css"/>
+</head>
+<body>
+    <div id="errpage">
+        <header>
+            <h1 class="title">{siteTitle}</h1>
+        </header>
+
+        <div class="message">
+            <p>Il semblerait que la page que vous souhaitez consulter n'existe pas ou n'est plus disponible.</p>
+            <p>
+                Veuillez vérifier que l'URL saisie est bien correcte, ou
+               <a href="{homeUri}">cliquez ici pour revenir à la page d'accueil.</a>
+            </p>
+        </div>
+    </div>
+</body>

+ 26 - 0
ot_templating/Resources/Private/Templates/Page/Error/500.html

@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html dir="ltr" lang="fr-FR">
+<head>
+    <meta charset="utf-8">
+
+    <title>{siteTitle}</title>
+    <meta name="generator" content="TYPO3 CMS" />
+    <meta name="robots" content="index,follow,archive" />
+    <meta name="viewport" content="width=device-width" />
+    <meta name="twitter:card" content="summary" />
+
+    <link rel="stylesheet"
+          type="text/css"
+          href="/typo3conf/ext/ot_templating/Resources/Public/assets/_common/style/errpages.css"/>
+</head>
+<body>
+<div id="errpage">
+    <header>
+        <h1 class="title">{siteTitle}</h1>
+    </header>
+
+    <div class="message">
+        <p>Une erreur s'est produite, nous nous excusons pour la gêne occasionnée</p>
+    </div>
+</div>
+</body>

+ 43 - 0
ot_templating/Resources/Public/assets/_common/style/errpages.css

@@ -0,0 +1,43 @@
+
+#errpage {
+    width: 100%;
+    font-family: 'Source Sans Pro',sans-serif;;
+}
+
+#errpage header {
+    display: flex;
+    flex-direction: row;
+    justify-content: center;
+    align-items: center;
+    height: 200px;
+}
+
+#errpage .title {
+    color: #4d4d4d;
+}
+
+#errpage .message {
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    align-items: center;
+    text-align: center;
+    min-height: 200px;
+    line-height: 2em;
+    font-size: 17px;
+    padding: 24px 0;
+    background-color: #ffe6cc;
+}
+
+#errpage a {
+    margin-top: 16px;
+    font-weight: bold;
+    color: #b35c00;
+    text-decoration: none;
+    padding: 3px;
+}
+
+#errpage a:hover {
+    color: #994f00;
+}
+