[TASK] Improve TranslateViewHelper compiling 19/54119/9
authorClaus Due <claus@namelesscoder.net>
Mon, 11 Sep 2017 15:03:37 +0000 (17:03 +0200)
committerChristian Kuhn <lolli@schwarzbu.ch>
Thu, 1 Mar 2018 22:54:49 +0000 (23:54 +0100)
This patch improves the TranslateViewHelper by letting
it be compiled to a single line of null-coalescing code
in the Fluidtemplate. Since the ViewHelper is one of the
most frequently used, saving method calls and condition
checks here gives a nice result.

Removes the need to load the VH class if all templates
are compiled, further saving some calls and checks.

Change-Id: Ifd3b051305d3cb631d3e8413bac40b4766136aef
Resolves: #82454
Releases: master
Reviewed-on: https://review.typo3.org/54119
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Mathias Schreiber <mathias.schreiber@typo3.com>
Tested-by: Mathias Schreiber <mathias.schreiber@typo3.com>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
typo3/sysext/fluid/Classes/ViewHelpers/TranslateViewHelper.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Fixtures/TranslateViewHelperFixtureForEmptyString.php

index dedb94b..0f56911 100644 (file)
@@ -16,9 +16,9 @@ namespace TYPO3\CMS\Fluid\ViewHelpers;
 
 use TYPO3\CMS\Extbase\Utility\LocalizationUtility;
 use TYPO3\CMS\Fluid\Core\ViewHelper\Exception\InvalidVariableException;
-use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
+use TYPO3Fluid\Fluid\Core\Compiler\TemplateCompiler;
+use TYPO3Fluid\Fluid\Core\Parser\SyntaxTree\ViewHelperNode;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
-use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic;
 
 /**
  * Translate a key from locallang. The files are loaded from the folder
@@ -73,8 +73,6 @@ use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic;
  */
 class TranslateViewHelper extends AbstractViewHelper
 {
-    use CompileWithRenderStatic;
-
     /**
      * Output is escaped already. We must not escape children, to avoid double encoding.
      *
@@ -99,43 +97,65 @@ class TranslateViewHelper extends AbstractViewHelper
     }
 
     /**
-     * Return array element by key.
-     *
-     * @param array $arguments
-     * @param \Closure $renderChildrenClosure
-     * @param RenderingContextInterface $renderingContext
-     * @throws InvalidVariableException
+     * @param string $argumentsName
+     * @param string $closureName
+     * @param string $initializationPhpCode
+     * @param ViewHelperNode $node
+     * @param TemplateCompiler $compiler
      * @return string
      */
-    public static function renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext)
+    public function compile($argumentsName, $closureName, &$initializationPhpCode, ViewHelperNode $node, TemplateCompiler $compiler)
+    {
+        return sprintf(
+            '\\%s::translate(%s[\'key\'] ?? %s[\'id\'], %s[\'extensionName\'] ?? $renderingContext->getControllerContext()->getRequest()->getControllerExtensionName(), %s[\'arguments\'], %s[\'languageKey\'], %s[\'alternativeLanguageKeys\']) ?? %s[\'default\'] ?? %s()',
+            LocalizationUtility::class,
+            $argumentsName,
+            $argumentsName,
+            $argumentsName,
+            $argumentsName,
+            $argumentsName,
+            $argumentsName,
+            $argumentsName,
+            $closureName
+        );
+    }
+
+    /**
+     * @return string|null
+     */
+    public function render()
     {
-        $key = $arguments['key'];
-        $id = $arguments['id'];
-        $default = $arguments['default'];
-        $extensionName = $arguments['extensionName'];
-        $translateArguments = $arguments['arguments'];
+        $key = $this->arguments['key'];
+        $id = $this->arguments['id'];
+        $default = $this->arguments['default'];
+        $extensionName = $this->arguments['extensionName'];
+        $arguments = $this->arguments['arguments'];
+        $languageKey = $this->arguments['languageKey'];
+        $alternativeLanguageKeys = $this->arguments['alternativeLanguageKeys'];
+
+        if (empty($id) && empty($key)) {
+            throw new InvalidVariableException('Either "key" or "id" must be provided for f:translate', 1351584844);
+        }
 
         // Wrapper including a compatibility layer for TYPO3 Flow Translation
         if ($id === null) {
             $id = $key;
         }
 
-        if ((string)$id === '') {
-            throw new InvalidVariableException('An argument "key" or "id" has to be provided', 1351584844);
-        }
-
-        $request = $renderingContext->getControllerContext()->getRequest();
-        $extensionName = $extensionName ?? $request->getControllerExtensionName();
+        $request = $this->renderingContext->getControllerContext()->getRequest();
         try {
-            $value = static::translate($id, $extensionName, $translateArguments, $arguments['languageKey'], $arguments['alternativeLanguageKeys']);
+            $value = $this->translate(
+                $key ?? $id,
+                $extensionName ?? $request->getControllerExtensionName(),
+                $arguments,
+                $languageKey,
+                $alternativeLanguageKeys
+            );
         } catch (\InvalidArgumentException $e) {
             $value = null;
         }
         if ($value === null) {
-            $value = $default ?? $renderChildrenClosure();
-            if (!empty($translateArguments)) {
-                $value = vsprintf($value, $translateArguments);
-            }
+            $value = $default !== null ? $default : $this->renderChildren();
         }
         return $value;
     }
@@ -151,7 +171,7 @@ class TranslateViewHelper extends AbstractViewHelper
      *
      * @return string|null
      */
-    protected static function translate($id, $extensionName, $arguments, $languageKey, $alternativeLanguageKeys)
+    protected function translate($id, $extensionName, $arguments, $languageKey, $alternativeLanguageKeys)
     {
         return LocalizationUtility::translate($id, $extensionName, $arguments, $languageKey, $alternativeLanguageKeys);
     }
index 614cd9f..2e82c38 100644 (file)
@@ -29,7 +29,7 @@ class TranslateViewHelperFixtureForEmptyString extends TranslateViewHelper
      * @param string $languageKey Language key to use for this translation
      * @param string[] $alternativeLanguageKeys Alternative language keys if no translation does exist
      */
-    protected static function translate($id, $extensionName, $arguments, $languageKey, $alternativeLanguageKeys)
+    protected function translate($id, $extensionName, $arguments, $languageKey, $alternativeLanguageKeys)
     {
         return null;
     }