Browse Source

Override the PageResolver middleware by adding the id query param

Olivier Massot 4 năm trước cách đây
mục cha
commit
4c2530dd99

+ 28 - 3
ot_core/Classes/Website/OtWebsiteRepository.php

@@ -247,14 +247,14 @@ class OtWebsiteRepository
     }
 
     /**
-     * Try to retrieve the website matching the given Uri
+     * Try to retrieve the website matching the given Uri and return the given website
      *
      * @param \Psr\Http\Message\UriInterface $uri
      * @param bool $devMode
      * @return Site
      * @throws NoSuchWebsiteException
      */
-    public function matchUriToWebsite(\Psr\Http\Message\UriInterface $uri, bool $devMode=false): Site
+    public function matchUriToWebsite(\Psr\Http\Message\UriInterface $uri, bool $devMode=false): array
     {
         $queryBuilder = $this->connectionPool->getQueryBuilderForTable('ot_websites');
 
@@ -281,7 +281,32 @@ class OtWebsiteRepository
             throw new NoSuchWebsiteException('No website found for this URI: ' . $uri);
         }
 
-        return $this->generateWebsiteConfiguration($website);
+        return $website;
+    }
+
+    /**
+     * @param \Psr\Http\Message\UriInterface $uri
+     * @param bool $devMode
+     * @return int
+     * @throws NoSuchWebsiteException
+     */
+    public function matchUriToPage(\Psr\Http\Message\UriInterface $uri, bool $devMode=false): int
+    {
+        $website = $this->matchUriToWebsite($uri, $devMode);
+
+        $tail = $uri->getPath();
+        if ($devMode) {
+            $tail = preg_replace("/\/?[\w\-]+\/(.*)/", "/$1", $tail);
+        }
+
+        $q = $this->connectionPool->getQueryBuilderForTable('pages');
+        return $q
+            ->select('uid')
+            ->from('pages')
+            ->where($q->expr()->eq('ot_website_uid', $website['uid']))
+            ->andWhere($q->expr()->eq('slug', $q->expr()->literal($tail)))
+            ->execute()
+            ->fetchColumn(0);
     }
 
     /**

+ 7 - 1
ot_optimizer/Classes/Routing/SiteMatcher.php

@@ -4,6 +4,7 @@ namespace Opentalent\OtOptimizer\Routing;
 use Opentalent\OtCore\Website\OtWebsiteRepository;
 use Psr\Http\Message\ServerRequestInterface;
 use TYPO3\CMS\Core\Routing\SiteRouteResult;
+use TYPO3\CMS\Core\Site\SiteFinder;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Extbase\Object\ObjectManager;
 
@@ -15,6 +16,10 @@ use TYPO3\CMS\Extbase\Object\ObjectManager;
  */
 class SiteMatcher extends \TYPO3\CMS\Core\Routing\SiteMatcher
 {
+    public function __construct($finder = null)
+    {
+    }
+
     /**
      * Override the default Typo3 \TYPO3\CMS\Core\Routing\SiteMatcher
      *
@@ -28,7 +33,8 @@ class SiteMatcher extends \TYPO3\CMS\Core\Routing\SiteMatcher
 
         $otWebsiteRepository = GeneralUtility::makeInstance(ObjectManager::class)->get(OtWebsiteRepository::class);
 
-        $site = $otWebsiteRepository->matchUriToWebsite($request->getUri(), $devMode);
+        $otWebsite = $otWebsiteRepository->matchUriToWebsite($request->getUri(), $devMode);
+        $site = $otWebsiteRepository->generateWebsiteConfiguration($otWebsite);
 
         if ($devMode) {
             preg_match("/\w+\/(.*)/", $request->getUri()->getPath(), $m);

+ 1 - 1
ot_optimizer/Classes/XClass/Core/Routing/OtPageRouter.php

@@ -106,7 +106,7 @@ class OtPageRouter extends PageRouter
 
         // <----
         // special: patch 2020-09-22 by Opentalent, for performances reason
-        // >> made for typo3 v10.4.8
+        // >> made for typo3 v9.5.22
         $siteRootPageUid = $this->site->getRootPageId();
         $sitePages = $this->getAllSubpagesUidFor($siteRootPageUid);
         // ---->

+ 0 - 0
ot_optimizer/Classes/Site/SiteFinder.php → ot_optimizer/Classes/XClass/Core/Site/SiteFinder.php


+ 47 - 0
ot_optimizer/Classes/XClass/Frontend/Middleware/OtPageResolver.php

@@ -0,0 +1,47 @@
+<?php
+
+
+namespace Opentalent\OtOptimizer\XClass\Frontend\Middleware;
+
+
+use Opentalent\OtCore\Website\OtWebsiteRepository;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Server\RequestHandlerInterface;
+use TYPO3\CMS\Core\Utility\GeneralUtility;
+use TYPO3\CMS\Extbase\Object\ObjectManager;
+
+class OtPageResolver extends \TYPO3\CMS\Frontend\Middleware\PageResolver
+{
+    private bool $shallFallback;
+
+    public function __construct($controller = null)
+    {
+        $this->shallFallback = $_COOKIE['optimize'] != 1;
+
+        parent::__construct($controller);
+    }
+
+    /**
+     * Resolve the page ID
+     *
+     * @param ServerRequestInterface $request
+     * @param RequestHandlerInterface $handler
+     * @return ResponseInterface
+     */
+    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
+    {
+        if ($this->shallFallback) {
+            return parent::process($request, $handler);
+        }
+
+        $otWebsiteRepository = GeneralUtility::makeInstance(ObjectManager::class)->get(OtWebsiteRepository::class);
+        $devMode = $_SERVER['TYPO3_CONTEXT'] == "Development";
+
+        $params = $request->getQueryParams();
+        $params['id'] = $otWebsiteRepository->matchUriToPage($request->getUri(), $devMode);
+        $request = $request->withQueryParams($params);
+
+        return parent::process($request, $handler);
+    }
+}

