[TASK] Deprecate BackendUtility::editOnClick() 77/61377/6
authorAndreas Fernandez <a.fernandez@scripting-base.de>
Fri, 26 Jul 2019 13:12:50 +0000 (15:12 +0200)
committerAndreas Fernandez <a.fernandez@scripting-base.de>
Mon, 29 Jul 2019 10:40:48 +0000 (12:40 +0200)
This patch deprecates BackendUtility::editOnClick() which is used to build
a JavaScript-based redirect to the EditDocumentController for use in an
`onclick` attribute. This approach is not necessary anymore, thus all
links use a real `href` attriute now.

Also, this patch removes the following methods:
- TYPO3\CMS\Backend\View\PageLayoutView::linkWrapTable()
- TYPO3\CMS\Backend\View\PageLayoutView::linkWrapItems()
- TYPO3\CMS\Backend\View\PageLayoutView::newContentElementOnClick()

Reason is that these methods contain code that would need a migration, but
are unused in the whole Core. Since the class is marked as "internal",
it's considered safe to remove them.

Resolves: #88787
Releases: master
Change-Id: I8bd3868287204fc3275a43f938d9aeb9fbb6306d
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/61377
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: Daniel Windloff
Tested-by: Georg Ringer <georg.ringer@gmail.com>
Tested-by: Andreas Fernandez <a.fernandez@scripting-base.de>
Reviewed-by: Daniel Windloff
Reviewed-by: Georg Ringer <georg.ringer@gmail.com>
Reviewed-by: Andreas Fernandez <a.fernandez@scripting-base.de>
Build/Sources/TypeScript/info/Resources/Public/TypeScript/TranslationStatus.ts
typo3/sysext/backend/Classes/Controller/EditDocumentController.php
typo3/sysext/backend/Classes/Tree/View/PageMovingPagePositionMap.php
typo3/sysext/backend/Classes/Tree/View/PagePositionMap.php
typo3/sysext/backend/Classes/Utility/BackendUtility.php
typo3/sysext/backend/Classes/View/PageLayoutView.php
typo3/sysext/core/Documentation/Changelog/master/Deprecation-88787-BackendUtilityEditOnClick.rst [new file with mode: 0644]
typo3/sysext/info/Classes/Controller/TranslationStatusController.php
typo3/sysext/info/Resources/Public/JavaScript/TranslationStatus.js
typo3/sysext/install/Configuration/ExtensionScanner/Php/MethodCallMatcher.php
typo3/sysext/recordlist/Classes/RecordList/DatabaseRecordList.php

index b942a18..8059978 100644 (file)
@@ -33,6 +33,13 @@ class TranslationStatus {
     const languageId = parseInt($me.data('lang'), 10);
     const $newButton = $('.t3js-language-new-' + languageId);
     const $selected = $('input[type="checkbox"][data-lang="' + languageId + '"]:checked');
+
+    const additionalArguments: string[] = [];
+    $selected.each((index: number, element: Element): void => {
+      additionalArguments.push('edit[pages][' + (<HTMLInputElement>element).dataset.uid + ']=new');
+    });
+    const updatedHref = $newButton.data('editUrl') + '&' + additionalArguments.join('&');
+    $newButton.attr('href', updatedHref);
     $newButton.toggleClass('disabled', $selected.length === 0);
   }
 }
index 41246e9..6e0e417 100644 (file)
@@ -71,7 +71,6 @@ class EditDocumentController
     /**
      * An array looking approx like [tablename][list-of-ids]=command, eg. "&edit[pages][123]=edit".
      *
-     * @see \TYPO3\CMS\Backend\Utility\BackendUtility::editOnClick()
      * @var array
      */
     protected $editconf = [];
index 341e6ba..3577317 100644 (file)
@@ -42,13 +42,13 @@ class PageMovingPagePositionMap extends PagePositionMap
      * @param int $newPagePID New page id.
      * @return string Onclick attribute content
      */
