[!!!][TASK] Drop PageTS "TSFE.constants" functionality 34/61034/3
authorBenni Mack <benni@typo3.org>
Fri, 14 Jun 2019 10:49:14 +0000 (12:49 +0200)
committerAndreas Fernandez <a.fernandez@scripting-base.de>
Mon, 17 Jun 2019 05:12:33 +0000 (07:12 +0200)
When parsing TypoScript, PageTSconfig and UserTSconfig
is taking into account for evaluting if "TSFE.constants" is
set in PageTSconfig. If this is used, this acts as a default
constant.

However, this feature has various drawbacks, and has been
superseded by actually having constants globally (FE/BE) and via
Conditions available.

For frontend calls with empty pagesection caches, this improves
performance greatly, especially in pages on a deeper level (recursion).

This also reduces the footprint to have the TypoScriptParser (incl.
condition matching) being called too often.

Resolves: #88564
Releases: master
Change-Id: Icbdfa9918a9a79510a87198bf033c4de96d71107
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/61034
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: Georg Ringer <georg.ringer@gmail.com>
Tested-by: Andreas Fernandez <a.fernandez@scripting-base.de>
Reviewed-by: Georg Ringer <georg.ringer@gmail.com>
Reviewed-by: Andreas Fernandez <a.fernandez@scripting-base.de>
typo3/sysext/core/Classes/TypoScript/ExtendedTemplateService.php
typo3/sysext/core/Classes/TypoScript/TemplateService.php
typo3/sysext/core/Documentation/Changelog/master/Breaking-88564-PageTSconfigSettingTSFEconstantsRemoved.rst [new file with mode: 0644]
typo3/sysext/info/Classes/Controller/InfoPageTyposcriptConfigController.php

index ae9467e..a75be90 100644 (file)
@@ -327,7 +327,6 @@ class ExtendedTemplateService extends TemplateService
         $constants = GeneralUtility::makeInstance(Parser\TypoScriptParser::class);
         // Register comments!
         $constants->regComments = true;
-        $constants->setup = $this->mergeConstantsFromPageTSconfig([]);
         /** @var ConditionMatcher $matchObj */
         $matchObj = GeneralUtility::makeInstance(ConditionMatcher::class);
         // Matches ALL conditions in TypoScript
index 6a6cada..62c5225 100644 (file)
@@ -24,7 +24,6 @@ use TYPO3\CMS\Core\Database\Query\Restriction\DefaultRestrictionContainer;
 use TYPO3\CMS\Core\Database\Query\Restriction\HiddenRestriction;
 use TYPO3\CMS\Core\Package\PackageManager;
 use TYPO3\CMS\Core\TimeTracker\TimeTracker;
-use TYPO3\CMS\Core\Utility\ArrayUtility;
 use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Frontend\Configuration\TypoScript\ConditionMatching\ConditionMatcher;
@@ -188,13 +187,6 @@ class TemplateService
      */
     protected $absoluteRootLine;
 
-    /**
-     * A pointer to the last entry in the rootline where a template was found.
-     *
-     * @var int
-     */
-    protected $outermostRootlineIndexWithTemplate = 0;
-
     /**
      * Array of arrays with title/uid of templates in hierarchy
      *
@@ -561,7 +553,6 @@ class TemplateService
                     $this->versionOL($row);
                     if (is_array($row)) {
                         $this->processTemplate($row, 'sys_' . $row['uid'], $this->absoluteRootLine[$a]['uid'], 'sys_' . $row['uid']);
-                        $this->outermostRootlineIndexWithTemplate = $a;
                     }
                 }
             }
@@ -592,7 +583,6 @@ class TemplateService
                 $this->versionOL($row);
                 if (is_array($row)) {
                     $this->processTemplate($row, 'sys_' . $row['uid'], $this->absoluteRootLine[$a]['uid'], 'sys_' . $row['uid']);
-                    $this->outermostRootlineIndexWithTemplate = $a;
                 }
             }
             $this->rootLine[] = $this->absoluteRootLine[$a];
@@ -1006,7 +996,6 @@ class TemplateService
         /** @var Parser\TypoScriptParser $constants */
         $constants = GeneralUtility::makeInstance(Parser\TypoScriptParser::class);
         $constants->breakPointLN = (int)$this->ext_constants_BRP;
-        $constants->setup = $this->mergeConstantsFromPageTSconfig([]);
         /** @var ConditionMatcher $matchObj */
         $matchObj = GeneralUtility::makeInstance(ConditionMatcher::class);
         $matchObj->setSimulateMatchConditions($this->matchAlternative);
@@ -1140,75 +1129,6 @@ class TemplateService
         $this->processIncludesHasBeenRun = true;
     }
 
