[BUGFIX] Show url segment for new pages 82/58082/8
authorChristian Kuhn <lolli@schwarzbu.ch>
Thu, 30 Aug 2018 09:54:42 +0000 (11:54 +0200)
committerSusanne Moog <susanne.moog@typo3.org>
Thu, 30 Aug 2018 16:08:13 +0000 (18:08 +0200)
Fix three cases in the display condition of url segment:
* Show 'slug' if a new page in default language is added
* Resolve correct pid to positive int if a new page is
  created 'after' another one (incoming pid is negative)
* Always show slug if a new page below root (pid 0) is
  added that resolves to a NullSite

Change-Id: Id34021eb923ddde80920152a92aa76466a6e72ab
Releases: master
Resolves: #86036
Related: #85955
Reviewed-on: https://review.typo3.org/58082
Reviewed-by: Benni Mack <benni@typo3.org>
Tested-by: Benni Mack <benni@typo3.org>
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Susanne Moog <susanne.moog@typo3.org>
Tested-by: Susanne Moog <susanne.moog@typo3.org>
typo3/sysext/core/Classes/Compatibility/PseudoSiteTcaDisplayCondition.php
typo3/sysext/core/Classes/Routing/SiteMatcher.php
typo3/sysext/core/Tests/Functional/Tca/PagesVisibleFieldsTest.php

index dadb50c..8be0796 100644 (file)
@@ -16,7 +16,7 @@ namespace TYPO3\CMS\Core\Compatibility;
  */
 
 use TYPO3\CMS\Core\Routing\SiteMatcher;
-use TYPO3\CMS\Core\Site\Entity\Site;
+use TYPO3\CMS\Core\Site\Entity\PseudoSite;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 
 /**
@@ -56,18 +56,25 @@ class PseudoSiteTcaDisplayCondition
             );
         }
 
+        // uid is set if we're editing an existing page
+        // This resolves to 0 if the page is 'new'
         $defaultLanguagePageId = (int)$parameters['record']['uid'];
         if (!empty($parameters['record']['l10n_parent'][0])) {
+            // But if the page is a localized page, we take the l10n_parent as uid for the sitematcher
+            // This is 0 if the page in a default language page
             $defaultLanguagePageId = (int)$parameters['record']['l10n_parent'][0];
         }
+        // If still 0, this is probably a 'new' page somewhere, so we take the pid
+        // For additional fun, pid can be -1*real-pid, if the new page is created "after" an existing page
+        if ($defaultLanguagePageId === 0) {
+            $defaultLanguagePageId = abs((int)$parameters['record']['pid']);
+        }
+        // And if now still 0, this is a 'new' page below pid 0. This will resolve to a 'NullSite' object
 
-        // Catch all: If not a "Site" object, it must be a PseudoSite or NullSite or whatever
-        // we may have invented. To be as robust as possible we just say "yes pseudo" here.
-        $isInPseudoSite = true;
+        // If not a Site or a NullSite object, it must be a PseudoSite. We show the slug for
+        // NullSites (new pages below root) to simplify the editing workflow a bit.
         $site = GeneralUtility::makeInstance(SiteMatcher::class)->matchByPageId($defaultLanguagePageId);
-        if ($site instanceof Site) {
-            $isInPseudoSite = false;
-        }
+        $isInPseudoSite = ($site instanceof PseudoSite);
 
         if ($parameters['conditionParameters'][1] === 'false') {
             // Negate if requested
index b086268..8ba196d 100644 (file)
@@ -166,7 +166,7 @@ class SiteMatcher implements SingletonInterface
     /**
      * If a given page ID is handed in, a Site/PseudoSite/NullSite is returned.
      *
-     * @param int $pageId the page ID (must be a page in the default language)
+     * @param int $pageId uid of a page in default language
      * @param array|null $rootLine an alternative root line, if already at and.
      * @return SiteInterface
      */
index c06263d..1e58704 100644 (file)
@@ -48,7 +48,6 @@ class PagesVisibleFieldsTest extends FunctionalTestCase
         'backend_layout',
         'backend_layout_next_level',
         'content_from_pid',
-        'alias',
         'target',
         'cache_timeout',
         'cache_tags',