-    public function onClickEvent($pid, $newPagePID)
+    public function getActionLink($pid, $newPagePID): string
     {
         $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
-        return 'window.location.href=' . GeneralUtility::quoteJSvalue((string)$uriBuilder->buildUriFromRoute('tce_db', [
+        return (string)$uriBuilder->buildUriFromRoute('tce_db', [
             'cmd[pages][' . $this->moveUid . '][' . $this->moveOrCopy . ']' => $pid,
             'redirect' => $this->R_URI,
-        ])) . ';return false;';
+        ]);
     }
 
     /**
index 3cb0b0f..c05152b 100644 (file)
@@ -171,7 +171,7 @@ class PagePositionMap
                     if (!$this->dontPrintPageInsertIcons && $this->checkNewPageInPid($id) && !($prev_dat['invertedDepth'] > $pageTree->tree[$cc]['invertedDepth'])) {
                         end($lines);
                         $margin = 'style="margin-left: ' . (($dat['invertedDepth'] - 1) * 16 + 9) . 'px;"';
-                        $lines[] = '<ul class="list-tree" ' . $margin . '><li><span class="text-nowrap"><a href="#" onclick="' . htmlspecialchars($this->onClickEvent($id, $id)) . '"><i class="t3-icon fa fa-long-arrow-left" title="' . $this->insertlabel() . '"></i></a></span></li></ul>';
+                        $lines[] = '<ul class="list-tree" ' . $margin . '><li><span class="text-nowrap"><a href="' . htmlspecialchars($this->getActionLink($id, $id)) . '"><i class="t3-icon fa fa-long-arrow-left" title="' . $this->insertlabel() . '"></i></a></span></li></ul>';
                     }
                 }
                 // If going down
@@ -183,7 +183,7 @@ class PagePositionMap
                     if (!$this->dontPrintPageInsertIcons && $this->checkNewPageInPid($prev_dat['row']['pid'])) {
                         $prevPid = -$prev_dat['row']['uid'];
                         end($lines);
-                        $lines[] = '<li><span class="text-nowrap"><a href="#" onclick="' . htmlspecialchars($this->onClickEvent($prevPid, $prev_dat['row']['pid'])) . '"><i class="t3-icon fa fa-long-arrow-left" title="' . $this->insertlabel() . '"></i></a></span></li>';
+                        $lines[] = '<li><span class="text-nowrap"><a href="' . htmlspecialchars($this->getActionLink($prevPid, $prev_dat['row']['pid'])) . '"><i class="t3-icon fa fa-long-arrow-left" title="' . $this->insertlabel() . '"></i></a></span></li>';
                     }
                     // Then set the current prevPid
                     $prevPid = -$prev_dat['row']['pid'];
@@ -200,7 +200,7 @@ class PagePositionMap
             }
             // print arrow on the same level
             if (!$this->dontPrintPageInsertIcons && $this->checkNewPageInPid($dat['row']['pid'])) {
-                $lines[] = '<span class="text-nowrap"><a href="#" onclick="' . htmlspecialchars($this->onClickEvent($prevPid, $dat['row']['pid'])) . '"><i class="t3-icon fa fa-long-arrow-left" title="' . $this->insertlabel() . '"></i></a></span>';
+                $lines[] = '<span class="text-nowrap"><a href="' . htmlspecialchars($this->getActionLink($prevPid, $dat['row']['pid'])) . '"><i class="t3-icon fa fa-long-arrow-left" title="' . $this->insertlabel() . '"></i></a></span>';
             }
             // The line with the icon and title:
             $toolTip = BackendUtility::getRecordToolTip($dat['row'], 'pages');
@@ -212,7 +212,7 @@ class PagePositionMap
         $prev_dat = end($pageTree->tree);
         if ($prev_dat['row']['uid'] == $id) {
             if (!$this->dontPrintPageInsertIcons && $this->checkNewPageInPid($id)) {
-                $lines[] = '<ul class="list-tree" style="margin-left: 25px"><li><span class="text-nowrap"><a href="#" onclick="' . htmlspecialchars($this->onClickEvent($id, $id)) . '"><i class="t3-icon fa fa-long-arrow-left" title="' . $this->insertlabel() . '"></i></a></span></li></ul>';
+                $lines[] = '<ul class="list-tree" style="margin-left: 25px"><li><span class="text-nowrap"><a href="' . htmlspecialchars($this->getActionLink($id, $id)) . '"><i class="t3-icon fa fa-long-arrow-left" title="' . $this->insertlabel() . '"></i></a></span></li></ul>';
             }
         }
         for ($a = $latestInvDepth; $a <= $this->depth; $a++) {
@@ -222,7 +222,7 @@ class PagePositionMap
                 if ($latestInvDepth < $dat['invertedDepth']) {
                     $lines[] = '</ul>';
                 }
-                $lines[] = '<span class="text-nowrap"><a href="#" onclick="' . htmlspecialchars($this->onClickEvent($prevPid, $dat['row']['pid'])) . '"><i class="t3-icon fa fa-long-arrow-left" title="' . $this->insertlabel() . '"></i></a></span>';
+                $lines[] = '<span class="text-nowrap"><a href="' . htmlspecialchars($this->getActionLink($prevPid, $dat['row']['pid'])) . '"><i class="t3-icon fa fa-long-arrow-left" title="' . $this->insertlabel() . '"></i></a></span>';
             }
         }
 
@@ -266,11 +266,11 @@ class PagePositionMap
      * @param int $newPagePID New page id.
      * @return string Onclick attribute content
      */
