[!!!][BUGFIX] Respect selected target for shortcut mode 'Parent page' 42/28542/6
authorCaspar Stuebs <caspar@gosign.de>
Wed, 19 Mar 2014 18:44:25 +0000 (19:44 +0100)
committerMarkus Klein <klein.t3@reelworx.at>
Fri, 2 Jan 2015 19:19:07 +0000 (20:19 +0100)
The selected page is now respected when selecting the parent page
to use. An upgrade wizard ensures that existing shortcuts will not
break by removing the currently selected page.

The 6.2 version of this patch will only adjust the label to not
mention the "selected page" part, so the label matches
the current behaviour.

Change-Id: I51bc9239871d93728e84a4fe2e3b8bc9bb4a7404
Resolves: #57089
Releases: master, 6.2
Reviewed-on: http://review.typo3.org/28542
Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Reviewed-by: Markus Klein <klein.t3@reelworx.at>
Tested-by: Markus Klein <klein.t3@reelworx.at>
typo3/sysext/core/Documentation/Changelog/master/Breaking-57089-ShortcutBehaviour.rst [new file with mode: 0644]
typo3/sysext/frontend/Classes/Controller/TypoScriptFrontendController.php
typo3/sysext/install/Classes/Updates/PageShortcutParentUpdate.php [new file with mode: 0644]
typo3/sysext/install/ext_localconf.php

diff --git a/typo3/sysext/core/Documentation/Changelog/master/Breaking-57089-ShortcutBehaviour.rst b/typo3/sysext/core/Documentation/Changelog/master/Breaking-57089-ShortcutBehaviour.rst
new file mode 100644 (file)
index 0000000..1138083
--- /dev/null
@@ -0,0 +1,29 @@
+=====================================================================================
+Breaking: #57089 - Behaviour of page shortcut to "Parent of selected or current page"
+=====================================================================================
+
+Description
+===========
+
+In former versions of TYPO3 CMS the page shortcut type "Parent of selected or current page" had a misleading label
+as the selected page was never taken into account, it always chose the parent of the current page.
+
+This is changed now and a selected page is considered, so the parent of the selected page is taken as target page.
+
+Impact
+======
+
+Assuming the supplied upgrade wizard was run, the behaviour of existing shortcuts will not change.
+
+If you fail to run the upgrade wizard, the target of a shortcut is changed to the parent of the
+selected page as the selected page is now respected.
+
+Affected installations
+======================
+
+Any installation using shortcut pages with shortcut type "Parent of selected or current page"
+
+Migration
+=========
+
+Run the supplied upgrade wizard in the Install Tool if it shows up.
index 51fd023..ac513fe 100644 (file)
@@ -1589,7 +1589,7 @@ class TypoScriptFrontendController {
                                }
                                break;
                        case PageRepository::SHORTCUT_MODE_PARENT_PAGE:
-                               $parent = $this->sys_page->getPage($thisUid, $disableGroupCheck);
+                               $parent = $this->sys_page->getPage($idArray[0] ? $idArray[0] : $thisUid, $disableGroupCheck);
                                $page = $this->sys_page->getPage($parent['pid'], $disableGroupCheck);
                                if (count($page) == 0) {
                                        $message = 'This page (ID ' . $thisUid . ') is of type "Shortcut" and configured to redirect to its parent page. ' . 'However, the parent page is not accessible.';
diff --git a/typo3/sysext/install/Classes/Updates/PageShortcutParentUpdate.php b/typo3/sysext/install/Classes/Updates/PageShortcutParentUpdate.php
new file mode 100644 (file)
index 0000000..e910176
--- /dev/null
@@ -0,0 +1,85 @@
+<?php
+namespace TYPO3\CMS\Install\Updates;
+
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+use TYPO3\CMS\Frontend\Page\PageRepository;
+
+/**
+ * Update all pages which have set the shortcut mode "Parent of selected or current page" (PageRepository::SHORTCUT_MODE_PARENT_PAGE)
+ * to remove a possibly selected page as this would cause a different behaviour of the shortcut now
+ * since the selected page is now respected in this shortcut mode.
+ *
+ * @author Markus Klein <klein.t3@reelworx.at>
+ */
+class PageShortcutParentUpdate extends AbstractUpdate {
+
+       /**
+        * @var string
+        */
+       protected $title = 'Update page shortcuts with shortcut type "Parent of selected or current page"';
+
+       /**
+        * Checks if an update is needed
+        *
+        * @param string &$description The description for the update
+        * @return bool Whether an update is needed (TRUE) or not (FALSE)
+        */
+       public function checkForUpdate(&$description) {
+               if ($this->isWizardDone()) {
+                       return FALSE;
+               }
+
+               $pagesNeedingUpdate = $this->getUpdatablePages();
+               if (empty($pagesNeedingUpdate)) {
+                       return FALSE;
+               }
+
+               $description = 'There are some shortcut pages that need to updated in order to preserve their current behaviour.';
+
+               return TRUE;
+       }
+
+       /**
+        * Get pages which need to be updated
+        *
+        * @return array|NULL
+        */
+       protected function getUpdatablePages() {
+               return $this->getDatabaseConnection()->exec_SELECTgetRows('uid', 'pages', 'shortcut <> 0 AND shortcut_mode = ' . PageRepository::SHORTCUT_MODE_PARENT_PAGE);
+       }
+
+       /**
+        * Performs the database update
+        *
+        * @param array &$databaseQueries Queries done in this update
+        * @param mixed &$customMessages Custom messages
+        * @return bool
+        */
+       public function performUpdate(array &$databaseQueries, &$customMessages) {
+               $pagesNeedingUpdate = $this->getUpdatablePages();
+               if (!empty($pagesNeedingUpdate)) {
+                       $uids = array_column($pagesNeedingUpdate, 'uid');
+                       $this->getDatabaseConnection()->exec_UPDATEquery(
+                               'pages',
+                               'uid IN (' . implode(',', $uids) . ')',
+                               [ 'shortcut' => 0 ]
+                       );
+                       $databaseQueries[] = $this->getDatabaseConnection()->debug_lastBuiltQuery;
+               }
+
+               $this->markWizardAsDone();
+               return TRUE;
+       }
+}
index ab0371b..097888f 100644 (file)
@@ -7,6 +7,7 @@ $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update']['changeCompat
 // TYPO3 CMS 7
 $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update']['backendUserStartModule'] = \TYPO3\CMS\Install\Updates\BackendUserStartModuleUpdate::class;
 $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update']['languageIsoCode'] = \TYPO3\CMS\Install\Updates\LanguageIsoCodeUpdate::class;
+$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update']['PageShortcutParent'] = \TYPO3\CMS\Install\Updates\PageShortcutParentUpdate::class;
 
 $signalSlotDispatcher = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Extbase\SignalSlot\Dispatcher::class);
 $signalSlotDispatcher->connect(