-    /**
-     * Loads Page TSconfig until the outermost template record and parses the configuration - if TSFE.constants object path is found it is merged with the default data in here!
-     *
-     * @param array $constArray Constants array, default input.
-     * @return array Constants array, modified
-     * @todo Apply caching to the parsed Page TSconfig. This is done in the other similar functions for both frontend and backend. However, since this functions works for BOTH frontend and backend we will have to either write our own local caching function or (more likely) detect if we are in FE or BE and use caching functions accordingly. Not having caching affects mostly the backend modules inside the "Template" module since the overhead in the frontend is only seen when TypoScript templates are parsed anyways (after which point they are cached anyways...)
-     */
-    protected function mergeConstantsFromPageTSconfig($constArray)
-    {
-        $TSdataArray = [];
-        // Setting default configuration:
-        $TSdataArray[] = $GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPageTSconfig'];
-        for ($a = 0; $a <= $this->outermostRootlineIndexWithTemplate; $a++) {
-            if (trim($this->absoluteRootLine[$a]['tsconfig_includes'])) {
-                $includeTsConfigFileList = GeneralUtility::trimExplode(
-                    ',',
-                    $this->absoluteRootLine[$a]['tsconfig_includes'],
-                    true
-                );
-
-                $TSdataArray = $this->mergeConstantsFromIncludedTsConfigFiles($includeTsConfigFileList, $TSdataArray);
-            }
-            $TSdataArray[] = $this->absoluteRootLine[$a]['TSconfig'];
-        }
-        // Parsing the user TS (or getting from cache)
-        $TSdataArray = Parser\TypoScriptParser::checkIncludeLines_array($TSdataArray);
-        $userTS = implode(LF . '[GLOBAL]' . LF, $TSdataArray);
-        /** @var Parser\TypoScriptParser $parseObj */
-        $parseObj = GeneralUtility::makeInstance(Parser\TypoScriptParser::class);
-        $parseObj->parse($userTS);
-        if (is_array($parseObj->setup['TSFE.']['constants.'])) {
-            ArrayUtility::mergeRecursiveWithOverrule($constArray, $parseObj->setup['TSFE.']['constants.']);
-        }
-
-        return $constArray;
-    }
-
-    /**
-     * Reads TSconfig defined in external files and appends it to the given TSconfig array (in this case only constants)
-     *
-     * @param array $filesToInclude The files to read constants from
-     * @param array $TSdataArray The TSconfig array the constants should be appended to
-     * @return array The TSconfig with the included constants appended
-     */
-    protected function mergeConstantsFromIncludedTsConfigFiles($filesToInclude, $TSdataArray)
-    {
-        foreach ($filesToInclude as $key => $file) {
-            if (strpos($file, 'EXT:') !== 0) {
-                continue;
-            }
-
-            list($extensionKey, $filePath) = explode('/', substr($file, 4), 2);
-
-            if ((string)$extensionKey === '' || !ExtensionManagementUtility::isLoaded($extensionKey)) {
-                continue;
-            }
-            if ((string)$filePath == '') {
-                continue;
-            }
-
-            $tsConfigFile = ExtensionManagementUtility::extPath($extensionKey) . $filePath;
-            if (file_exists($tsConfigFile)) {
-                $TSdataArray[] = file_get_contents($tsConfigFile);
-            }
-        }
-
-        return $TSdataArray;
-    }
-
     /**
      * This flattens a hierarchical TypoScript array to $this->flatSetup
      *
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Breaking-88564-PageTSconfigSettingTSFEconstantsRemoved.rst b/typo3/sysext/core/Documentation/Changelog/master/Breaking-88564-PageTSconfigSettingTSFEconstantsRemoved.rst
new file mode 100644 (file)
index 0000000..739e955
--- /dev/null
@@ -0,0 +1,43 @@
+.. include:: ../../Includes.txt
+
+================================================================
+Breaking: #88564 - PageTSconfig setting "TSFE.constants" removed
+================================================================
+
+See :issue:`88564`
+
+Description
+===========
+
+The PageTSconfig / UserTSconfig `TSFE.constants`, which allowed to override settings constants
+on a per-tree level page was introduced in TYPO3 at the very beginning, long before TSconfig had conditions.
+
+It was used to share TypoScript-based configuration between frontend / backend, and on a per-page/tree level.
+
+However, this has been superseded for a long time by using proper configuration files which
+can be loaded at any time when `ext_localconf.php` of an extension is loaded, for example.
+
+Therefore, the option has been removed.
+
+
+Impact
+======
+
+Setting `TSFE.constants` in PageTSconfig or UserTSconfig has no effect anymore, as it is not evaluated
+anymore.
+
+
+Affected Installations
+======================
+
+Any TYPO3 installation using `TSFE.constants` in their PageTSconfig.
+
+
+Migration
+=========
+
+It is recommended to include TypoScript conditions in setup/constants, also since constants+setup
+are also evaluated in Backend context for Extbase modules, this option is not needed anymore and
+can be substituted by simple constants in `sys_template` or any Extension inclusion files as well.
+
+.. index:: TSConfig, NotScanned
\ No newline at end of file
index 9a55119..1cf297e 100644 (file)
@@ -191,9 +191,6 @@ class InfoPageTyposcriptConfigController
                     case '6':
                         $pageTsConfig = $pageTsConfig['TCEMAIN.'] ?? [];
                         break;
-                    case '3':
-                        $pageTsConfig = $pageTsConfig['TSFE.'] ?? [];
-                        break;
                     case '4':
                         $pageTsConfig = $pageTsConfig['user.'] ?? [];
                         break;
@@ -232,7 +229,6 @@ class InfoPageTyposcriptConfigController
                 2 => 'RTE.',
                 5 => 'TCEFORM.',
                 6 => 'TCEMAIN.',
-                3 => 'TSFE.',
                 4 => 'user.',
                 99 => $lang->getLL('tsconf_configFields')
             ],