+ 2 - 1
ot_optimizer/Classes/XClass/Frontend/Middleware/SiteResolver.php → ot_optimizer/Classes/XClass/Frontend/Middleware/OtSiteResolver.php

@@ -10,8 +10,9 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Extbase\Object\ObjectManager;
 
 /**
+ *
  */
-class SiteResolver extends \TYPO3\CMS\Frontend\Middleware\SiteResolver
+class OtSiteResolver extends \TYPO3\CMS\Frontend\Middleware\SiteResolver
 {
     private bool $shallFallback;
 

+ 10 - 1
ot_optimizer/Configuration/RequestMiddlewares.php

@@ -6,7 +6,7 @@
 return [
     'frontend' => [
         'typo3/cms-frontend/site' => [
-            'target' => Opentalent\OtOptimizer\XClass\Frontend\Middleware\SiteResolver::class,
+            'target' => Opentalent\OtOptimizer\XClass\Frontend\Middleware\OtSiteResolver::class,
             'before' => [
                 'typo3/cms-adminpanel/initiator'
             ],
@@ -14,5 +14,14 @@ return [
                 'typo3/cms-adminpanel/sql-logging'
             ],
         ],
+        'typo3/cms-frontend/page-resolver' => [
+            'target' => Opentalent\OtOptimizer\XClass\Frontend\Middleware\OtPageResolver::class,
+            'before' => [
+                'typo3/frontendediting/initiator'
+            ],
+            'after' => [
+                'typo3/cms-frontend/preview-simulator'
+            ],
+        ],
     ],
 ];

+ 7 - 4
ot_optimizer/ext_localconf.php

@@ -1,9 +1,12 @@
 <?php
 defined('TYPO3_MODE') || die();
 
-$GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects'][TYPO3\CMS\Core\Routing\PageRouter::class] = [
-    'className' => Opentalent\OtOptimizer\XClass\Core\Routing\OtPageRouter::class
-];
+//$GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects'][TYPO3\CMS\Core\Routing\PageRouter::class] = [
+//    'className' => Opentalent\OtOptimizer\XClass\Core\Routing\OtPageRouter::class
+//];
 
 // \TYPO3\CMS\Frontend\Middleware\SiteResolver is overridden but not xclassed here; instead it is
-//   replaced in the middlewares array
+//   replaced in the middlewares array (@see ot_optimizer/Configuration/RequestMiddlewares.php)
+
+// \TYPO3\CMS\Frontend\Middleware\PageResolver is overridden but not xclassed here; instead it is
+//   replaced in the middlewares array (@see ot_optimizer/Configuration/RequestMiddlewares.php)