From 561a139a05301b4bfee1ebcf8aebcb1cc0a24380 Mon Sep 17 00:00:00 2001 From: Ralf Zimmermann <ralf.zimmermann@tritum.de> Date: Mon, 28 Sep 2015 12:56:42 +0200 Subject: [PATCH] [BUGFIX] Ensure ext:form select value is properly set Change-Id: I80393a754626bbafdd2e32836741f97125892604 Resolves: #70122 Releases: master Reviewed-on: http://review.typo3.org/43578 Reviewed-by: Oliver Hader <oliver.hader@typo3.org> Tested-by: Oliver Hader <oliver.hader@typo3.org> --- .../Hooks/HandleIncomingFormValues.php | 3 +- .../AggregateSelectOptionsViewHelper.php | 32 +++--- .../Confirmation/FlatElements/Select.html | 98 ++++++++++++++----- .../Mail/Html/FlatElements/Select.html | 12 +-- .../Mail/Plain/FlatElements/Select.html | 4 +- .../Show/FlatElements/Select.html | 2 +- .../Confirmation/FlatElements/Select.html | 98 ++++++++++++++----- .../Mail/Html/FlatElements/Select.html | 10 +- .../Mail/Plain/FlatElements/Select.html | 4 +- .../Default/Show/FlatElements/Select.html | 2 +- 10 files changed, 175 insertions(+), 90 deletions(-) diff --git a/typo3/sysext/form/Classes/Hooks/HandleIncomingFormValues.php b/typo3/sysext/form/Classes/Hooks/HandleIncomingFormValues.php index b132fecc3f5c..36a038fe7261 100644 --- a/typo3/sysext/form/Classes/Hooks/HandleIncomingFormValues.php +++ b/typo3/sysext/form/Classes/Hooks/HandleIncomingFormValues.php @@ -113,6 +113,7 @@ class HandleIncomingFormValues implements SingletonInterface { $element->getParentElement()->setAdditionalArgument('atLeastOneCheckedChildElement', TRUE); } } elseif ($element->getElementType() === 'OPTION') { + $modelValue = (string)($element->getAdditionalArgument('value') ?: $element->getElementCounter()); if ($element->getParentElement()->getElementType() === 'OPTGROUP') { $parentName = $element->getParentElement()->getParentElement()->getName(); } else { @@ -121,7 +122,7 @@ class HandleIncomingFormValues implements SingletonInterface { $incomingData = $formBuilder->getIncomingData()->getIncomingField($parentName); /* Multiselect */ if (is_array($incomingData)) { - if (in_array($modelValue, $incomingData)) { + if (in_array($modelValue, $incomingData, TRUE)) { $element->setHtmlAttribute('selected', 'selected'); } else { $element->setHtmlAttribute('selected', NULL); diff --git a/typo3/sysext/form/Classes/ViewHelpers/AggregateSelectOptionsViewHelper.php b/typo3/sysext/form/Classes/ViewHelpers/AggregateSelectOptionsViewHelper.php index bf5f251e940e..a1f0a69f07af 100644 --- a/typo3/sysext/form/Classes/ViewHelpers/AggregateSelectOptionsViewHelper.php +++ b/typo3/sysext/form/Classes/ViewHelpers/AggregateSelectOptionsViewHelper.php @@ -15,17 +15,13 @@ namespace TYPO3\CMS\Form\ViewHelpers; */ use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper; +use TYPO3\CMS\Form\Domain\Model\Element; /** * Aggregator for the select options */ class AggregateSelectOptionsViewHelper extends AbstractViewHelper { - /** - * @var \TYPO3\CMS\Form\Domain\Model\Form - */ - protected $model; - /** * @var array */ @@ -37,14 +33,14 @@ class AggregateSelectOptionsViewHelper extends AbstractViewHelper { protected $selectedValues = array(); /** - * @param \TYPO3\CMS\Form\Domain\Model\Element\AbstractElement $model + * @param Element $model * @param boolean $returnSelectedValues * @return array */ - public function render($model, $returnSelectedValues = FALSE) { + public function render(Element $model, $returnSelectedValues = FALSE) { foreach ($model->getChildElements() as $element) { - $this->createElement($element, array()); + $this->createElement($element); } if ($returnSelectedValues === TRUE) { @@ -55,20 +51,20 @@ class AggregateSelectOptionsViewHelper extends AbstractViewHelper { } /** - * @param \TYPO3\CMS\Form\Domain\Model\Element\AbstractElement $model + * @param Element $model * @param array $optGroupData * @return void */ - public function createElement($model, $optGroupData = array()) { + protected function createElement(Element $model, array $optGroupData = array()) { $this->checkElementForOptgroup($model, $optGroupData); } /** - * @param \TYPO3\CMS\Form\Domain\Model\Element\AbstractElement $model + * @param Element $model * @param array $optGroupData * @return void */ - protected function checkElementForOptgroup($model, $optGroupData = array()) { + protected function checkElementForOptgroup(Element $model, array $optGroupData = array()) { if ($model->getElementType() === 'OPTGROUP') { $optGroupData = array( 'label' => $model->getAdditionalArgument('label'), @@ -77,13 +73,13 @@ class AggregateSelectOptionsViewHelper extends AbstractViewHelper { $this->getChildElements($model, $optGroupData); } else { $optionData = array( - 'value' => $model->getAdditionalArgument('value'), + 'value' => $model->getAdditionalArgument('value') ?: $model->getElementCounter(), 'label' => $model->getAdditionalArgument('text'), 'selected' => $model->getHtmlAttribute('selected'), ); - if ($model->getHtmlAttribute('selected') == 'selected') { - $this->selectedValues[] = $model->getAdditionalArgument('value'); + if (!empty($optionData['selected'])) { + $this->selectedValues[] = $optionData['value']; } if (count($optGroupData)) { @@ -93,18 +89,18 @@ class AggregateSelectOptionsViewHelper extends AbstractViewHelper { } else { $this->options[] = $optionData; } - return $model; } } /** - * @param \TYPO3\CMS\Form\Domain\Model\Element\AbstractElement $model + * @param Element $model * @param array $optGroupData * @return void */ - protected function getChildElements($model, $optGroupData = array()) { + protected function getChildElements(Element $model, array $optGroupData = array()) { foreach ($model->getChildElements() as $element) { $this->createElement($element, $optGroupData); } } + } diff --git a/typo3/sysext/form/Resources/Private/Partials/Compatibility/Confirmation/FlatElements/Select.html b/typo3/sysext/form/Resources/Private/Partials/Compatibility/Confirmation/FlatElements/Select.html index ae70c1beef62..772230c7f289 100644 --- a/typo3/sysext/form/Resources/Private/Partials/Compatibility/Confirmation/FlatElements/Select.html +++ b/typo3/sysext/form/Resources/Private/Partials/Compatibility/Confirmation/FlatElements/Select.html @@ -4,16 +4,66 @@ <f:format.raw>{model.layout.elementOuterWrap.0}</f:format.raw> <ol> </f:if> - <f:for each="<form:aggregateSelectOptions model='{model}' />" as="option"> + <f:for each="{form:aggregateSelectOptions(model:model)}" as="option"> <f:if condition="{option.options}"> <f:then> <f:for each="{option.options}" as="optgroupOption"> - <f:if condition="{optgroupOption.selected} == 'selected'"> + <f:if condition="{optgroupOption.selected}"> <f:if condition="{model.showElement}"> <f:format.raw>{model.layout.elementOuterWrap.0}</f:format.raw> {optgroupOption.label} <f:format.raw>{model.layout.elementOuterWrap.1}</f:format.raw> </f:if> + <f:if condition="{model.additionalArguments.multiple}"> + <f:then> + <f:form.hidden + class="{model.additionalArguments.class}" + dir="{model.additionalArguments.dir}" + id="{model.additionalArguments.id}" + lang="{model.additionalArguments.lang}" + style="{model.additionalArguments.style}" + title="{model.additionalArguments.title}" + accesskey="{model.additionalArguments.accesskey}" + tabindex="{model.additionalArguments.tabindex}" + onclick="{model.additionalArguments.onclick}" + + name="{model.additionalArguments.prefix}[{model.additionalArguments.name}][]" + value="{option.value}" + + additionalAttributes="{model.htmlAttributes}" + /> + </f:then> + <f:else> + <f:form.hidden + class="{model.additionalArguments.class}" + dir="{model.additionalArguments.dir}" + id="{model.additionalArguments.id}" + lang="{model.additionalArguments.lang}" + style="{model.additionalArguments.style}" + title="{model.additionalArguments.title}" + accesskey="{model.additionalArguments.accesskey}" + tabindex="{model.additionalArguments.tabindex}" + onclick="{model.additionalArguments.onclick}" + + name="{model.additionalArguments.prefix}[{model.additionalArguments.name}]" + value="{option.value}" + + additionalAttributes="{model.htmlAttributes}" + /> + </f:else> + </f:if> + </f:if> + </f:for> + </f:then> + <f:else> + <f:if condition="{option.selected}"> + <f:if condition="{model.showElement}"> + <f:format.raw>{model.layout.elementOuterWrap.0}</f:format.raw> + {option.label} + <f:format.raw>{model.layout.elementOuterWrap.1}</f:format.raw> + </f:if> + <f:if condition="{model.additionalArguments.multiple}"> + <f:then> <f:form.hidden class="{model.additionalArguments.class}" dir="{model.additionalArguments.dir}" @@ -26,36 +76,30 @@ onclick="{model.additionalArguments.onclick}" name="{model.additionalArguments.prefix}[{model.additionalArguments.name}][]" - value="{optgroupOption.value}" + value="{option.value}" additionalAttributes="{model.htmlAttributes}" /> - </f:if> - </f:for> - </f:then> - <f:else> - <f:if condition="{option.selected} == 'selected'"> - <f:if condition="{model.showElement}"> - <f:format.raw>{model.layout.elementOuterWrap.0}</f:format.raw> - {option.label} - <f:format.raw>{model.layout.elementOuterWrap.1}</f:format.raw> - </f:if> - <f:form.hidden - class="{model.additionalArguments.class}" - dir="{model.additionalArguments.dir}" - id="{model.additionalArguments.id}" - lang="{model.additionalArguments.lang}" - style="{model.additionalArguments.style}" - title="{model.additionalArguments.title}" - accesskey="{model.additionalArguments.accesskey}" - tabindex="{model.additionalArguments.tabindex}" - onclick="{model.additionalArguments.onclick}" + </f:then> + <f:else> + <f:form.hidden + class="{model.additionalArguments.class}" + dir="{model.additionalArguments.dir}" + id="{model.additionalArguments.id}" + lang="{model.additionalArguments.lang}" + style="{model.additionalArguments.style}" + title="{model.additionalArguments.title}" + accesskey="{model.additionalArguments.accesskey}" + tabindex="{model.additionalArguments.tabindex}" + onclick="{model.additionalArguments.onclick}" - name="{model.additionalArguments.prefix}[{model.additionalArguments.name}][]" - value="{option.value}" + name="{model.additionalArguments.prefix}[{model.additionalArguments.name}]" + value="{option.value}" - additionalAttributes="{model.htmlAttributes}" - /> + additionalAttributes="{model.htmlAttributes}" + /> + </f:else> + </f:if> </f:if> </f:else> </f:if> diff --git a/typo3/sysext/form/Resources/Private/Partials/Compatibility/PostProcessor/Mail/Html/FlatElements/Select.html b/typo3/sysext/form/Resources/Private/Partials/Compatibility/PostProcessor/Mail/Html/FlatElements/Select.html index f8e7497b5490..ffa5c6198b0b 100644 --- a/typo3/sysext/form/Resources/Private/Partials/Compatibility/PostProcessor/Mail/Html/FlatElements/Select.html +++ b/typo3/sysext/form/Resources/Private/Partials/Compatibility/PostProcessor/Mail/Html/FlatElements/Select.html @@ -5,22 +5,22 @@ <em>{model.additionalArguments.label}</em> </td> <td> -<f:for each="<form:aggregateSelectOptions model='{model}' />" as="option"> +<f:for each="{form:aggregateSelectOptions(model:model)}" as="option"> <f:if condition="{option.options}"> <f:then> <f:for each="{option.options}" as="optgroupOption"> -<f:if condition="{optgroupOption.selected} == 'selected'"> - <div class="csc-form-element csc-form-element-{model.elementTypeLowerCase}">{optgroupOption.value}</div> +<f:if condition="{optgroupOption.selected}"> + <div class="csc-form-element csc-form-element-{model.elementTypeLowerCase}">{optgroupOption.label}</div> </f:if> </f:for> </f:then> <f:else> -<f:if condition="{option.selected} == 'selected'"> - <div class="csc-form-element csc-form-element-{model.elementTypeLowerCase}">{option.value}</div> +<f:if condition="{option.selected}"> + <div class="csc-form-element csc-form-element-{model.elementTypeLowerCase}">{option.label}</div> </f:if> </f:else> </f:if> </f:for> </td> </tr> -</f:if> \ No newline at end of file +</f:if> diff --git a/typo3/sysext/form/Resources/Private/Partials/Compatibility/PostProcessor/Mail/Plain/FlatElements/Select.html b/typo3/sysext/form/Resources/Private/Partials/Compatibility/PostProcessor/Mail/Plain/FlatElements/Select.html index 1d6cba8b6a6f..122c8666ff20 100644 --- a/typo3/sysext/form/Resources/Private/Partials/Compatibility/PostProcessor/Mail/Plain/FlatElements/Select.html +++ b/typo3/sysext/form/Resources/Private/Partials/Compatibility/PostProcessor/Mail/Plain/FlatElements/Select.html @@ -1,3 +1,3 @@ -{namespace form=TYPO3\CMS\Form\ViewHelpers}<f:if condition="{model.showElement}"><form:plainMail labelContent="{model}" newLineAfterLabel="1" indent="4" /><f:for each="<form:aggregateSelectOptions model='{model}' />" as="option"><f:if condition="{option.options}"><f:then><f:for each="{option.options}" as="optgroupOption"><f:if condition="{optgroupOption.selected} == 'selected'"><form:plainMail content="{optgroupOption.value}" /> -</f:if></f:for></f:then><f:else><f:if condition="{option.selected} == 'selected'"><form:plainMail content="{option.value}" /> +{namespace form=TYPO3\CMS\Form\ViewHelpers}<f:if condition="{model.showElement}"><form:plainMail labelContent="{model}" newLineAfterLabel="1" indent="4" /><f:for each="{form:aggregateSelectOptions(model:model)}" as="option"><f:if condition="{option.options}"><f:then><f:for each="{option.options}" as="optgroupOption"><f:if condition="{optgroupOption.selected}"><form:plainMail content="{optgroupOption.label}" /> +</f:if></f:for></f:then><f:else><f:if condition="{option.selected}"><form:plainMail content="{option.label}" /> </f:if></f:else></f:if></f:for><form:plainMail indent="-4"/></f:if> \ No newline at end of file diff --git a/typo3/sysext/form/Resources/Private/Partials/Compatibility/Show/FlatElements/Select.html b/typo3/sysext/form/Resources/Private/Partials/Compatibility/Show/FlatElements/Select.html index e3b15c56d917..494df691bc98 100644 --- a/typo3/sysext/form/Resources/Private/Partials/Compatibility/Show/FlatElements/Select.html +++ b/typo3/sysext/form/Resources/Private/Partials/Compatibility/Show/FlatElements/Select.html @@ -21,7 +21,7 @@ optionLabelField="label" optionValueField="value" - options='<form:aggregateSelectOptions model="{model}" />' + options="{form:aggregateSelectOptions(model:model)}" prependOptionLabel="{model.additionalArguments.prependOptionLabel}" prependOptionValue="{model.additionalArguments.prependOptionValue}" selectAllByDefault="{model.additionalArguments.selectAllByDefault}" diff --git a/typo3/sysext/form/Resources/Private/Partials/Default/Confirmation/FlatElements/Select.html b/typo3/sysext/form/Resources/Private/Partials/Default/Confirmation/FlatElements/Select.html index 32e6eca80b26..68101e523d27 100644 --- a/typo3/sysext/form/Resources/Private/Partials/Default/Confirmation/FlatElements/Select.html +++ b/typo3/sysext/form/Resources/Private/Partials/Default/Confirmation/FlatElements/Select.html @@ -7,16 +7,66 @@ </label> <ol> </f:if> -<f:for each="<form:aggregateSelectOptions model='{model}' />" as="option"> +<f:for each="{form:aggregateSelectOptions(model:model)}" as="option"> <f:if condition="{option.options}"> <f:then> <f:for each="{option.options}" as="optgroupOption"> - <f:if condition="{optgroupOption.selected} == 'selected'"> + <f:if condition="{optgroupOption.selected}"> <f:if condition="{model.showElement}"> <li class="csc-form-element csc-form-element-{model.elementTypeLowerCase}"> {optgroupOption.label} </li> </f:if> + <f:if condition="{model.additionalArguments.multiple}"> + <f:then> + <f:form.hidden + class="{model.additionalArguments.class}" + dir="{model.additionalArguments.dir}" + id="{model.additionalArguments.id}" + lang="{model.additionalArguments.lang}" + style="{model.additionalArguments.style}" + title="{model.additionalArguments.title}" + accesskey="{model.additionalArguments.accesskey}" + tabindex="{model.additionalArguments.tabindex}" + onclick="{model.additionalArguments.onclick}" + + name="{model.additionalArguments.prefix}[{model.additionalArguments.name}][]" + value="{optgroupOption.value}" + + additionalAttributes="{model.htmlAttributes}" + /> + </f:then> + <f:else> + <f:form.hidden + class="{model.additionalArguments.class}" + dir="{model.additionalArguments.dir}" + id="{model.additionalArguments.id}" + lang="{model.additionalArguments.lang}" + style="{model.additionalArguments.style}" + title="{model.additionalArguments.title}" + accesskey="{model.additionalArguments.accesskey}" + tabindex="{model.additionalArguments.tabindex}" + onclick="{model.additionalArguments.onclick}" + + name="{model.additionalArguments.prefix}[{model.additionalArguments.name}]" + value="{optgroupOption.value}" + + additionalAttributes="{model.htmlAttributes}" + /> + </f:else> + </f:if> + </f:if> + </f:for> + </f:then> + <f:else> + <f:if condition="{option.selected}"> + <f:if condition="{model.showElement}"> + <li class="csc-form-element csc-form-element-{model.elementTypeLowerCase}"> + {option.label} + </li> + </f:if> + <f:if condition="{model.additionalArguments.multiple}"> + <f:then> <f:form.hidden class="{model.additionalArguments.class}" dir="{model.additionalArguments.dir}" @@ -29,36 +79,30 @@ onclick="{model.additionalArguments.onclick}" name="{model.additionalArguments.prefix}[{model.additionalArguments.name}][]" - value="{optgroupOption.value}" + value="{option.value}" additionalAttributes="{model.htmlAttributes}" /> - </f:if> - </f:for> - </f:then> - <f:else> - <f:if condition="{option.selected} == 'selected'"> - <f:if condition="{model.showElement}"> - <li class="csc-form-element csc-form-element-{model.elementTypeLowerCase}"> - {option.label} - </li> - </f:if> - <f:form.hidden - class="{model.additionalArguments.class}" - dir="{model.additionalArguments.dir}" - id="{model.additionalArguments.id}" - lang="{model.additionalArguments.lang}" - style="{model.additionalArguments.style}" - title="{model.additionalArguments.title}" - accesskey="{model.additionalArguments.accesskey}" - tabindex="{model.additionalArguments.tabindex}" - onclick="{model.additionalArguments.onclick}" + </f:then> + <f:else> + <f:form.hidden + class="{model.additionalArguments.class}" + dir="{model.additionalArguments.dir}" + id="{model.additionalArguments.id}" + lang="{model.additionalArguments.lang}" + style="{model.additionalArguments.style}" + title="{model.additionalArguments.title}" + accesskey="{model.additionalArguments.accesskey}" + tabindex="{model.additionalArguments.tabindex}" + onclick="{model.additionalArguments.onclick}" - name="{model.additionalArguments.prefix}[{model.additionalArguments.name}][]" - value="{option.value}" + name="{model.additionalArguments.prefix}[{model.additionalArguments.name}]" + value="{option.value}" - additionalAttributes="{model.htmlAttributes}" - /> + additionalAttributes="{model.htmlAttributes}" + /> + </f:else> + </f:if> </f:if> </f:else> </f:if> diff --git a/typo3/sysext/form/Resources/Private/Partials/Default/PostProcessor/Mail/Html/FlatElements/Select.html b/typo3/sysext/form/Resources/Private/Partials/Default/PostProcessor/Mail/Html/FlatElements/Select.html index f8e7497b5490..b37519f68de6 100644 --- a/typo3/sysext/form/Resources/Private/Partials/Default/PostProcessor/Mail/Html/FlatElements/Select.html +++ b/typo3/sysext/form/Resources/Private/Partials/Default/PostProcessor/Mail/Html/FlatElements/Select.html @@ -5,18 +5,18 @@ <em>{model.additionalArguments.label}</em> </td> <td> -<f:for each="<form:aggregateSelectOptions model='{model}' />" as="option"> +<f:for each="{form:aggregateSelectOptions(model:model)}" as="option"> <f:if condition="{option.options}"> <f:then> <f:for each="{option.options}" as="optgroupOption"> -<f:if condition="{optgroupOption.selected} == 'selected'"> - <div class="csc-form-element csc-form-element-{model.elementTypeLowerCase}">{optgroupOption.value}</div> +<f:if condition="{optgroupOption.selected}"> + <div class="csc-form-element csc-form-element-{model.elementTypeLowerCase}">{optgroupOption.label}</div> </f:if> </f:for> </f:then> <f:else> -<f:if condition="{option.selected} == 'selected'"> - <div class="csc-form-element csc-form-element-{model.elementTypeLowerCase}">{option.value}</div> +<f:if condition="{option.selected}"> + <div class="csc-form-element csc-form-element-{model.elementTypeLowerCase}">{option.label}</div> </f:if> </f:else> </f:if> diff --git a/typo3/sysext/form/Resources/Private/Partials/Default/PostProcessor/Mail/Plain/FlatElements/Select.html b/typo3/sysext/form/Resources/Private/Partials/Default/PostProcessor/Mail/Plain/FlatElements/Select.html index 1d6cba8b6a6f..122c8666ff20 100644 --- a/typo3/sysext/form/Resources/Private/Partials/Default/PostProcessor/Mail/Plain/FlatElements/Select.html +++ b/typo3/sysext/form/Resources/Private/Partials/Default/PostProcessor/Mail/Plain/FlatElements/Select.html @@ -1,3 +1,3 @@ -{namespace form=TYPO3\CMS\Form\ViewHelpers}<f:if condition="{model.showElement}"><form:plainMail labelContent="{model}" newLineAfterLabel="1" indent="4" /><f:for each="<form:aggregateSelectOptions model='{model}' />" as="option"><f:if condition="{option.options}"><f:then><f:for each="{option.options}" as="optgroupOption"><f:if condition="{optgroupOption.selected} == 'selected'"><form:plainMail content="{optgroupOption.value}" /> -</f:if></f:for></f:then><f:else><f:if condition="{option.selected} == 'selected'"><form:plainMail content="{option.value}" /> +{namespace form=TYPO3\CMS\Form\ViewHelpers}<f:if condition="{model.showElement}"><form:plainMail labelContent="{model}" newLineAfterLabel="1" indent="4" /><f:for each="{form:aggregateSelectOptions(model:model)}" as="option"><f:if condition="{option.options}"><f:then><f:for each="{option.options}" as="optgroupOption"><f:if condition="{optgroupOption.selected}"><form:plainMail content="{optgroupOption.label}" /> +</f:if></f:for></f:then><f:else><f:if condition="{option.selected}"><form:plainMail content="{option.label}" /> </f:if></f:else></f:if></f:for><form:plainMail indent="-4"/></f:if> \ No newline at end of file diff --git a/typo3/sysext/form/Resources/Private/Partials/Default/Show/FlatElements/Select.html b/typo3/sysext/form/Resources/Private/Partials/Default/Show/FlatElements/Select.html index ff3382b509cc..3dd57d004ff2 100644 --- a/typo3/sysext/form/Resources/Private/Partials/Default/Show/FlatElements/Select.html +++ b/typo3/sysext/form/Resources/Private/Partials/Default/Show/FlatElements/Select.html @@ -31,7 +31,7 @@ optionLabelField="label" optionValueField="value" - options='<form:aggregateSelectOptions model="{model}" />' + options="{form:aggregateSelectOptions(model:model)}" prependOptionLabel="{model.additionalArguments.prependOptionLabel}" prependOptionValue="{model.additionalArguments.prependOptionValue}" selectAllByDefault="{model.additionalArguments.selectAllByDefault}" -- GitLab