[BUGFIX] Make bookmarks to single records working 05/41705/2
authorMarkus Klein <markus.klein@typo3.org>
Sun, 19 Jul 2015 15:48:47 +0000 (17:48 +0200)
committerStefan Froemken <froemken@gmail.com>
Mon, 20 Jul 2015 15:28:33 +0000 (17:28 +0200)
Fix the broken bookmarks to single records. Currently
existing bookmarks have to be recreated.

Releases: master
Resolves: #68369
Change-Id: Ibe4dcbba015e65b85869443e0a74e68a6fe39441
Reviewed-on: http://review.typo3.org/41705
Reviewed-by: Wouter Wolters <typo3@wouterwolters.nl>
Tested-by: Wouter Wolters <typo3@wouterwolters.nl>
Reviewed-by: Frederic Gaus <frederic.gaus@flagbit.de>
Tested-by: Frederic Gaus <frederic.gaus@flagbit.de>
Reviewed-by: Stefan Froemken <froemken@gmail.com>
Tested-by: Stefan Froemken <froemken@gmail.com>
typo3/sysext/backend/Classes/Backend/ToolbarItems/ShortcutToolbarItem.php
typo3/sysext/backend/Classes/Template/DocumentTemplate.php
typo3/sysext/backend/Resources/Public/JavaScript/Toolbar/ShortcutMenu.js

index fd6b2ff..2a4cbec 100644 (file)
@@ -258,13 +258,13 @@ class ShortcutToolbarItem implements ToolbarItemInterface {
                        }
                        // Check for module access
                        $moduleName = $row['M_module_name'] ?: $row['module_name'];