-    public function onClickEvent($pid, $newPagePID)
+    public function getActionLink($pid, $newPagePID): string
     {
+        $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
         $TSconfig = BackendUtility::getPagesTSconfig($newPagePID)['mod.']['newPageWizard.'] ?? [];
         if (isset($TSconfig['override']) && !empty($TSconfig['override'])) {
-            $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
             $url = $uriBuilder->buildUriFromRoute(
                 $TSconfig['override'],
                 [
@@ -280,10 +280,18 @@ class PagePositionMap
                     'returnUrl'   => GeneralUtility::getIndpEnv('REQUEST_URI')
                 ]
             );
-            return $this->clientContext . '.location.href=' . GeneralUtility::quoteJSvalue((string)$url) . ';';
+            return (string)$url;
         }
-        $params = '&edit[pages][' . $pid . ']=new&returnNewPageId=1';
-        return BackendUtility::editOnClick($params, '', $this->R_URI);
+
+        return (string)$uriBuilder->buildUriFromRoute('record_edit', [
+            'edit' => [
+                'pages' => [
+                    $pid => 'new',
+                ],
+            ],
+            'returnNewPageId' => '1',
+            'returnUrl' => $this->R_URI
+        ]);
     }
 
     /**
index ca8f0d5..726e9bc 100644 (file)
@@ -2274,9 +2274,11 @@ class BackendUtility
      * @param string $requestUri An optional returnUrl you can set - automatically set to REQUEST_URI.
      *
      * @return string
+     * @deprecated will be removed in TYPO3 v11.
      */
     public static function editOnClick($params, $_ = '', $requestUri = '')
     {
+        trigger_error(__METHOD__ . ' has been marked as deprecated and will be removed in TYPO3 v11. Consider using regular links and use the UriBuilder API instead.', E_USER_DEPRECATED);
         if ($requestUri == -1) {
             $returnUrl = 'T3_THIS_LOCATION';
         } else {
index 4f71458..8593acc 100644 (file)
@@ -1849,8 +1849,9 @@ class PageLayoutView implements LoggerAwareInterface
         if ($this->tt_contentConfig['showCommands']) {
             // Edit whole of column:
             if ($editParams && $this->getBackendUser()->doesUserHaveAccess($this->pageinfo, Permission::CONTENT_EDIT) && $this->getBackendUser()->checkLanguageAccess(0)) {
-                $iconsArr['edit'] = '<a href="#" onclick="'
-                    . htmlspecialchars(BackendUtility::editOnClick($editParams)) . '" title="'
+                $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
+                $link = $uriBuilder->buildUriFromRoute('record_edit') . $editParams . '&returnUrl=' . rawurlencode(GeneralUtility::getIndpEnv('REQUEST_URI'));
+                $iconsArr['edit'] = '<a href="' . htmlspecialchars($link) . '"  title="'
                     . htmlspecialchars($this->getLanguageService()->getLL('editColumn')) . '">'
                     . $this->iconFactory->getIcon('actions-document-open', Icon::SIZE_SMALL)->render() . '</a>';
             }
@@ -2453,36 +2454,6 @@ class PageLayoutView implements LoggerAwareInterface
     }
 
     /**
-     * Creates onclick-attribute content for a new content element
-     *
-     * @param int $id Page id where to create the element.
-     * @param int $colPos Preset: Column position value
-     * @param int $sys_language Preset: Sys language value
-     * @return string String for onclick attribute.
-     * @see getTable_tt_content()
-     */
-    public function newContentElementOnClick($id, $colPos, $sys_language)
-    {
-        if ($this->option_newWizard) {
-            $routeName = BackendUtility::getPagesTSconfig($id)['mod.']['newContentElementWizard.']['override']
-                ?? 'new_content_element_wizard';
-            $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
-            $url = $uriBuilder->buildUriFromRoute($routeName, [
-                'id' => $id,
-                'colPos' => $colPos,
-                'sys_language_uid' => $sys_language,
-                'uid_pid' => $id,
-                'returnUrl' => GeneralUtility::getIndpEnv('REQUEST_URI')
-            ]);
-            $onClick = 'window.location.href=' . GeneralUtility::quoteJSvalue((string)$url) . ';';
-        } else {
-            $onClick = BackendUtility::editOnClick('&edit[tt_content][' . $id . ']=new&defVals[tt_content][colPos]='
-                . $colPos . '&defVals[tt_content][sys_language_uid]=' . $sys_language);
-        }
-        return $onClick;
-    }
-
-    /**
      * Will create a link on the input string and possibly a big button after the string which links to editing in the RTE.
      * Used for content element content displayed so the user can click the content / "Edit in Rich Text Editor" button
      *
@@ -3563,106 +3534,6 @@ class PageLayoutView implements LoggerAwareInterface
     }
 
     /**
-     * Returns the title (based on $code) of a table ($table) with the proper link around. For headers over tables.
-     * The link will cause the display of all extended mode or not for the table.
-     *
-     * @param string $table Table name
-     * @param string $code Table label
-     * @return string The linked table label
-     */
-    public function linkWrapTable($table, $code)
-    {
-        if ($this->table !== $table) {
-            return '<a href="' . htmlspecialchars(
-                $this->listURL('', $table, 'firstElementNumber')
-                ) . '">' . $code . '</a>';
-        }
-        return '<a href="' . htmlspecialchars(
-            $this->listURL('', '', 'sortField,sortRev,table,firstElementNumber')
-            ) . '">' . $code . '</a>';
-    }
-
-    /**
-     * Returns the title (based on $code) of a record (from table $table) with the proper link around (that is for 'pages'-records a link to the level of that record...)
-     *
-     * @param string $table Table name
-     * @param int $uid Item uid
-     * @param string $code Item title (not htmlspecialchars()'ed yet)
-     * @param mixed[] $row Item row
-     * @return string The item title. Ready for HTML output (is htmlspecialchars()'ed)
-     */
-    public function linkWrapItems($table, $uid, $code, $row)
-    {
-        $lang = $this->getLanguageService();
-        $origCode = $code;
-        // If the title is blank, make a "no title" label:
-        if ((string)$code === '') {
-            $code = '<i>[' . htmlspecialchars(
-                $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.no_title')
-                ) . ']</i> - '
-                . htmlspecialchars(BackendUtility::getRecordTitle($table, $row));
-        } else {
-            $code = htmlspecialchars($code, ENT_QUOTES, 'UTF-8', false);
-            if ($code != htmlspecialchars($origCode)) {
-                $code = '<span title="' . htmlspecialchars(
-                    $origCode,
-                    ENT_QUOTES,
-                    'UTF-8',
-                    false
-                    ) . '">' . $code . '</span>';
-            }
-        }
-        switch ((string)$this->clickTitleMode) {
-            case 'edit':
-                // If the listed table is 'pages' we have to request the permission settings for each page:
-                if ($table === 'pages') {
-                    $localCalcPerms = $this->getBackendUser()->calcPerms(
-                        BackendUtility::getRecord('pages', $row['uid'])
-                    );
-                    $permsEdit = $localCalcPerms & Permission::PAGE_EDIT;
-                } else {
-                    $permsEdit = $this->calcPerms & Permission::CONTENT_EDIT;
-                }
-                // "Edit" link: ( Only if permissions to edit the page-record of the content of the parent page ($this->id)
-                if ($permsEdit) {
-                    $params = '&edit[' . $table . '][' . $row['uid'] . ']=edit';
-                    $code = '<a href="#" onclick="' . htmlspecialchars(
-                        BackendUtility::editOnClick($params, '', -1)
-                        ) . '" title="' . htmlspecialchars($lang->getLL('edit')) . '">' . $code . '</a>';
-                }
-                break;
-            case 'show':
-                // "Show" link (only pages and tt_content elements)
-                if ($table === 'pages' || $table === 'tt_content') {
-                    $code = '<a href="#" onclick="' . htmlspecialchars(
-                        BackendUtility::viewOnClick(
-                            ($table === 'tt_content' ? $this->id . '#' . $row['uid'] : $row['uid'])
-                            )
-                        ) . '" title="' . htmlspecialchars(
-                            $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.showPage')
-                        ) . '">' . $code . '</a>';
-                }
-                break;
-            case 'info':
-                // "Info": (All records)
-                $code = '<a href="#" onclick="' . htmlspecialchars(
-                    'top.TYPO3.InfoWindow.showItem(\'' . $table . '\', \'' . $row['uid'] . '\'); return false;'
-                    ) . '" title="' . htmlspecialchars($lang->getLL('showInfo')) . '">' . $code . '</a>';
-                break;
-            default:
-                // Output the label now:
-                if ($table === 'pages') {
-                    $code = '<a href="' . htmlspecialchars(
-                        $this->listURL($uid, '', 'firstElementNumber')
-                        ) . '" onclick="setHighlight(' . $uid . ')">' . $code . '</a>';
-                } else {
-                    $code = $this->linkUrlMail($code, $origCode);
-                }
-        }
-        return $code;
-    }
-
-    /**
      * Wrapping input code in link to URL or email if $testString is either.
      *
      * @param string $code code to wrap
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-88787-BackendUtilityEditOnClick.rst b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-88787-BackendUtilityEditOnClick.rst
new file mode 100644 (file)
index 0000000..41382ea
--- /dev/null
@@ -0,0 +1,58 @@
+.. include:: ../../Includes.txt
+
+=================================================
+Deprecation: #88787 - BackendUtility::editOnClick
+=================================================
+
+See :issue:`88787`
+
+Description
+===========
+
+The method :php:`BackendUtility::editOnClick()` used to generate JavaScript `onclick` targets to the EditDocumentController has been marked as deprecated.
+
+
+Impact
+======
+
+Using this method will trigger PHP :php:`E_USER_DEPRECATED` error.
+
+
+Affected Installations
+======================
+
+All installations using extensions using :php:`BackendUtility::editOnClick()` are affected.
+
+
+Migration
+=========
+
+Migrate the method to use the :php:`UriBuilder` API and attach the parameters manually.
+
+Example:
+
+.. code-block:: php
+
+   // Previous
+   $old = BackendUtility::editOnClick($params);
+
+   // Migrated
+   $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
+
+   // Variant 1
+   $params = '&edit[pages][' . $pid . ']=new&returnNewPageId=1';
+   $migrated = $uriBuilder->buildUriFromRoute('record_edit') . $params . '&returnUrl=' . rawurlencode(GeneralUtility::getIndpEnv('REQUEST_URI'));
+
+   // Variant 2
+   $params = [
+       'edit' => [
+           'pages' => [
+               $pid => 'new',
+           ],
+        ],
+        'returnNewPageId' => 1,
+        'returnUrl' => GeneralUtility::getIndpEnv('REQUEST_URI'),
+   ];
+   $migrated = (string)$uriBuilder->buildUriFromRoute('record_edit', params);
+
+.. index:: Backend, PHP-API, FullyScanned, ext:backend
index 487080e..2119c9b 100644 (file)
@@ -275,7 +275,7 @@ class TranslationStatusController
                     } else {
                         $status = GeneralUtility::hideIfNotTranslated($data['row']['l18n_cfg']) || GeneralUtility::hideIfDefaultLanguage($data['row']['l18n_cfg']) ? 'danger' : '';
                         $info = '<div class="btn-group"><label class="btn btn-default btn-checkbox">';
-                        $info .= '<input type="checkbox" data-lang="' . $languageId . '" name="newOL[' . $languageId . '][' . $data['row']['uid'] . ']" value="1" />';
+                        $info .= '<input type="checkbox" data-lang="' . $languageId . '" data-uid="' . (int)$data['row']['uid'] . '" name="newOL[' . $languageId . '][' . $data['row']['uid'] . ']" value="1" />';
                         $info .= '<span class="t3-icon fa"></span></label></div>';
                         $newOL_js[$languageId] .=
                             ' +(document.webinfoForm['
@@ -346,17 +346,17 @@ class TranslationStatusController
                     $editButton = '';
                 }
                 // Create new overlay records:
-                $params = '&columnsOnly=title,hidden,sys_language_uid&overrideVals[pages][sys_language_uid]=' . $languageId;
-                $onClick = BackendUtility::editOnClick($params);
-                if (!empty($newOL_js[$languageId])) {
-                    $onClickArray = explode('?', $onClick, 2);
-                    $lastElement = array_pop($onClickArray);
-                    $onClickArray[] = '\'' . $newOL_js[$languageId] . ' + \'&' . $lastElement;
-                    $onClick = implode('?', $onClickArray);
-                }
-                $newButton = '<a href="#" class="btn btn-default disabled t3js-language-new-' . $languageId . '" onclick="' . htmlspecialchars($onClick)
-                    . '" title="' . $lang->sL(
-                        'LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_getlangsta_createNewTranslationHeaders'
+                $createLink = (string)$uriBuilder->buildUriFromRoute('record_edit', [
+                    'columnsOnly' => 'title,hidden,sys_language_uid',
+                    'overrideVals' => [
+                        'pages' => [
+                            'sys_language_uid' => $languageId,
+                        ],
+                    ],
+                    'returnUrl' => GeneralUtility::getIndpEnv('REQUEST_URI')
+                ]);
+                $newButton = '<a href="' . htmlspecialchars($createLink) . '" data-edit-url="' . htmlspecialchars($createLink) . '" class="btn btn-default disabled t3js-language-new-' . $languageId . '" title="' . $lang->sL(
+                    'LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_getlangsta_createNewTranslationHeaders'
                     ) . '">' . $this->iconFactory->getIcon('actions-document-new', Icon::SIZE_SMALL)->render() . '</a>';
 
                 $tCells[] = '<td class="btn-group">' . $editButton . $newButton . '</td>';
index 20b5fa7..d21922c 100644 (file)
@@ -10,4 +10,4 @@
  *
  * The TYPO3 project - inspiring people to share!
  */
-define(["require","exports","jquery"],function(t,e,n){"use strict";return new(function(){function t(){this.registerEvents()}return t.prototype.registerEvents=function(){n('input[type="checkbox"][data-lang]').on("change",this.toggleNewButton)},t.prototype.toggleNewButton=function(t){var e=n(t.currentTarget),r=parseInt(e.data("lang"),10),o=n(".t3js-language-new-"+r),a=n('input[type="checkbox"][data-lang="'+r+'"]:checked');o.toggleClass("disabled",0===a.length)},t}())});
\ No newline at end of file
+define(["require","exports","jquery"],function(t,e,n){"use strict";return new(function(){function t(){this.registerEvents()}return t.prototype.registerEvents=function(){n('input[type="checkbox"][data-lang]').on("change",this.toggleNewButton)},t.prototype.toggleNewButton=function(t){var e=n(t.currentTarget),a=parseInt(e.data("lang"),10),r=n(".t3js-language-new-"+a),i=n('input[type="checkbox"][data-lang="'+a+'"]:checked'),o=[];i.each(function(t,e){o.push("edit[pages]["+e.dataset.uid+"]=new")});var u=r.data("editUrl")+"&"+o.join("&");r.attr("href",u),r.toggleClass("disabled",0===i.length)},t}())});
\ No newline at end of file
index 699da23..223540a 100644 (file)
@@ -4225,4 +4225,12 @@ return [
         ],
     ],
 
+    'TYPO3\CMS\Backend\Utility\BackendUtility->editOnClick' => [
+        'numberOfMandatoryArguments' => 1,
+        'maximumNumberOfArguments' => 3,
+        'restFiles' => [
+            'Deprecation-88787-BackendUtilityEditOnClick.rst'
+        ],
+    ],
+
 ];
