[BUGFIX] Evaluate select multiple attribute as boolean 38/37238/7
authorMathias Brodala <mbrodala@pagemachine.de>
Wed, 25 Feb 2015 17:20:33 +0000 (18:20 +0100)
committerMorton Jonuschat <m.jonuschat@mojocode.de>
Fri, 13 Nov 2015 19:34:17 +0000 (20:34 +0100)
The "multiple" attribute should not be rendered blindly with whatever was
passed. It should be evaluated as boolean argument instead.

This is a non-breaking change since Fluid converts any string which is not
empty or not case-insensitive "false" to boolean TRUE.

Resolves: #65345
Releases: master
Change-Id: I426b0446ae31c1efd81de8068ecd1e647c01a18d
Reviewed-on: https://review.typo3.org/37238
Reviewed-by: Wouter Wolters <typo3@wouterwolters.nl>
Tested-by: Wouter Wolters <typo3@wouterwolters.nl>
Reviewed-by: Daniel Goerz <ervaude@gmail.com>
Tested-by: Daniel Goerz <ervaude@gmail.com>
Tested-by: Bjoern Jacob <bjoern.jacob@tritum.de>
Reviewed-by: Bjoern Jacob <bjoern.jacob@tritum.de>
Reviewed-by: Morton Jonuschat <m.jonuschat@mojocode.de>
Tested-by: Morton Jonuschat <m.jonuschat@mojocode.de>
typo3/sysext/fluid/Classes/ViewHelpers/Form/SelectViewHelper.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Form/SelectViewHelperTest.php

index 9233529..b876b58 100644 (file)
@@ -30,7 +30,7 @@ namespace TYPO3\CMS\Fluid\ViewHelpers\Form;
  * </code>
  * Generates a dropdown box like above, except that "VISA Card" is selected.
  *
- * If the select box is a multi-select box (multiple="true"), then "value" can be an array as well.
+ * If the select box is a multi-select box (multiple="1"), then "value" can be an array as well.
  *
  * = Usage on domain objects =
  *
@@ -77,7 +77,6 @@ class SelectViewHelper extends \TYPO3\CMS\Fluid\ViewHelpers\Form\AbstractFormFie
     {
         parent::initializeArguments();
         $this->registerUniversalTagAttributes();
-        $this->registerTagAttribute('multiple', 'string', 'if set, multiple select field');
         $this->registerTagAttribute('size', 'string', 'Size of input field');
         $this->registerTagAttribute('disabled', 'string', 'Specifies that the input element should be disabled when the page loads');
         $this->registerArgument('options', 'array', 'Associative array with internal IDs as key, and the values are displayed in the select box', true);
@@ -88,6 +87,7 @@ class SelectViewHelper extends \TYPO3\CMS\Fluid\ViewHelpers\Form\AbstractFormFie
         $this->registerArgument('errorClass', 'string', 'CSS class to set if there are errors for this view helper', false, 'f3-form-error');
         $this->registerArgument('prependOptionLabel', 'string', 'If specified, will provide an option at first position with the specified label.');
         $this->registerArgument('prependOptionValue', 'string', 'If specified, will provide an option at first position with the specified value.');
+        $this->registerArgument('multiple', 'boolean', 'If set multiple options may be selected.', false, false);
     }
 
     /**
@@ -99,7 +99,8 @@ class SelectViewHelper extends \TYPO3\CMS\Fluid\ViewHelpers\Form\AbstractFormFie
     public function render()
     {
         $name = $this->getName();
-        if ($this->hasArgument('multiple')) {
+        if ($this->arguments['multiple']) {
+            $this->tag->addAttribute('multiple', 'multiple');
             $name .= '[]';
         }
         $this->tag->addAttribute('name', $name);
@@ -114,7 +115,7 @@ class SelectViewHelper extends \TYPO3\CMS\Fluid\ViewHelpers\Form\AbstractFormFie
         // register field name for token generation.
         // in case it is a multi-select, we need to register the field name
         // as often as there are elements in the box
-        if ($this->hasArgument('multiple') && $this->arguments['multiple'] !== '') {
+        if ($this->arguments['multiple']) {
             $content .= $this->renderHiddenFieldForEmptyValue();
             for ($i = 0; $i < count($options); $i++) {
                 $this->registerFieldNameForFormTokenGeneration($name);
index 729040b..e009ba2 100644 (file)
@@ -314,7 +314,7 @@ class SelectViewHelperTest extends \TYPO3\CMS\Fluid\Tests\Unit\ViewHelpers\Form\
 
         $this->arguments['value'] = array('value3', 'value1');
         $this->arguments['name'] = 'myName';
-        $this->arguments['multiple'] = 'multiple';
+        $this->arguments['multiple'] = true;
 
         $this->injectDependenciesIntoViewHelper($this->viewHelper);
 
@@ -379,7 +379,7 @@ class SelectViewHelperTest extends \TYPO3\CMS\Fluid\Tests\Unit\ViewHelpers\Form\
         $this->arguments['optionValueField'] = 'id';
         $this->arguments['optionLabelField'] = 'lastName';
         $this->arguments['name'] = 'myName';
-        $this->arguments['multiple'] = 'multiple';
+        $this->arguments['multiple'] = true;
 
         $this->injectDependenciesIntoViewHelper($this->viewHelper);
 
@@ -419,7 +419,7 @@ class SelectViewHelperTest extends \TYPO3\CMS\Fluid\Tests\Unit\ViewHelpers\Form\
         $this->arguments['value'] = array($user_rl, $user_is);
         $this->arguments['optionLabelField'] = 'lastName';
         $this->arguments['name'] = 'myName';
-        $this->arguments['multiple'] = 'multiple';
+        $this->arguments['multiple'] = true;
 
         $this->injectDependenciesIntoViewHelper($this->viewHelper);
 
@@ -536,7 +536,7 @@ class SelectViewHelperTest extends \TYPO3\CMS\Fluid\Tests\Unit\ViewHelpers\Form\
             'value3' => 'label3'
         );
         $this->arguments['name'] = 'myName';
-        $this->arguments['multiple'] = 'multiple';
+        $this->arguments['multiple'] = true;
         $this->arguments['selectAllByDefault'] = true;
 
         $this->injectDependenciesIntoViewHelper($this->viewHelper);
@@ -559,7 +559,7 @@ class SelectViewHelperTest extends \TYPO3\CMS\Fluid\Tests\Unit\ViewHelpers\Form\
         );
         $this->arguments['value'] = array('value2', 'value1');
         $this->arguments['name'] = 'myName';
-        $this->arguments['multiple'] = 'multiple';
+        $this->arguments['multiple'] = true;
         $this->arguments['selectAllByDefault'] = true;
 
         $this->injectDependenciesIntoViewHelper($this->viewHelper);