[TASK] Streamline BackendUtility::getPagesTSconfig 52/54152/8
authorAlexander Schnitzler <git@alexanderschnitzler.de>
Sun, 17 Sep 2017 11:02:15 +0000 (13:02 +0200)
committerBenni Mack <benni@typo3.org>
Thu, 5 Oct 2017 10:46:27 +0000 (12:46 +0200)
BackendUtility::getPagesTSconfig does accumulate the PageTS
of a page, parses and returns it. That is the main purpose of
that method. But there are 2 method arguments that change the
behavior of that method. When setting $returnPartArray to true,
the PageTS will be returned non parsed. When providing a custom
$rootLine, that rootline will be used and the result is not
cached.

1.) There is just one method call in the core that makes use
    of the argument $returnPartArray, thus, fetching the non
    parsed PageTS is made available through a separate method
    called getRawPagesTSconfig(). Using the argument
    $returnPartArray is deprecated and will be removed.

2.) Providing a custom rootline via the $rootline method is
    also deprecated and will be removed. The core does not have
    the need to fetch the PageTS for a made up rootline, thus
    people can use getRawPagesTSconfig() with a custom
    rootline in the future and then parse that PageTS
    themselves. That way the result of getPagesTSconfig can
    always be cached in the future.

Resolves: #82497
Releases: master
Change-Id: I764324072d962e89e37bf514fa405e3cd93d2783
Reviewed-on: https://review.typo3.org/54152
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Jigal van Hemert <jigal.van.hemert@typo3.org>
Tested-by: Jigal van Hemert <jigal.van.hemert@typo3.org>
Reviewed-by: Benni Mack <benni@typo3.org>
Tested-by: Benni Mack <benni@typo3.org>
typo3/sysext/backend/Classes/Utility/BackendUtility.php
typo3/sysext/core/Documentation/Changelog/master/Deprecation-54152-DeprecateArgumentsOfBackendUtilityGetPagesTSconfig.rst [new file with mode: 0644]
typo3/sysext/info/Classes/Controller/InfoPageTyposcriptConfigController.php
typo3/sysext/install/Configuration/ExtensionScanner/Php/MethodArgumentDroppedStaticMatcher.php

index b6f6ebb..9e7d7ae 100644 (file)
@@ -822,19 +822,65 @@ class BackendUtility
         ) {
             return $combinedTSconfig_cache[$pagesTSconfig_cacheReference[$id]];
         }
-        $TSconfig = [];
+        $tsConfig = [];
+        // No custom rootline, so the results can be cached
         if (!is_array($rootLine)) {
-            $useCacheForCurrentPageId = true;
             $rootLine = self::BEgetRootLine($id, '', true);
+            $useCacheForCurrentPageId = true;
         } else {
+            trigger_error('Calling TYPO3\CMS\Backend\Utility\BackendUtility::getPagesTSconfig() with a custom rootline handed over as second argument will be removed in TYPO3 v10. Use TYPO3\CMS\Backend\Utility\BackendUtility::getRawPagesTSconfig() instead and parse PageTS yourself.', E_USER_DEPRECATED);
             $useCacheForCurrentPageId = false;
         }
 
