[FEATURE] Add TypoScriptAspect to handle TypoScript Context settings 12/61312/7
authorSusanne Moog <susanne.moog@typo3.com>
Wed, 17 Jul 2019 16:52:38 +0000 (18:52 +0200)
committerAndreas Fernandez <a.fernandez@scripting-base.de>
Fri, 19 Jul 2019 12:51:24 +0000 (14:51 +0200)
A TypoScriptAspect has been introduced to handle Context depending
TypoScript settings. As a first step, the property `forceTemplateParsing`
has been moved to this aspect and deprecated in both TSFE and
TemplateService.

Additionally, this is another step to resolve the interdependance between
AdminPanel and TSFE.

Resolves: #88792
Releases: master
Change-Id: I77e7548a51534e96ad0656810163267e6c373d3c
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/61312
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: Frank Naegler <frank.naegler@typo3.org>
Tested-by: Andreas Fernandez <a.fernandez@scripting-base.de>
Reviewed-by: Benni Mack <benni@typo3.org>
Reviewed-by: Frank Naegler <frank.naegler@typo3.org>
Reviewed-by: Andreas Fernandez <a.fernandez@scripting-base.de>
typo3/sysext/adminpanel/Classes/Modules/TsDebug/TypoScriptWaterfall.php
typo3/sysext/core/Classes/Context/Context.php
typo3/sysext/core/Classes/Context/TypoScriptAspect.php [new file with mode: 0644]
typo3/sysext/core/Classes/TypoScript/TemplateService.php
typo3/sysext/core/Documentation/Changelog/master/Deprecation-88792-ForceTemplateParsingInTSFEAndTemplateServiceHasBeenDeprecated.rst [new file with mode: 0644]
typo3/sysext/core/Documentation/Changelog/master/Feature-88792-AddTypoScriptAspectToHandleTypoScriptRenderingContextSettings.rst [new file with mode: 0644]
typo3/sysext/frontend/Classes/Controller/TypoScriptFrontendController.php
typo3/sysext/install/Configuration/ExtensionScanner/Php/PropertyPublicMatcher.php

index bb240e0..737c814 100644 (file)
@@ -25,6 +25,8 @@ use TYPO3\CMS\Adminpanel\ModuleApi\ModuleSettingsProviderInterface;
 use TYPO3\CMS\Adminpanel\Service\ConfigurationService;
 use TYPO3\CMS\Backend\FrontendBackendUserAuthentication;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
+use TYPO3\CMS\Core\Context\Context;
+use TYPO3\CMS\Core\Context\TypoScriptAspect;
 use TYPO3\CMS\Core\TimeTracker\TimeTracker;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Fluid\View\StandaloneView;
