[+BUGFIX] Fluid (ViewHelpers): RenderViewHelper works with TYPO3
authorSebastian Kurfürst <sebastian@typo3.org>
Wed, 22 Sep 2010 06:28:15 +0000 (06:28 +0000)
committerSebastian Kurfürst <sebastian@typo3.org>
Wed, 22 Sep 2010 06:28:15 +0000 (06:28 +0000)
In I14c6dd4d9db13a98f1873a79bb43fbf299d2c835, we have introduced
a change which caused the Menu generation in TYPO3 Phoenix to crash,
as {settings} is not available in these templates.

Now, a check has been added which checks for {settings} being present.

Additionally, a unit test has been written testing this behavior.

typo3/sysext/fluid/Classes/ViewHelpers/RenderViewHelper.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/RenderViewHelperTest.php [new file with mode: 0644]

index 2abf4b2..f49807d 100644 (file)
@@ -39,9 +39,8 @@ class Tx_Fluid_ViewHelpers_RenderViewHelper extends Tx_Fluid_Core_ViewHelper_Abs
         * @api
         */
        public function render($section = NULL, $partial = NULL, $arguments = array()) {
-               if (!isset($arguments['settings'])) {
-                       $arguments['settings'] = $this->templateVariableContainer->get('settings');
-               }
+               $arguments = $this->loadSettingsIntoArguments($arguments);
+
                if ($partial !== NULL) {
                        return $this->viewHelperVariableContainer->getView()->renderPartial($partial, $section, $arguments);
                } elseif ($section !== NULL) {
@@ -50,8 +49,18 @@ class Tx_Fluid_ViewHelpers_RenderViewHelper extends Tx_Fluid_Core_ViewHelper_Abs
                return '';
        }
 
-
+       /**
+        * If $arguments['settings'] is not set, it is loaded from the TemplateVariableContainer (if it is available there).
+        *
+        * @param array $arguments
+        * @return array
+        */
+       protected function loadSettingsIntoArguments($arguments) {
+               if (!isset($arguments['settings']) && $this->templateVariableContainer->exists('settings')) {
+                       $arguments['settings'] = $this->templateVariableContainer->get('settings');
+               }
+               return $arguments;
+       }
 }
 
-
 ?>
diff --git a/typo3/sysext/fluid/Tests/Unit/ViewHelpers/RenderViewHelperTest.php b/typo3/sysext/fluid/Tests/Unit/ViewHelpers/RenderViewHelperTest.php
new file mode 100644 (file)
index 0000000..2b51de7
--- /dev/null
@@ -0,0 +1,105 @@
+<?php
+
+/*                                                                        *
+ * This script belongs to the FLOW3 package "Fluid".                      *
+ *                                                                        *
+ * It is free software; you can redistribute it and/or modify it under    *
+ * the terms of the GNU Lesser General Public License as published by the *
+ * Free Software Foundation, either version 3 of the License, or (at your *
+ * option) any later version.                                             *
+ *                                                                        *
+ * This script is distributed in the hope that it will be useful, but     *
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-    *
+ * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser       *
+ * General Public License for more details.                               *
+ *                                                                        *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with the script.                                         *
+ * If not, see http://www.gnu.org/licenses/lgpl.html                      *
+ *                                                                        *
+ * The TYPO3 project - inspiring people to share!                         *
+ *                                                                        */
+
+require_once(dirname(__FILE__) . '/ViewHelperBaseTestcase.php');
+
+/**
+ * Testcase for RenderViewHelper
+ *
+ * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
+ */
+class Tx_Fluid_ViewHelpers_RenderViewHelperTest extends Tx_Fluid_ViewHelpers_ViewHelperBaseTestcase {
+
+       /**
+        * var Tx_Fluid_ViewHelpers_RenderViewHelper
+        */
+       protected $viewHelper;
+
+       /**
+        * var Tx_Fluid_Core_ViewHelper_Arguments
+        */
+       protected $mockArguments;
+
+       public function setUp() {
+               parent::setUp();
+               $this->templateVariableContainer = new Tx_Fluid_Core_ViewHelper_TemplateVariableContainer();
+               $this->viewHelper = $this->getAccessibleMock('Tx_Fluid_ViewHelpers_RenderViewHelper', array('dummy'));
+               $this->injectDependenciesIntoViewHelper($this->viewHelper);
+       }
+
+       /**
+        * @test
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
+        */
+       public function loadSettingsIntoArgumentsSetsSettingsIfNoSettingsAreSpecified() {
+               $arguments = array(
+                       'someArgument' => 'someValue'
+               );
+               $expected = array(
+                       'someArgument' => 'someValue',
+                       'settings' => 'theSettings'
+               );
+               $this->templateVariableContainer->add('settings', 'theSettings');
+
+               $actual = $this->viewHelper->_call('loadSettingsIntoArguments', $arguments);
+               $this->assertEquals($expected, $actual);
+       }
+
+       /**
+        * @test
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
+        */
+       public function loadSettingsIntoArgumentsDoesNotOverrideGivenSettings() {
+               $arguments = array(
+                       'someArgument' => 'someValue',
+                       'settings' => 'specifiedSettings'
+               );
+               $expected = array(
+                       'someArgument' => 'someValue',
+                       'settings' => 'specifiedSettings'
+               );
+               $this->templateVariableContainer->add('settings', 'theSettings');
+
+               $actual = $this->viewHelper->_call('loadSettingsIntoArguments', $arguments);
+               $this->assertEquals($expected, $actual);
+       }
+
+       /**
+        * @test
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
+        */
+       public function loadSettingsIntoArgumentsDoesNotThrowExceptionIfSettingsAreNotInTemplateVariableContainer() {
+               $arguments = array(
+                       'someArgument' => 'someValue'
+               );
+               $expected = array(
+                       'someArgument' => 'someValue'
+               );
+
+               $actual = $this->viewHelper->_call('loadSettingsIntoArguments', $arguments);
+               $this->assertEquals($expected, $actual);
+       }
+
+
+}
+
+?>
\ No newline at end of file