+        $TSdataArray = static::getRawPagesTSconfig($id, $rootLine);
+        if ($returnPartArray) {
+            trigger_error('Calling TYPO3\CMS\Backend\Utility\BackendUtility::getPagesTSconfig() with a third parameter to return the unparsed array directly will be removed in TYPO3 v10. Use TYPO3\CMS\Backend\Utility\BackendUtility::getRawPagesTSconfig() instead.', E_USER_DEPRECATED);
+            return $TSdataArray;
+        }
+        // Parsing the page TS-Config
+        $pageTs = implode(LF . '[GLOBAL]' . LF, $TSdataArray);
+        /* @var $parseObj \TYPO3\CMS\Backend\Configuration\TsConfigParser */
+        $parseObj = GeneralUtility::makeInstance(\TYPO3\CMS\Backend\Configuration\TsConfigParser::class);
+        $res = $parseObj->parseTSconfig($pageTs, 'PAGES', $id, $rootLine);
+        if ($res) {
+            $tsConfig = $res['TSconfig'];
+        }
+        $cacheHash = $res['hash'];
+        // Get User TSconfig overlay
+        $userTSconfig = static::getBackendUserAuthentication()->userTS['page.'];
+        if (is_array($userTSconfig)) {
+            ArrayUtility::mergeRecursiveWithOverrule($tsConfig, $userTSconfig);
+            $cacheHash .= '_user' . static::getBackendUserAuthentication()->user['uid'];
+        }
+
+        if ($useCacheForCurrentPageId) {
+            if (!isset($combinedTSconfig_cache[$cacheHash])) {
+                $combinedTSconfig_cache[$cacheHash] = $tsConfig;
+            }
+            $pagesTSconfig_cacheReference[$id] = $cacheHash;
+        }
+
+        return $tsConfig;
+    }
+
+    /**
+     * Returns the non-parsed Page TSconfig for page with id, $id
+     *
+     * @param int $id Page uid for which to create Page TSconfig
+     * @param array $rootLine If $rootLine is an array, that is used as rootline, otherwise rootline is just calculated
+     * @return array Non-parsed Page TSconfig
+     */
+    public static function getRawPagesTSconfig($id, array $rootLine = null)
+    {
+        if (!is_array($rootLine)) {
+            $rootLine = self::BEgetRootLine($id, '', true);
+        }
+
         // Order correctly
         ksort($rootLine);
-        $TSdataArray = [];
+        $tsDataArray = [];
         // Setting default configuration
-        $TSdataArray['defaultPageTSconfig'] = $GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPageTSconfig'];
+        $tsDataArray['defaultPageTSconfig'] = $GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPageTSconfig'];
         foreach ($rootLine as $k => $v) {
             if (trim($v['tsconfig_includes'])) {
                 $includeTsConfigFileList = GeneralUtility::trimExplode(',', $v['tsconfig_includes'], true);
@@ -842,54 +888,30 @@ class BackendUtility
                 foreach ($includeTsConfigFileList as $key => $includeTsConfigFile) {
                     if (strpos($includeTsConfigFile, 'EXT:') === 0) {
                         list($includeTsConfigFileExtensionKey, $includeTsConfigFilename) = explode(
-                                '/',
-                                substr($includeTsConfigFile, 4),
-                                2
-                            );
+                            '/',
+                            substr($includeTsConfigFile, 4),
+                            2
+                        );
                         if ((string)$includeTsConfigFileExtensionKey !== ''
-                                && ExtensionManagementUtility::isLoaded($includeTsConfigFileExtensionKey)
-                                && (string)$includeTsConfigFilename !== ''
-                            ) {
+                            && ExtensionManagementUtility::isLoaded($includeTsConfigFileExtensionKey)
+                            && (string)$includeTsConfigFilename !== ''
+                        ) {
                             $includeTsConfigFileAndPath = ExtensionManagementUtility::extPath($includeTsConfigFileExtensionKey) .
-                                    $includeTsConfigFilename;
+                                $includeTsConfigFilename;
                             if (file_exists($includeTsConfigFileAndPath)) {
-                                $TSdataArray['uid_' . $v['uid'] . '_static_' . $key] = file_get_contents($includeTsConfigFileAndPath);
+                                $tsDataArray['uid_' . $v['uid'] . '_static_' . $key] = file_get_contents($includeTsConfigFileAndPath);
                             }
                         }
                     }
                 }
             }
-            $TSdataArray['uid_' . $v['uid']] = $v['TSconfig'];
-        }
-        $TSdataArray = static::emitGetPagesTSconfigPreIncludeSignal($TSdataArray, $id, $rootLine, $returnPartArray);
-        $TSdataArray = TypoScriptParser::checkIncludeLines_array($TSdataArray);
-        if ($returnPartArray) {
-            return $TSdataArray;
-        }
-        // Parsing the page TS-Config
-        $pageTS = implode(LF . '[GLOBAL]' . LF, $TSdataArray);
-        /* @var $parseObj \TYPO3\CMS\Backend\Configuration\TsConfigParser */
-        $parseObj = GeneralUtility::makeInstance(\TYPO3\CMS\Backend\Configuration\TsConfigParser::class);
-        $res = $parseObj->parseTSconfig($pageTS, 'PAGES', $id, $rootLine);
-        if ($res) {
-            $TSconfig = $res['TSconfig'];
-        }
-        $cacheHash = $res['hash'];
-        // Get User TSconfig overlay
-        $userTSconfig = static::getBackendUserAuthentication()->userTS['page.'];
-        if (is_array($userTSconfig)) {
-            ArrayUtility::mergeRecursiveWithOverrule($TSconfig, $userTSconfig);
-            $cacheHash .= '_user' . $GLOBALS['BE_USER']->user['uid'];
+            $tsDataArray['uid_' . $v['uid']] = $v['TSconfig'];
         }
 
