[TASK] Compatibility to safely deprecate f:case "default" argument 31/46431/9
authorClaus Due <claus@namelesscoder.net>
Mon, 1 Feb 2016 15:00:28 +0000 (16:00 +0100)
committerXavier Perseguers <xavier@typo3.org>
Wed, 3 Feb 2016 14:59:02 +0000 (15:59 +0100)
A compatibility layer can be left in place to support "default" used
on f:case. Internally the compatibility ViewHelper changes the class
name used in the ViewHelperNode which gets reflected in the compiled
template as well as the uncompiled rendering.

ReflectionProperty had to be used since no public API exists for
manipulating ViewHelperNodes in this way.

Change-Id: I80c5c8787f6e88f37dfe129ea1844c4421f77d19
Resolves: #73068
Releases: master
Reviewed-on: https://review.typo3.org/46431
Reviewed-by: Daniel Goerz <ervaude@gmail.com>
Tested-by: Daniel Goerz <ervaude@gmail.com>
Reviewed-by: Xavier Perseguers <xavier@typo3.org>
Tested-by: Xavier Perseguers <xavier@typo3.org>
typo3/sysext/core/Documentation/Changelog/master/Breaking-69863-ChangesInViewHelpersPostFluidStandalone.rst
typo3/sysext/core/Documentation/Changelog/master/Deprecation-73068-DeprecatedDefaultArgumentOnFcase.rst [new file with mode: 0644]
typo3/sysext/fluid/Classes/ViewHelpers/CaseViewHelper.php [new file with mode: 0644]

index d1d8f65..5480b24 100644 (file)
@@ -7,7 +7,7 @@ Description
 
 The following ViewHelpers have changed behaviours in Fluid:
 
-* The ``f:case`` ViewHelper does not support ``default`` argument any longer. To indicate which case is the default, use ``f:defaultCase``.
+* The ``f:case`` ViewHelper argument ``default`` has been marked as deprecated. To indicate which case is the default, use ``f:defaultCase``.
 * Tag content of ``f:render`` is no longer ignored and will be output if called with ``optional="1"``.
 * Arguments ``iconOnly`` and ``styleAttributes`` have been removed from ``f:be.buttons.csh``.
 * Argument ``alternateBackgroundColors`` has been removed from ``f:be.tableList``.
@@ -17,7 +17,7 @@ The following ViewHelper classes are now only found in namespace ``TYPO3Fluid\Fl
 
 * ``TYPO3\CMS\Fluid\ViewHelpers\AliasViewHelper``
 * ``TYPO3\CMS\Fluid\ViewHelpers\SwitchViewHelper``
-* ``TYPO3\CMS\Fluid\ViewHelpers\CaseViewHelper``
+* ``TYPO3\CMS\Fluid\ViewHelpers\CaseViewHelper`` (present as deprecated alias until final removal)
 * ``TYPO3\CMS\Fluid\ViewHelpers\CommentViewHelper``
 * ``TYPO3\CMS\Fluid\ViewHelpers\CycleViewHelper``
 * ``TYPO3\CMS\Fluid\ViewHelpers\ForViewHelper``
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-73068-DeprecatedDefaultArgumentOnFcase.rst b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-73068-DeprecatedDefaultArgumentOnFcase.rst
new file mode 100644 (file)
index 0000000..67fb914
--- /dev/null
@@ -0,0 +1,38 @@
+=============================================================
+Deprecation: #73068 - Deprecated "default" argument on f:case
+=============================================================
+
+Description
+===========
+
+Due to the switch to Fluid standalone, the following template markup is not supported anymore:
+
+.. code-block:: html
+
+   <f:case default="true"> ... </f:case>
+
+It must be changed to read:
+
+.. code-block:: html
+
+   <f:defaultCase> ... </f:defaultCase>
+
+A compatibility layer is in place which logs the deprecation.
+
+
+Impact
+======
+
+Use of "default" argument on f:case will trigger a deprecation log entry.
+
+
+Affected Installations
+======================
+
+Any TYPO3 site which uses f:case with argument "default" regardless of the argument value.
+
+
+Migration
+=========
+
+Switch ``f:case`` to ``f:defaultCase`` for the case node that is your default case.
diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/CaseViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/CaseViewHelper.php
new file mode 100644 (file)
index 0000000..44a2912
--- /dev/null
@@ -0,0 +1,66 @@
+<?php
+namespace TYPO3\CMS\Fluid\ViewHelpers;
+
+/*
+ * 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\Utility\GeneralUtility;
+use TYPO3\CMS\Fluid\Core\Rendering\RenderingContextInterface;
+use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper;
+use TYPO3Fluid\Fluid\ViewHelpers\DefaultCaseViewHelper;
+
+/**
+ * Case view helper that is only usable within the SwitchViewHelper.
+ *
+ * @see \TYPO3Fluid\Fluid\ViewHelpers\SwitchViewHelper
+ *
+ * @api
+ */
+class CaseViewHelper extends \TYPO3Fluid\Fluid\ViewHelpers\CaseViewHelper
+{
+    /**
+     * Overrides the "value" argument definition, making it optional.
+     *
+     * @return void
+     */
+    public function initializeArguments() {
+        parent::initializeArguments();
+        $this->overrideArgument('value', 'mixed', 'Value to match in this case', false);
+    }
+
+    /**
+     * @param array $arguments
+     * @return void
+     */
+    public function handleAdditionalArguments(array $arguments) {
+        if (isset($arguments['default'])) {
+            GeneralUtility::deprecationLog('Argument "default" on f:case is deprecated - use f:defaultCase instead');
+            if ((bool)$arguments['default']) {
+                // Patch the ViewHelperNode (parse-time only) and change it's class name
+                $attribute = new \ReflectionProperty($this->viewHelperNode, 'viewHelperClassName');
+                $attribute->setAccessible(true);
+                $attribute->setValue($this->viewHelperNode, DefaultCaseViewHelper::class);
+            }
+        }
+    }
+
+    /**
+     * @param array $arguments
+     * @return void
+     */
+    public function validateAdditionalArguments(array $arguments) {
+        // Unset the "default" argument and let everything else through to be validated
+        unset($arguments['default']);
+        parent::validateAdditionalArguments($arguments);
+    }
+}