@@ -71,10 +73,11 @@ class TypoScriptWaterfall extends AbstractSubModule implements InitializableInte
     public function initializeModule(ServerRequestInterface $request): void
     {
         $typoScriptFrontend = $this->getTypoScriptFrontendController();
-        $typoScriptFrontend->forceTemplateParsing = $this->getConfigurationOption(
+        $forceTemplateParsing = $this->getConfigurationOption(
             'forceTemplateParsing'
         );
-        if ($typoScriptFrontend->forceTemplateParsing) {
+        if ($forceTemplateParsing) {
+            GeneralUtility::makeInstance(Context::class)->setAspect('typoscript', GeneralUtility::makeInstance(TypoScriptAspect::class, true));
             $typoScriptFrontend->set_no_cache('Admin Panel: Force template parsing', true);
         }
         $this->getTimeTracker()->LR = (bool)$this->getConfigurationOption('LR');
index b8516ee..de52d2b 100644 (file)
@@ -45,6 +45,7 @@ use TYPO3\CMS\Core\SingletonInterface;
  * - backend.user
  * - language
  * - frontend.preview [if EXT:frontend is loaded]
+ * - typoscript
  */
 class Context implements SingletonInterface
 {
@@ -84,6 +85,9 @@ class Context implements SingletonInterface
         if (!$this->hasAspect('language')) {
             $this->setAspect('language', new LanguageAspect());
         }
+        if (!$this->hasAspect('typoscript')) {
+            $this->setAspect('typoscript', new TypoScriptAspect());
+        }
     }
 
     /**
diff --git a/typo3/sysext/core/Classes/Context/TypoScriptAspect.php b/typo3/sysext/core/Classes/Context/TypoScriptAspect.php
new file mode 100644 (file)
index 0000000..07017f7
--- /dev/null
@@ -0,0 +1,59 @@
+<?php
+declare(strict_types = 1);
+namespace TYPO3\CMS\Core\Context;
+
+/*
+ * 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\Core\Context\Exception\AspectPropertyNotFoundException;
+
+/**
+ * The aspect contains information on TypoScript rendering settings
+ *
+ * Allowed properties:
+ * - forceTemplateParsing
+ */
+class TypoScriptAspect implements AspectInterface
+{
+
+    /**
+     * @var bool
+     */
+    private $forcedTemplateParsing;
+
+    public function __construct(bool $forcedTemplateParsing = false)
+    {
+        $this->forcedTemplateParsing = $forcedTemplateParsing;
+    }
+
+    public function isForcedTemplateParsing(): bool
+    {
+        return $this->forcedTemplateParsing;
+    }
+
+    /**
+     * Get a property from aspect
+     *
+     * @param string $name
+     * @return mixed
+     * @throws AspectPropertyNotFoundException
+     */
+    public function get(string $name)
+    {
+        switch ($name) {
+            case 'forcedTemplateParsing':
+                return $this->forcedTemplateParsing;
+        }
+        throw new AspectPropertyNotFoundException('Property "' . $name . '" not found in Aspect "' . __CLASS__ . '".', 1563375562);
+    }
+}
index ea8896e..36be16c 100644 (file)
@@ -15,7 +15,9 @@ namespace TYPO3\CMS\Core\TypoScript;
  */
 
 use TYPO3\CMS\Core\Cache\CacheManager;
+use TYPO3\CMS\Core\Compatibility\PublicPropertyDeprecationTrait;
 use TYPO3\CMS\Core\Context\Context;
+use TYPO3\CMS\Core\Context\TypoScriptAspect;
 use TYPO3\CMS\Core\Database\Connection;
 use TYPO3\CMS\Core\Database\ConnectionPool;
 use TYPO3\CMS\Core\Database\Query\Restriction\AbstractRestrictionContainer;
@@ -36,6 +38,12 @@ use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController;
  */
 class TemplateService
 {
+    use PublicPropertyDeprecationTrait;
+
+    private $deprecatedPublicProperties = [
+        'forceTemplateParsing' => 'Using tmpl->forceTemplateParsing is deprecated and will no longer work with TYPO3 v11.0. Use TypoScriptAspect from Context instead.'
+    ];
+
     /**
      * option to enable logging, time-tracking (FE-only)
      * usually, this is only done when
@@ -56,8 +64,9 @@ class TemplateService
      * If set, the template is always rendered. Used from Admin Panel.
      *
      * @var bool
+     * @deprecated
      */
-    public $forceTemplateParsing = false;
+    private $forceTemplateParsing = false;
 
     /**
      * This array is passed on to matchObj by generateConfig().
@@ -391,6 +400,10 @@ class TemplateService
      */
     public function start($theRootLine)
     {
+        // @deprecated - can be removed with TYPO3 v11.0
+        if ((bool)$this->forceTemplateParsing) {
+            $this->context->setAspect('typoscript', GeneralUtility::makeInstance(TypoScriptAspect::class, true));
+        }
         if (is_array($theRootLine)) {
             $constantsData = [];
             $setupData = [];
@@ -446,7 +459,7 @@ class TemplateService
                     $setupData = $cachedData['setup'];
                 }
             }
-            if (!empty($setupData) && !$this->forceTemplateParsing) {
+            if (!empty($setupData) && !$this->context->getPropertyFromAspect('typoscript', 'forcedTemplateParsing')) {
                 // TypoScript constants + setup are found in the cache
                 $this->setup_constants = $constantsData;
                 $this->setup = $setupData;
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-88792-ForceTemplateParsingInTSFEAndTemplateServiceHasBeenDeprecated.rst b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-88792-ForceTemplateParsingInTSFEAndTemplateServiceHasBeenDeprecated.rst
new file mode 100644 (file)
index 0000000..9b937f2
--- /dev/null
@@ -0,0 +1,35 @@
+.. include:: ../../Includes.txt
+
+==========================================================================================
+Deprecation: #88792 - forceTemplateParsing in TSFE and TemplateService has been deprecated
+==========================================================================================
+
+See :issue:`88792`
+
+Description
+===========
+
+The setting `forceTemplateParsing` in `TypoScriptFrontendController` as well as an `TemplateService` has been deprecated and replaced by Context API.
+
+
+Impact
+======
+
+Setting either `forceTemplateParsing` of `TypoScriptFrontendController` or `TemplateService` will result in a deprecation notice.
+
+
+Affected Installations
+======================
+
+All installations setting or reading `$TSFE->forceTemplateParsing` or `TemplateService->forceTemplateParsing`.
+
+
+Migration
+=========
+
+Use the Context API ::
+
+   GeneralUtility::makeInstance(Context::class)->getPropertyFromAspect('typoscript', 'forcedTemplateParsing');
+   $context->setAspect('typoscript', GeneralUtility::makeInstance(TypoScriptAspect::class, true));
+
+.. index:: Frontend, PHP-API, PartiallyScanned, ext:core
\ No newline at end of file
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Feature-88792-AddTypoScriptAspectToHandleTypoScriptRenderingContextSettings.rst b/typo3/sysext/core/Documentation/Changelog/master/Feature-88792-AddTypoScriptAspectToHandleTypoScriptRenderingContextSettings.rst
new file mode 100644 (file)
index 0000000..47e3b28
--- /dev/null
@@ -0,0 +1,20 @@
+.. include:: ../../Includes.txt
+
+======================================================================================
+Feature: #88792 - Add TypoScriptAspect to handle TypoScript Rendering Context settings
+======================================================================================
+
+See :issue:`88792`
+
+Description
+===========
+
+A new aspect was added to the context to handle TypoScript related `Context` settings.
+
+
+Impact
+======
+
+A new Aspect `TypoScriptAspect` exists which can be used to manipulate/check whether TemplateRendering is forced.
+
+.. index:: Frontend, PHP-API, ext:core
\ No newline at end of file
index 62f671e..42ea9c3 100644 (file)
@@ -26,6 +26,7 @@ use TYPO3\CMS\Core\Context\Context;
 use TYPO3\CMS\Core\Context\DateTimeAspect;
 use TYPO3\CMS\Core\Context\LanguageAspect;
 use TYPO3\CMS\Core\Context\LanguageAspectFactory;
+use TYPO3\CMS\Core\Context\TypoScriptAspect;
 use TYPO3\CMS\Core\Context\UserAspect;
 use TYPO3\CMS\Core\Context\VisibilityAspect;
 use TYPO3\CMS\Core\Context\WorkspaceAspect;
@@ -326,8 +327,9 @@ class TypoScriptFrontendController implements LoggerAwareInterface
     /**
      * Passed to TypoScript template class and tells it to force template rendering
      * @var bool
+     * @deprecated
      */
-    public $forceTemplateParsing = false;
+    private $forceTemplateParsing = false;
 
     /**
      * The array which cHash_calc is based on, see PageArgumentValidator class.
@@ -1999,11 +2001,9 @@ class TypoScriptFrontendController implements LoggerAwareInterface
         }
 
         // If config is not set by the cache (which would be a major mistake somewhere) OR if INTincScripts-include-scripts have been registered, then we must parse the template in order to get it
-        if (empty($this->config) || is_array($this->config['INTincScript']) || $this->forceTemplateParsing) {
+        if (empty($this->config) || is_array($this->config['INTincScript']) || $this->context->getPropertyFromAspect('typoscript', 'forcedTemplateParsing')) {
             $timeTracker = $this->getTimeTracker();
             $timeTracker->push('Parse template');
-            // Force parsing, if set?:
-            $this->tmpl->forceTemplateParsing = $this->forceTemplateParsing;
             // Start parsing the TS template. Might return cached version.
             $this->tmpl->start($this->rootLine);
             $timeTracker->pull();
@@ -3939,6 +3939,9 @@ class TypoScriptFrontendController implements LoggerAwareInterface
             case 'fePreview':
                 trigger_error('Property $TSFE->fePreview is not in use anymore as this information is now stored within the FrontendPreview aspect.', E_USER_DEPRECATED);
                 return $this->context->hasAspect('frontend.preview');
+            case 'forceTemplateParsing':
+                trigger_error('Property $TSFE->forceTemplateParsing is not in use anymore as this information is now stored within the TypoScript aspect.', E_USER_DEPRECATED);
+                return $this->context->hasAspect('typoscript') && $this->context->getPropertyFromAspect('typoscript', 'forcedTemplateParsing');
         }
         return false;
     }
@@ -3964,7 +3967,12 @@ class TypoScriptFrontendController implements LoggerAwareInterface
                     return $this->context->getPropertyFromAspect('frontend.preview', 'isPreview');
                 }
                 break;
-
+            case 'forceTemplateParsing':
+                trigger_error('Property $TSFE->forceTemplateParsing is not in use anymore as this information is now stored within the TypoScript aspect.', E_USER_DEPRECATED);
+                if ($this->context->hasAspect('typoscript')) {
+                    return $this->context->getPropertyFromAspect('typoscript', 'forcedTemplateParsing');
+                }
+                break;
         }
         return $this->$propertyName;
     }
@@ -3990,6 +3998,10 @@ class TypoScriptFrontendController implements LoggerAwareInterface
                 trigger_error('Property $TSFE->fePreview is not in use anymore as this information is now stored within the FrontendPreview aspect.', E_USER_DEPRECATED);
                 $this->context->setAspect('frontend.preview', GeneralUtility::makeInstance(PreviewAspect::class, (bool)$propertyValue));
                 break;
+            case 'forceTemplateParsing':
+                trigger_error('Property $TSFE->forceTemplateParsing is not in use anymore as this information is now stored within the TypoScript aspect.', E_USER_DEPRECATED);
+                $this->context->setAspect('typoscript', GeneralUtility::makeInstance(TypoScriptAspect::class, (bool)$propertyValue));
+                break;
         }
         $this->$propertyName = $propertyValue;
     }
@@ -4009,6 +4021,10 @@ class TypoScriptFrontendController implements LoggerAwareInterface
                 trigger_error('Property $TSFE->fePreview is not in use anymore as this information is now stored within the FrontendPreview aspect.', E_USER_DEPRECATED);
                 $this->context->setAspect('frontend.preview', GeneralUtility::makeInstance(PreviewAspect::class, false));
                 break;
+            case 'forceTemplateParsing':
+                trigger_error('Property $TSFE->forceTemplateParsing is not in use anymore as this information is now stored within the TypoScript aspect.', E_USER_DEPRECATED);
+                $this->context->setAspect('typoscript', GeneralUtility::makeInstance(TypoScriptAspect::class, false));
+                break;
         }
         unset($this->$propertyName);
     }
index 4230e90..2a6310e 100644 (file)
@@ -594,4 +594,16 @@ return [
             'Breaking-88779-RecordListRemoveUnusedCode.rst',
         ],
     ],
+    'TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->forceTemplateParsing' => [
+        'restFiles' => [
+            'Deprecation-88792-ForceTemplateParsingInTSFEAndTemplateServiceHasBeenDeprecated.rst',
+            'Feature-88792-AddTypoScriptAspectToHandleTypoScriptRenderingContextSettings.rst',
+        ],
+    ],
+    'TYPO3\CMS\Core\TypoScript\TemplateService->forceTemplateParsing' => [
+        'restFiles' => [
+            'Deprecation-88792-ForceTemplateParsingInTSFEAndTemplateServiceHasBeenDeprecated.rst',
+            'Feature-88792-AddTypoScriptAspectToHandleTypoScriptRenderingContextSettings.rst',
+        ],
+    ],
 ];