-        if ($useCacheForCurrentPageId) {
-            if (!isset($combinedTSconfig_cache[$cacheHash])) {
-                $combinedTSconfig_cache[$cacheHash] = $TSconfig;
-            }
-            $pagesTSconfig_cacheReference[$id] = $cacheHash;
-        }
+        $tsDataArray = static::emitGetPagesTSconfigPreIncludeSignal($tsDataArray, $id, $rootLine);
+        $tsDataArray = TypoScriptParser::checkIncludeLines_array($tsDataArray);
 
-        return $TSconfig;
+        return $tsDataArray;
     }
 
     /*******************************************
@@ -4401,19 +4423,17 @@ class BackendUtility
      * @param array $TSdataArray Current TSconfig data array - Can be modified by slots!
      * @param int $id Page ID we are handling
      * @param array $rootLine Rootline array of page
-     * @param bool $returnPartArray Whether TSdata should be parsed by TS parser or returned as plain text
      * @return array Modified Data array
      */
     protected static function emitGetPagesTSconfigPreIncludeSignal(
         array $TSdataArray,
         $id,
-        array $rootLine,
-        $returnPartArray
+        array $rootLine
     ) {
         $signalArguments = static::getSignalSlotDispatcher()->dispatch(
             __CLASS__,
             'getPagesTSconfigPreInclude',
-            [$TSdataArray, $id, $rootLine, $returnPartArray]
+            [$TSdataArray, $id, $rootLine, false]
         );
         return $signalArguments[0];
     }
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-54152-DeprecateArgumentsOfBackendUtilityGetPagesTSconfig.rst b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-54152-DeprecateArgumentsOfBackendUtilityGetPagesTSconfig.rst
new file mode 100644 (file)
index 0000000..97e4db1
--- /dev/null
@@ -0,0 +1,40 @@
+.. include:: ../../Includes.txt
+
+=============================================================================
+Deprecation: #54152 - Deprecate arguments of BackendUtility::getPagesTSconfig
+=============================================================================
+
+See :issue:`54152`
+
+Description
+===========
+
+`BackendUtility::getPagesTSconfig($id, $rootLine = null, $returnPartArray = false)` allowed the following arguments:
+
+* `$id`: This argument was and still is required. It's the id of the page the TSconfig is fetched for
+* `$rootLine`: This argument was optional and allowed to use that method with a custom rootline. That argument is deprecated now.
+* `$returnPartArray`: This argument was optional and allowed to return the TSconfig non parsed. That argument is deprecated now.
+
+
+Impact
+======
+
+Calling `BackendUtility::getPagesTSconfig` with `$rootline` and/or `$returnPartArray` being different than their default value, will write a deprecation log entry and will stop working in TYPO3 v10.
+
+
+Affected Installations
+======================
+
+All installations that call `BackendUtility::getPagesTSconfig` with `$rootline` and/or `$returnPartArray` being different than their default value.
+
+
+Migration
+=========
+
+Calling `BackendUtility::getPagesTSconfig` with just the `id` argument still behaves the way it does. It's the most common use case and there's no migraton needed.
+
+If you called `BackendUtility::getPagesTSconfig` with `$returnPartArray` being `true` in the past, you should now call `BackendUtility::getRawPagesTSconfig`. You will get the non parsed TSconfig, just like before.
+
+If you called `BackendUtility::getPagesTSconfig` providing a custom rootline via `$rootline` in the past, you should now call `BackendUtility::getRawPagesTSconfig($id, $rootLine = null)` with your custom rootline and parse the returned TSconfig yourself, just like `BackendUtility::getPagesTSconfig` does.
+
+.. index:: Backend, TSConfig, NotScanned
index 9ad52de..92f626e 100644 (file)
@@ -101,7 +101,7 @@ class InfoPageTyposcriptConfigController extends \TYPO3\CMS\Backend\Module\Abstr
             }
         } else {
             if ($this->pObj->MOD_SETTINGS['tsconf_parts'] == 99) {
-                $TSparts = BackendUtility::getPagesTSconfig($this->pObj->id, null, true);
+                $TSparts = BackendUtility::getRawPagesTSconfig($this->pObj->id);
                 $lines = [];
                 $pUids = [];
 
index bf4f6f6..e655131 100644 (file)
@@ -27,4 +27,10 @@ return [
             'Breaking-74533-ThrowExceptionIfUserFunctionDoesNotExist.rst',
         ]
     ],
+    'TYPO3\CMS\Backend\Utility\BackendUtility::getPagesTSconfig' => [
+        'maximumNumberOfArguments' => 1,
+        'restFiles' => [
+            'Deprecation-54152-DeprecateArgumentsOfBackendUtilityGetPagesTSconfig.rst',
+        ],
+    ],
 ];