diff --git a/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig b/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig
index 02628b5a14446..d43b40a0764e2 100644
--- a/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig
+++ b/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig
@@ -85,7 +85,7 @@
{{- block('choice_widget_options') -}}
{%- else -%}
-
+
{%- endif -%}
{% endfor %}
{%- endblock choice_widget_options -%}
diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/AbstractDivLayoutTestCase.php b/src/Symfony/Bridge/Twig/Tests/Extension/AbstractDivLayoutTestCase.php
index a02fca4bc54ca..bfbd458e97b3f 100644
--- a/src/Symfony/Bridge/Twig/Tests/Extension/AbstractDivLayoutTestCase.php
+++ b/src/Symfony/Bridge/Twig/Tests/Extension/AbstractDivLayoutTestCase.php
@@ -856,6 +856,56 @@ public function testMultipleChoiceExpandedWithLabelsSetFalseByCallable()
);
}
+ public function testSingleChoiceWithoutDuplicatePreferredIsSelected()
+ {
+ $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', '&d', [
+ 'choices' => ['Choice&A' => '&a', 'Choice&B' => '&b', 'Choice&C' => '&c', 'Choice&D' => '&d'],
+ 'preferred_choices' => ['&b', '&d'],
+ 'duplicate_preferred_choices' => false,
+ 'multiple' => false,
+ 'expanded' => false,
+ ]);
+
+ $this->assertWidgetMatchesXpath($form->createView(), ['separator' => '-- sep --'],
+ '/select
+ [@name="name"]
+ [
+ ./option[@value="&d"][@selected="selected"]
+ /following-sibling::option[@disabled="disabled"][.="-- sep --"]
+ /following-sibling::option[@value="&a"][not(@selected)]
+ /following-sibling::option[@value="&c"][not(@selected)]
+ ]
+ [count(./option)=5]
+'
+ );
+ }
+
+ public function testSingleChoiceWithoutDuplicateNotPreferredIsSelected()
+ {
+ $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', '&d', [
+ 'choices' => ['Choice&A' => '&a', 'Choice&B' => '&b', 'Choice&C' => '&c', 'Choice&D' => '&d'],
+ 'preferred_choices' => ['&b', '&d'],
+ 'duplicate_preferred_choices' => true,
+ 'multiple' => false,
+ 'expanded' => false,
+ ]);
+
+ $this->assertWidgetMatchesXpath($form->createView(), ['separator' => '-- sep --'],
+ '/select
+ [@name="name"]
+ [
+ ./option[@value="&d"][not(@selected)]
+ /following-sibling::option[@disabled="disabled"][.="-- sep --"]
+ /following-sibling::option[@value="&a"][not(@selected)]
+ /following-sibling::option[@value="&b"][not(@selected)]
+ /following-sibling::option[@value="&c"][not(@selected)]
+ /following-sibling::option[@value="&d"][@selected="selected"]
+ ]
+ [count(./option)=7]
+'
+ );
+ }
+
public function testFormEndWithRest()
{
$view = $this->factory->createNamedBuilder('name', 'Symfony\Component\Form\Extension\Core\Type\FormType')
diff --git a/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php b/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php
index 35dcf1b1b9659..32bc67766732b 100644
--- a/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php
+++ b/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php
@@ -281,6 +281,8 @@ public function buildView(FormView $view, FormInterface $form, array $options)
*/
public function finishView(FormView $view, FormInterface $form, array $options)
{
+ $view->vars['duplicate_preferred_choices'] = $options['duplicate_preferred_choices'];
+
if ($options['expanded']) {
// Radio buttons should have the same name as the parent
$childName = $view->vars['full_name'];