index 1b3b77e..e6a933e 100644 (file)
@@ -534,6 +534,11 @@ class DatabaseRecordList
     protected $iconFactory;
 
     /**
+     * @var UriBuilder
+     */
+    protected $uriBuilder;
+
+    /**
      * Array with before/after setting for tables
      * Structure:
      * 'tableName' => [
@@ -581,6 +586,8 @@ class DatabaseRecordList
             $this->fixedL = $GLOBALS['BE_USER']->uc['titleLen'];
         }
         $this->iconFactory = GeneralUtility::makeInstance(IconFactory::class);
+        $this->uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
+
         $this->getTranslateTools();
         $this->determineScriptUrl();
 
@@ -601,8 +608,6 @@ class DatabaseRecordList
         $lang = $this->getLanguageService();
         // Get users permissions for this page record:
         $localCalcPerms = $backendUser->calcPerms($this->pageRow);
-        /** @var \TYPO3\CMS\Backend\Routing\UriBuilder $uriBuilder */
-        $uriBuilder = GeneralUtility::makeInstance(\TYPO3\CMS\Backend\Routing\UriBuilder::class);
         // CSH
         if ((string)$this->id === '') {
             $fieldName = 'list_module_noId';
@@ -629,7 +634,7 @@ class DatabaseRecordList
             }
             // New record on pages that are not locked by editlock
             if (!$modulePageTsConfig['noCreateRecordsLink'] && $this->editLockPermissions()) {
-                $onClick = 'return jumpExt(' . GeneralUtility::quoteJSvalue((string)$uriBuilder->buildUriFromRoute('db_new', ['id' => $this->id])) . ');';
+                $onClick = 'return jumpExt(' . GeneralUtility::quoteJSvalue((string)$this->uriBuilder->buildUriFromRoute('db_new', ['id' => $this->id])) . ');';
                 $newRecordButton = $buttonBar->makeLinkButton()
                     ->setHref('#')
                     ->setOnClick($onClick)
@@ -651,10 +656,9 @@ class DatabaseRecordList
             if ($localCalcPerms & Permission::PAGE_EDIT && !empty($this->id) && $this->editLockPermissions()) {
                 // Edit
                 $params = '&edit[pages][' . $this->pageRow['uid'] . ']=edit';
-                $onClick = BackendUtility::editOnClick($params, '', -1);
+                $editLink = $this->uriBuilder->buildUriFromRoute('record_edit') . $params . '&returnUrl=' . $this->makeReturnUrl();
                 $editButton = $buttonBar->makeLinkButton()
-                    ->setHref('#')
-                    ->setOnClick($onClick)
+                    ->setHref($editLink)
                     ->setTitle($lang->getLL('editPage'))
                     ->setIcon($this->iconFactory->getIcon('actions-page-open', Icon::SIZE_SMALL));
                 $buttonBar->addButton($editButton, ButtonBar::BUTTON_POSITION_LEFT, 20);
@@ -700,7 +704,7 @@ class DatabaseRecordList
                 $buttonBar->addButton($csvButton, ButtonBar::BUTTON_POSITION_LEFT, 40);
                 // Export
                 if (ExtensionManagementUtility::isLoaded('impexp')) {
-                    $url = (string)$uriBuilder->buildUriFromRoute('tx_impexp_export');
+                    $url = (string)$this->uriBuilder->buildUriFromRoute('tx_impexp_export');
                     $exportButton = $buttonBar->makeLinkButton()
                         ->setHref($url . '&tx_impexp[list][]=' . rawurlencode($this->table . ':' . $this->id))
                         ->setTitle($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:rm.export'))
@@ -1418,8 +1422,6 @@ class DatabaseRecordList
         // Init:
         $theData = [];
         $icon = '';
-        /** @var \TYPO3\CMS\Backend\Routing\UriBuilder $uriBuilder */
-        $uriBuilder = GeneralUtility::makeInstance(\TYPO3\CMS\Backend\Routing\UriBuilder::class);
         // Traverse the fields:
         foreach ($this->fieldArray as $fCol) {
             // Calculate users permissions to edit records in the table:
@@ -1468,7 +1470,7 @@ class DatabaseRecordList
                         $spriteIcon = $this->iconFactory->getIcon('actions-edit-copy', Icon::SIZE_SMALL)->render();
                         $cells['copyMarked'] = $this->linkClipboardHeaderIcon($spriteIcon, $table, 'setCB', '', $lang->getLL('clip_selectMarked'));
                         // The "edit marked" link:
-                        $editUri = (string)$uriBuilder->buildUriFromRoute('record_edit')
+                        $editUri = (string)$this->uriBuilder->buildUriFromRoute('record_edit')
                             . '&edit[' . $table . '][{entityIdentifiers:editList}]=edit'
                             . '&returnUrl={T3_THIS_LOCATION}';
                         $cells['edit'] = '<a class="btn btn-default t3js-record-edit-multiple" href="#"'
@@ -1525,7 +1527,7 @@ class DatabaseRecordList
                                 // If mod.newContentElementWizard.override is set, use that extension's create new content wizard instead:
                                 $newContentElementWizard = BackendUtility::getPagesTSconfig($this->pageinfo['uid'])['mod.']['newContentElementWizard.']['override']
                                     ?? 'new_content_element_wizard';
-                                $url = (string)$uriBuilder->buildUriFromRoute(
+                                $url = (string)$this->uriBuilder->buildUriFromRoute(
                                     $newContentElementWizard,
                                     [
                                         'id' => $this->id,
@@ -1539,7 +1541,7 @@ class DatabaseRecordList
                                     . '</a>';
                             } elseif ($table === 'pages') {
                                 $parameters = ['id' => $this->id, 'pagesOnly' => 1, 'returnUrl' => GeneralUtility::getIndpEnv('REQUEST_URI')];
-                                $href = (string)$uriBuilder->buildUriFromRoute('db_new', $parameters);
+                                $href = (string)$this->uriBuilder->buildUriFromRoute('db_new', $parameters);
                                 $icon = '<a class="btn btn-default" href="' . htmlspecialchars($href) . '" title="' . htmlspecialchars($lang->getLL('new')) . '">'
                                     . $spriteIcon->render() . '</a>';
                             } else {
@@ -1547,8 +1549,8 @@ class DatabaseRecordList
                                 if ($table === 'pages') {
                                     $params .= '&overrideVals[pages][doktype]=' . (int)$this->pageRow['doktype'];
                                 }
-                                $icon = '<a class="btn btn-default" href="#" onclick="' . htmlspecialchars(BackendUtility::editOnClick($params, '', -1))
-                                    . '" title="' . htmlspecialchars($lang->getLL('new')) . '">' . $spriteIcon->render() . '</a>';
+                                $newLink = $this->uriBuilder->buildUriFromRoute('record_edit') . $params . '&returnUrl=' . $this->makeReturnUrl();
+                                $icon = '<a class="btn btn-default" href="' . htmlspecialchars($newLink) . '" title="' . htmlspecialchars($lang->getLL('new')) . '">' . $spriteIcon->render() . '</a>';
                             }
                         }
                         // If the table can be edited, add link for editing ALL SHOWN fields for all listed records:
@@ -1557,7 +1559,7 @@ class DatabaseRecordList
                             if ($this->clipNumPane()) {
                                 $entityIdentifiers .= ':editList';
                             }
-                            $editUri = (string)$uriBuilder->buildUriFromRoute('record_edit')
+                            $editUri = (string)$this->uriBuilder->buildUriFromRoute('record_edit')
                                 . '&edit[' . $table . '][{' . $entityIdentifiers . '}]=edit'
                                 . '&columnsOnly=' . implode(',', $this->fieldArray)
                                 . '&returnUrl={T3_THIS_LOCATION}';
@@ -1615,7 +1617,7 @@ class DatabaseRecordList
                             if ($this->clipNumPane()) {
                                 $entityIdentifiers .= ':editList';
                             }
-                            $editUri = (string)$uriBuilder->buildUriFromRoute('record_edit')
+                            $editUri = (string)$this->uriBuilder->buildUriFromRoute('record_edit')
                                 . '&edit[' . $table . '][{' . $entityIdentifiers . '}]=edit'
                                 . '&columnsOnly=' . $fCol
                                 . '&returnUrl={T3_THIS_LOCATION}';
@@ -1810,8 +1812,6 @@ class DatabaseRecordList
                         && $backendUser->recordEditAccessInternals($table, $row);
         $permsEdit = $this->overlayEditLockPermissions($table, $row, $permsEdit);
         // "Show" link (only pages and tt_content elements)
-        /** @var \TYPO3\CMS\Backend\Routing\UriBuilder $uriBuilder */
-        $uriBuilder = GeneralUtility::makeInstance(\TYPO3\CMS\Backend\Routing\UriBuilder::class);
 
         if ($table === 'pages' || $table === 'tt_content') {
             $onClick = $this->getOnClickForRow($table, $row);
@@ -1837,7 +1837,8 @@ class DatabaseRecordList
                 $iconIdentifier = 'actions-page-open';
             }
             $overlayIdentifier = !$this->isEditable($table) ? 'overlay-readonly' : null;
-            $editAction = '<a class="btn btn-default" href="#" onclick="' . htmlspecialchars(BackendUtility::editOnClick($params, '', -1))
+            $editLink = $this->uriBuilder->buildUriFromRoute('record_edit') . $params . '&returnUrl=' . $this->makeReturnUrl();
+            $editAction = '<a class="btn btn-default" href="' . htmlspecialchars($editLink) . '"'
                 . '" title="' . htmlspecialchars($this->getLanguageService()->getLL('edit')) . '">' . $this->iconFactory->getIcon($iconIdentifier, Icon::SIZE_SMALL, $overlayIdentifier)->render() . '</a>';
         } else {
             $editAction = $this->spaceIcon;
@@ -1853,7 +1854,7 @@ class DatabaseRecordList
             if ($isL10nOverlay) {
                 $moveAction = $this->spaceIcon;
             } else {
-                $onClick = 'return jumpExt(' . GeneralUtility::quoteJSvalue((string)$uriBuilder->buildUriFromRoute('move_element') . '&table=' . $table . '&uid=' . $row['uid']) . ');';
+                $onClick = 'return jumpExt(' . GeneralUtility::quoteJSvalue((string)$this->uriBuilder->buildUriFromRoute('move_element') . '&table=' . $table . '&uid=' . $row['uid']) . ');';
                 $linkTitleLL = htmlspecialchars($this->getLanguageService()->getLL('move_' . ($table === 'tt_content' ? 'record' : 'page')));
                 $icon = ($table === 'pages' ? $this->iconFactory->getIcon('actions-page-move', Icon::SIZE_SMALL) : $this->iconFactory->getIcon('actions-document-move', Icon::SIZE_SMALL));
                 $moveAction = '<a class="btn btn-default" href="#" onclick="' . htmlspecialchars($onClick) . '" title="' . $linkTitleLL . '">' . $icon->render() . '</a>';
@@ -1864,7 +1865,7 @@ class DatabaseRecordList
         if ($this->isEditable($table)) {
             // "Revert" link (history/undo)
             if ((bool)\trim($userTsConfig['options.']['showHistory.'][$table] ?? $userTsConfig['options.']['showHistory'] ?? '1')) {
-                $moduleUrl = (string)$uriBuilder->buildUriFromRoute('record_history', ['element' => $table . ':' . $row['uid']]);
+                $moduleUrl = (string)$this->uriBuilder->buildUriFromRoute('record_history', ['element' => $table . ':' . $row['uid']]);
                 $onClick = 'return jumpExt(' . GeneralUtility::quoteJSvalue($moduleUrl) . ',\'#latest\');';
                 $historyAction = '<a class="btn btn-default" href="#" onclick="' . htmlspecialchars($onClick) . '" title="'
                     . htmlspecialchars($this->getLanguageService()->getLL('history')) . '">'
@@ -1876,7 +1877,7 @@ class DatabaseRecordList
                 if ($isL10nOverlay) {
                     $permsAction = $this->spaceIcon;
                 } else {
-                    $href = (string)$uriBuilder->buildUriFromRoute('system_BeuserTxPermission') . '&id=' . $row['uid'] . '&tx_beuser_system_beusertxpermission[action]=edit' . $this->makeReturnUrl();
+                    $href = (string)$this->uriBuilder->buildUriFromRoute('system_BeuserTxPermission') . '&id=' . $row['uid'] . '&tx_beuser_system_beusertxpermission[action]=edit' . $this->makeReturnUrl();
                     $permsAction = '<a class="btn btn-default" href="' . htmlspecialchars($href) . '" title="'
                         . htmlspecialchars($this->getLanguageService()->getLL('permissions')) . '">'
                         . $this->iconFactory->getIcon('actions-lock', Icon::SIZE_SMALL)->render() . '</a>';
@@ -1896,8 +1897,8 @@ class DatabaseRecordList
                         if ($GLOBALS['TCA'][$table]['ctrl']['sortby']) {
                             $titleLabel .= ($table === 'pages' ? 'Page' : 'Record');
                         }
-                        $newAction = '<a class="btn btn-default" href="#" onclick="' . htmlspecialchars(BackendUtility::editOnClick($params, '', -1))
-                            . '" title="' . htmlspecialchars($this->getLanguageService()->getLL($titleLabel)) . '">'
+                        $newLink = $this->uriBuilder->buildUriFromRoute('record_edit') . $params . '&returnUrl=' . $this->makeReturnUrl();
+                        $newAction = '<a class="btn btn-default" href="' . htmlspecialchars($newLink) . '" title="' . htmlspecialchars($this->getLanguageService()->getLL($titleLabel)) . '">'
                             . $icon->render() . '</a>';
                         $this->addActionToCellGroup($cells, $newAction, 'new');
                     }
@@ -2304,13 +2305,12 @@ class DatabaseRecordList
         }
         $translations = $this->translateTools->translationInfo($table, $row['uid'], 0, $row, $this->selFieldList);
         if (is_array($translations)) {
-            $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
             $this->translations = $translations['translations'];
             // Traverse page translations and add icon for each language that does NOT yet exist:
             $lNew = '';
             foreach ($this->pageOverlays as $lUid_OnPage => $lsysRec) {
                 if ($this->isEditable($table) && !isset($translations['translations'][$lUid_OnPage]) && $this->getBackendUserAuthentication()->checkLanguageAccess($lUid_OnPage)) {
-                    $redirectUrl = (string)$uriBuilder->buildUriFromRoute(
+                    $redirectUrl = (string)$this->uriBuilder->buildUriFromRoute(
                         'record_edit',
                         [
                             'justLocalized' => $table . ':' . $row['uid'] . ':' . $lUid_OnPage,
@@ -3451,9 +3451,8 @@ class DatabaseRecordList
                 // "Edit" link: ( Only if permissions to edit the page-record of the content of the parent page ($this->id)
                 if ($permsEdit) {
                     $params = '&edit[' . $table . '][' . $row['uid'] . ']=edit';
-                    $code = '<a href="#" onclick="' . htmlspecialchars(
-                        BackendUtility::editOnClick($params, '', -1)
-                        ) . '" title="' . htmlspecialchars($lang->getLL('edit')) . '">' . $code . '</a>';
+                    $editLink = $this->uriBuilder->buildUriFromRoute('record_edit') . $params . '&returnUrl=' . $this->makeReturnUrl();
+                    $code = '<a href="' . htmlspecialchars($editLink) . '" title="' . htmlspecialchars($lang->getLL('edit')) . '">' . $code . '</a>';
                 }
                 break;
             case 'show':
@@ -3557,8 +3556,7 @@ class DatabaseRecordList
         $urlParameters = array_merge_recursive($urlParameters, $this->overrideUrlParameters);
 
         if ($routePath = GeneralUtility::_GP('route')) {
-            $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
-            $url = (string)$uriBuilder->buildUriFromRoutePath($routePath, $urlParameters);
+            $url = (string)$this->uriBuilder->buildUriFromRoutePath($routePath, $urlParameters);
         } else {
             $url = GeneralUtility::getIndpEnv('SCRIPT_NAME') . HttpUtility::buildQueryString($urlParameters, '?');
         }
@@ -4004,8 +4002,7 @@ class DatabaseRecordList
     protected function determineScriptUrl()
     {
         if ($routePath = GeneralUtility::_GP('route')) {
-            $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
-            $this->thisScript = (string)$uriBuilder->buildUriFromRoutePath($routePath);
+            $this->thisScript = (string)$this->uriBuilder->buildUriFromRoutePath($routePath);
         } else {
             $this->thisScript = GeneralUtility::getIndpEnv('SCRIPT_NAME');
         }