-                       $pageId = $this->getLinkedPageId($row['url']);
                        if (!$backendUser->isAdmin()) {
                                if (!isset($this->getLanguageService()->moduleLabels['tabs_images'][$moduleName . '_tab'])) {
                                        // Nice hack to check if the user has access to this module
                                        // - otherwise the translation label would not have been loaded :-)
                                        continue;
                                }
+                               $pageId = $this->getLinkedPageId($row['url']);
                                if (MathUtility::canBeInterpretedAsInteger($pageId)) {
                                        // Check for webmount access
                                        if (!$backendUser->isInWebMount($pageId)) {
@@ -503,6 +503,7 @@ class ShortcutToolbarItem implements ToolbarItemInterface {
                        if (is_array($queryParameters['edit'])) {
                                $shortcut['table'] = key($queryParameters['edit']);
                                $shortcut['recordid'] = key($queryParameters['edit'][$shortcut['table']]);
+                               $shortcut['pid'] = BackendUtility::getRecord($shortcut['table'], $shortcut['recordid'])['pid'];
                                if ($queryParameters['edit'][$shortcut['table']][$shortcut['recordid']] == 'edit') {
                                        $shortcut['type'] = 'edit';
                                        $shortcutNamePrepend = $languageService->getLL('shortcut_edit', TRUE);
@@ -512,14 +513,17 @@ class ShortcutToolbarItem implements ToolbarItemInterface {
                                }
                        } else {
                                $shortcut['type'] = 'other';
+                               $shortcut['table'] = '';
+                               $shortcut['recordid'] = 0;
                        }
                        // Lookup the title of this page and use it as default description
-                       $pageId = $shortcut['recordid'] ? $shortcut['recordid'] : $this->getLinkedPageId($url);
-                       if (MathUtility::canBeInterpretedAsInteger($pageId)) {
+
+                       $pageId = (int)($shortcut['pid'] ?: ($shortcut['recordid'] ?: $this->getLinkedPageId($url)));
+                       if ($pageId) {
                                $page = BackendUtility::getRecord('pages', $pageId);
                                if (!empty($page)) {
                                        // Set the name to the title of the page
-                                       if ($shortcut['type'] == 'other') {
+                                       if ($shortcut['type'] === 'other') {
                                                $shortcutName = $page['title'];
                                        } else {
                                                $shortcutName = $shortcutNamePrepend . ' ' . $languageService->sL($GLOBALS['TCA'][$shortcut['table']]['ctrl']['title']) . ' (' . $page['title'] . ')';
index 65c37fa..a02df85 100644 (file)
@@ -631,25 +631,29 @@ function jumpToUrl(URL) {
         * @param string $gvList Is the list of GET variables to store (if any)
         * @param string $setList Is the list of SET[] variables to store (if any) - SET[] variables a stored in $GLOBALS["SOBE"]->MOD_SETTINGS for backend modules
         * @param string $modName Module name string
-        * @param string $motherModName Is used to enter the "parent module name" if the module is a submodule under eg. Web>* or File>*. You can also set this value to "1" in which case the currentLoadedModule is sent to the shortcut script (so - not a fixed value!) - that is used in file_edit and wizard_rte modules where those are really running as a part of another module.
+        * @param string|int $motherModName Is used to enter the "parent module name" if the module is a submodule under eg. Web>* or File>*. You can also set this value to 1 in which case the currentLoadedModule is sent to the shortcut script (so - not a fixed value!) - that is used in file_edit and wizard_rte modules where those are really running as a part of another module.
         * @return string HTML content
         */
        public function makeShortcutIcon($gvList, $setList, $modName, $motherModName = '') {
                $storeUrl = $this->makeShortcutUrl($gvList, $setList);
                $pathInfo = parse_url(GeneralUtility::getIndpEnv('REQUEST_URI'));
+               // Fallback for alt_mod. We still pass in the old xMOD... stuff, but TBE_MODULES only knows about "record_edit".
+               // We still need to pass the xMOD name to createShortcut below, since this is used for icons.
+               $moduleName = $modName === 'xMOD_alt_doc.php' ? 'record_edit' : $modName;
                // Add the module identifier automatically if typo3/index.php is used:
-               if (GeneralUtility::_GET('M') !== NULL && isset($GLOBALS['TBE_MODULES']['_PATHS'][$modName])) {
-                       $storeUrl = '&M=' . $modName . $storeUrl;
+               if (GeneralUtility::_GET('M') !== NULL && isset($GLOBALS['TBE_MODULES']['_PATHS'][$moduleName])) {
+                       $storeUrl = '&M=' . $moduleName . $storeUrl;
                }
                if ((int)$motherModName === 1) {
-                       $mMN = '&motherModName=\'+top.currentModuleLoaded+\'';
+                       $motherModule = 'top.currentModuleLoaded';
                } elseif ($motherModName) {
-                       $mMN = '&motherModName=' . rawurlencode($motherModName);
+                       $motherModule = GeneralUtility::quoteJSvalue($motherModName);
                } else {
-                       $mMN = '';
+                       $motherModule = '\'\'';
                }
                $confirmationText = GeneralUtility::quoteJSvalue($GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xlf:labels.makeBookmark'));
-               $onClick = 'top.TYPO3.ShortcutMenu.createShortcut(' . GeneralUtility::quoteJSvalue(rawurlencode($modName)) . ', ' . GeneralUtility::quoteJSvalue(rawurlencode($pathInfo['path'] . '?' . $storeUrl) . $mMN) . ', ' . $confirmationText . ');return false;';
+               $url = GeneralUtility::quoteJSvalue(rawurlencode($pathInfo['path'] . '?' . $storeUrl));
+               $onClick = 'top.TYPO3.ShortcutMenu.createShortcut(' . GeneralUtility::quoteJSvalue(rawurlencode($modName)) . ', ' . $url . ', ' . $confirmationText . ', ' . $motherModule . ');return false;';
                return '<a href="#" onclick="' . htmlspecialchars($onClick) . '" title="' . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xlf:labels.makeBookmark', TRUE) . '">' . IconUtility::getSpriteIcon('actions-system-shortcut-new') . '</a>';
        }
 
index 24b25df..d0f63e0 100644 (file)
@@ -102,7 +102,7 @@ define('TYPO3/CMS/Backend/Toolbar/ShortcutMenu', ['jquery'], function($) {
         * makes a call to the backend class to create a new shortcut,
         * when finished it reloads the menu
         */
-       ShortcutMenu.createShortcut = function(moduleName, url, confirmationText) {
+       ShortcutMenu.createShortcut = function(moduleName, url, confirmationText, motherModule) {
                var shouldCreateShortcut = true;
                if (typeof confirmationText !== 'undefined') {
                        shouldCreateShortcut = window.confirm(confirmationText);
@@ -118,7 +118,8 @@ define('TYPO3/CMS/Backend/Toolbar/ShortcutMenu', ['jquery'], function($) {
                                type: 'post',
                                data: {
                                        module: moduleName,
-                                       url: url
+                                       url: url,
+                                       motherModName: motherModule
                                },
                                cache: false
                        }).done(function() {