From ba457e83585b3d7690255520350d1158772354c9 Mon Sep 17 00:00:00 2001
From: Benni Mack <benni@typo3.org>
Date: Mon, 4 May 2020 16:47:23 +0200
Subject: [PATCH] [BUGFIX] Enable Enhancer support for MountPoints

When using e.g. PageTypeDecorator in conjunction with mountpoints
and other Enhancers, the MP parameter was not added to the
resulting PageArguments object.

In addition, when building up a RouteCollection internally, the
same page was used multiple times but was overridden with a
MountPoint argument, adding to the "last principle wins" concept.

The patch adapts the needed changes.

Resolves: #90731
Releases: master, 9.5
Change-Id: Ic8c70dd51dc37617ba97cace3b9bec63512ecad6
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/64403
Tested-by: Jan Kornblum <jan.kornblum@gmx.de>
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: Oliver Hader <oliver.hader@typo3.org>
Tested-by: Benni Mack <benni@typo3.org>
Reviewed-by: Jan Kornblum <jan.kornblum@gmx.de>
Reviewed-by: Oliver Hader <oliver.hader@typo3.org>
Reviewed-by: Benni Mack <benni@typo3.org>
---
 .../core/Classes/Routing/Enhancer/PluginEnhancer.php      | 4 ++++
 .../core/Classes/Routing/Enhancer/SimpleEnhancer.php      | 4 ++++
 typo3/sysext/core/Classes/Routing/PageRouter.php          | 8 +++++++-
 3 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/typo3/sysext/core/Classes/Routing/Enhancer/PluginEnhancer.php b/typo3/sysext/core/Classes/Routing/Enhancer/PluginEnhancer.php
index e76d210d10df..7f23d13a313a 100644
--- a/typo3/sysext/core/Classes/Routing/Enhancer/PluginEnhancer.php
+++ b/typo3/sysext/core/Classes/Routing/Enhancer/PluginEnhancer.php
@@ -85,6 +85,10 @@ class PluginEnhancer extends AbstractEnhancer implements RoutingEnhancerInterfac
 
         $page = $route->getOption('_page');
         $pageId = (int)($page['l10n_parent'] > 0 ? $page['l10n_parent'] : $page['uid']);
+        // See PageSlugCandidateProvider where this is added.
+        if ($page['MPvar'] ?? '') {
+            $routeArguments['MP'] = $page['MPvar'];
+        }
         $type = $this->resolveType($route, $remainingQueryParameters);
         return new PageArguments($pageId, $type, $routeArguments, $staticArguments, $remainingQueryParameters);
     }
diff --git a/typo3/sysext/core/Classes/Routing/Enhancer/SimpleEnhancer.php b/typo3/sysext/core/Classes/Routing/Enhancer/SimpleEnhancer.php
index 25e3511def4e..c8c34899d42a 100644
--- a/typo3/sysext/core/Classes/Routing/Enhancer/SimpleEnhancer.php
+++ b/typo3/sysext/core/Classes/Routing/Enhancer/SimpleEnhancer.php
@@ -73,6 +73,10 @@ class SimpleEnhancer extends AbstractEnhancer implements RoutingEnhancerInterfac
 
         $page = $route->getOption('_page');
         $pageId = (int)($page['l10n_parent'] > 0 ? $page['l10n_parent'] : $page['uid']);
+        // See PageSlugCandidateProvider where this is added.
+        if ($page['MPvar'] ?? '') {
+            $routeArguments['MP'] = $page['MPvar'];
+        }
         $type = $this->resolveType($route, $remainingQueryParameters);
         return new PageArguments($pageId, $type, $routeArguments, $staticArguments, $remainingQueryParameters);
     }
diff --git a/typo3/sysext/core/Classes/Routing/PageRouter.php b/typo3/sysext/core/Classes/Routing/PageRouter.php
index 3bc665c0b0f9..94f331e828a5 100644
--- a/typo3/sysext/core/Classes/Routing/PageRouter.php
+++ b/typo3/sysext/core/Classes/Routing/PageRouter.php
@@ -186,7 +186,13 @@ class PageRouter implements RouterInterface
                 }
             }
 
-            $pageCollection->addNamePrefix('page_' . $page['uid'] . '_');
+            $collectionPrefix = 'page_' . $page['uid'];
+            // Pages with a MountPoint Parameter means that they have a different context, and should be treated
+            // as a separate instance
+            if (isset($page['MPvar'])) {
+                $collectionPrefix .= '_MP_' . str_replace(',', '', $page['MPvar']);
+            }
+            $pageCollection->addNamePrefix($collectionPrefix . '_');
             $fullCollection->addCollection($pageCollection);
         }
 
-- 
GitLab