From 9934c884e0e0c710da2912dd5063dd88a3f3c800 Mon Sep 17 00:00:00 2001 From: Yannick Date: Thu, 10 Apr 2014 00:04:55 +0200 Subject: [PATCH 1/8] [Form] Deprecated option "read_only" --- .../views/Form/form_div_layout.html.twig | 1 - .../views/Form/widget_attributes.html.php | 3 +-- .../Form/Extension/Core/Type/FormType.php | 17 +++++++++++------ .../Component/Form/Tests/AbstractLayoutTest.php | 5 ++--- .../Tests/Extension/Core/Type/FormTypeTest.php | 10 +++++----- 5 files changed, 19 insertions(+), 17 deletions(-) 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 211eee5dd784f..dfa4b1dd1a9f5 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 @@ -374,7 +374,6 @@ {% block widget_attributes %} {% spaceless %} id="{{ id }}" name="{{ full_name }}" - {%- if read_only %} readonly="readonly"{% endif -%} {%- if disabled %} disabled="disabled"{% endif -%} {%- if required %} required="required"{% endif -%} {%- for attrname, attrvalue in attr -%} diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/widget_attributes.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/widget_attributes.html.php index c2260477317e5..480bd2ac12647 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/widget_attributes.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/widget_attributes.html.php @@ -1,5 +1,4 @@ -id="escape($id) ?>" name="escape($full_name) ?>" readonly="readonly" -disabled="disabled" +id="escape($id) ?>" name="escape($full_name) ?>" disabled="disabled" required="required" $v): ?> diff --git a/src/Symfony/Component/Form/Extension/Core/Type/FormType.php b/src/Symfony/Component/Form/Extension/Core/Type/FormType.php index c66c7b3fb9058..f6cb3ca7d44e9 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/FormType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/FormType.php @@ -72,7 +72,8 @@ public function buildView(FormView $view, FormInterface $form, array $options) parent::buildView($view, $form, $options); $name = $form->getName(); - $readOnly = $options['read_only']; + + $readOnly = isset($view->vars['attr']['readonly']) && in_array($view->vars['attr']['readonly'], array('readonly', true)); if ($view->parent) { if ('' === $name) { @@ -80,13 +81,13 @@ public function buildView(FormView $view, FormInterface $form, array $options) } // Complex fields are read-only if they themselves or their parents are. - if (!$readOnly) { - $readOnly = $view->parent->vars['read_only']; + if (!$readOnly && (isset($view->parent->vars['attr']['readonly']) && in_array($view->parent->vars['attr']['readonly'], array('readonly', true)))) { + $view->vars['attr']['readonly'] = 'readonly'; } + } $view->vars = array_replace($view->vars, array( - 'read_only' => $readOnly, 'errors' => $form->getErrors(), 'valid' => $form->isSubmitted() ? $form->isValid() : true, 'value' => $form->getViewData(), @@ -170,7 +171,7 @@ public function setDefaultOptions(OptionsResolverInterface $resolver) 'data', )); - // BC clause for the "max_length" and "pattern" option + // BC clause for the "max_length", "pattern" and "read_only" option // Add these values to the "attr" option instead $defaultAttr = function (Options $options) { $attributes = array(); @@ -183,6 +184,10 @@ public function setDefaultOptions(OptionsResolverInterface $resolver) $attributes['pattern'] = $options['pattern']; } + if (false !== $options['read_only']) { + $attributes['readonly'] = $options['read_only']; + } + return $attributes; }; @@ -191,7 +196,7 @@ public function setDefaultOptions(OptionsResolverInterface $resolver) 'empty_data' => $emptyData, 'trim' => true, 'required' => true, - 'read_only' => false, + 'read_only' => false, //Deprecated use attr['read_only'] instead 'max_length' => null, 'pattern' => null, 'property_path' => null, diff --git a/src/Symfony/Component/Form/Tests/AbstractLayoutTest.php b/src/Symfony/Component/Form/Tests/AbstractLayoutTest.php index 532dc41be75f5..7e726863f87e6 100644 --- a/src/Symfony/Component/Form/Tests/AbstractLayoutTest.php +++ b/src/Symfony/Component/Form/Tests/AbstractLayoutTest.php @@ -1294,7 +1294,7 @@ public function testHidden() public function testReadOnly() { $form = $this->factory->createNamed('name', 'text', null, array( - 'read_only' => true, + 'attr' => array('readonly' => 'readonly'), )); $this->assertWidgetMatchesXpath($form->createView(), array(), @@ -1899,8 +1899,7 @@ public function testWidgetAttributes() $form = $this->factory->createNamed('text', 'text', 'value', array( 'required' => true, 'disabled' => true, - 'read_only' => true, - 'attr' => array('maxlength' => 10, 'pattern' => '\d+', 'class' => 'foobar', 'data-foo' => 'bar'), + 'attr' => array('maxlength' => 10, 'pattern' => '\d+', 'class' => 'foobar', 'data-foo' => 'bar', 'readonly' => true), )); $html = $this->renderWidget($form->createView()); diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php index a8465dc99083a..703c76544da57 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php @@ -102,22 +102,22 @@ public function testSubmittedDataIsNotTrimmedBeforeTransformingIfNoTrimming() public function testNonReadOnlyFormWithReadOnlyParentIsReadOnly() { - $view = $this->factory->createNamedBuilder('parent', 'form', null, array('read_only' => true)) + $view = $this->factory->createNamedBuilder('parent', 'form', null, array('attr' => array('readonly' => 'readonly'))) ->add('child', 'form') ->getForm() ->createView(); - $this->assertTrue($view['child']->vars['read_only']); + $this->assertEquals('readonly', $view['child']->vars['attr']['readonly']); } public function testReadOnlyFormWithNonReadOnlyParentIsReadOnly() { $view = $this->factory->createNamedBuilder('parent', 'form') - ->add('child', 'form', array('read_only' => true)) + ->add('child', 'form', array('attr' => array('readonly' => 'readonly'))) ->getForm() ->createView(); - $this->assertTrue($view['child']->vars['read_only']); + $this->assertEquals('readonly', $view['child']->vars['attr']['readonly']); } public function testNonReadOnlyFormWithNonReadOnlyParentIsNotReadOnly() @@ -127,7 +127,7 @@ public function testNonReadOnlyFormWithNonReadOnlyParentIsNotReadOnly() ->getForm() ->createView(); - $this->assertFalse($view['child']->vars['read_only']); + $this->assertArrayNotHasKey('readonly', $view['child']->vars['attr']); } public function testPassMaxLengthToView() From 48ea2572c16a9dd16ef44a5e6ccb8cb5b1db2a76 Mon Sep 17 00:00:00 2001 From: Yannick Date: Mon, 14 Apr 2014 10:35:35 +0200 Subject: [PATCH 2/8] Fixed spelling mistake --- src/Symfony/Component/Form/Extension/Core/Type/FormType.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/Form/Extension/Core/Type/FormType.php b/src/Symfony/Component/Form/Extension/Core/Type/FormType.php index f6cb3ca7d44e9..57721446e3604 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/FormType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/FormType.php @@ -196,7 +196,7 @@ public function setDefaultOptions(OptionsResolverInterface $resolver) 'empty_data' => $emptyData, 'trim' => true, 'required' => true, - 'read_only' => false, //Deprecated use attr['read_only'] instead + 'read_only' => false, //Deprecated use attr['readonly'] instead 'max_length' => null, 'pattern' => null, 'property_path' => null, From 07c26cff22f7f9799a7155e924c52990d653f5de Mon Sep 17 00:00:00 2001 From: Yannick Snobbert Date: Wed, 16 Jul 2014 14:07:42 +0200 Subject: [PATCH 3/8] Removed an useless if --- src/Symfony/Component/Form/Extension/Core/Type/FormType.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Symfony/Component/Form/Extension/Core/Type/FormType.php b/src/Symfony/Component/Form/Extension/Core/Type/FormType.php index 57721446e3604..56c9fb6965689 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/FormType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/FormType.php @@ -84,7 +84,6 @@ public function buildView(FormView $view, FormInterface $form, array $options) if (!$readOnly && (isset($view->parent->vars['attr']['readonly']) && in_array($view->parent->vars['attr']['readonly'], array('readonly', true)))) { $view->vars['attr']['readonly'] = 'readonly'; } - } $view->vars = array_replace($view->vars, array( @@ -183,10 +182,7 @@ public function setDefaultOptions(OptionsResolverInterface $resolver) if (null !== $options['pattern']) { $attributes['pattern'] = $options['pattern']; } - - if (false !== $options['read_only']) { - $attributes['readonly'] = $options['read_only']; - } + $attributes['readonly'] = $options['read_only']; return $attributes; }; From 6fcb1ec72b70a462732f2a9552db20946a2159a3 Mon Sep 17 00:00:00 2001 From: Yannick Snobbert Date: Sun, 20 Jul 2014 01:00:18 +0200 Subject: [PATCH 4/8] Changed the readonly test according to Tobion suggestion --- src/Symfony/Component/Form/Extension/Core/Type/FormType.php | 4 ++-- .../Component/Form/Tests/Extension/Core/Type/FormTypeTest.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Component/Form/Extension/Core/Type/FormType.php b/src/Symfony/Component/Form/Extension/Core/Type/FormType.php index 56c9fb6965689..a8302f6c721ac 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/FormType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/FormType.php @@ -73,7 +73,7 @@ public function buildView(FormView $view, FormInterface $form, array $options) $name = $form->getName(); - $readOnly = isset($view->vars['attr']['readonly']) && in_array($view->vars['attr']['readonly'], array('readonly', true)); + $readOnly = isset($view->vars['attr']['readonly']) && false !== $view->vars['attr']['readonly']; if ($view->parent) { if ('' === $name) { @@ -81,7 +81,7 @@ public function buildView(FormView $view, FormInterface $form, array $options) } // Complex fields are read-only if they themselves or their parents are. - if (!$readOnly && (isset($view->parent->vars['attr']['readonly']) && in_array($view->parent->vars['attr']['readonly'], array('readonly', true)))) { + if (!$readOnly && (isset($view->parent->vars['attr']['readonly']) && false !== $view->parent->vars['attr']['readonly'])) { $view->vars['attr']['readonly'] = 'readonly'; } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php index 703c76544da57..0463417d0e93d 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php @@ -127,7 +127,7 @@ public function testNonReadOnlyFormWithNonReadOnlyParentIsNotReadOnly() ->getForm() ->createView(); - $this->assertArrayNotHasKey('readonly', $view['child']->vars['attr']); + $this->assertEquals(false, $view['child']->vars['attr']['readonly']); } public function testPassMaxLengthToView() From 00ad6eadf526a10b3ac87d4ce1c8f781f91ea5f9 Mon Sep 17 00:00:00 2001 From: Yannick Snobbert Date: Fri, 22 Aug 2014 01:20:10 +0200 Subject: [PATCH 5/8] Revert the read_only view variable + test refactoring --- src/Symfony/Component/Form/Extension/Core/Type/FormType.php | 1 + .../Form/Tests/Extension/Core/Type/FormTypeTest.php | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Component/Form/Extension/Core/Type/FormType.php b/src/Symfony/Component/Form/Extension/Core/Type/FormType.php index a8302f6c721ac..e2ed66a2d0567 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/FormType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/FormType.php @@ -87,6 +87,7 @@ public function buildView(FormView $view, FormInterface $form, array $options) } $view->vars = array_replace($view->vars, array( + 'read_only' => $readOnly, 'errors' => $form->getErrors(), 'valid' => $form->isSubmitted() ? $form->isValid() : true, 'value' => $form->getViewData(), diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php index 0463417d0e93d..67d7f882d2f73 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php @@ -107,7 +107,7 @@ public function testNonReadOnlyFormWithReadOnlyParentIsReadOnly() ->getForm() ->createView(); - $this->assertEquals('readonly', $view['child']->vars['attr']['readonly']); + $this->assertSame('readonly', $view['child']->vars['attr']['readonly']); } public function testReadOnlyFormWithNonReadOnlyParentIsReadOnly() @@ -117,7 +117,7 @@ public function testReadOnlyFormWithNonReadOnlyParentIsReadOnly() ->getForm() ->createView(); - $this->assertEquals('readonly', $view['child']->vars['attr']['readonly']); + $this->assertSame('readonly', $view['child']->vars['attr']['readonly']); } public function testNonReadOnlyFormWithNonReadOnlyParentIsNotReadOnly() @@ -127,7 +127,7 @@ public function testNonReadOnlyFormWithNonReadOnlyParentIsNotReadOnly() ->getForm() ->createView(); - $this->assertEquals(false, $view['child']->vars['attr']['readonly']); + $this->assertFalse($view['child']->vars['attr']['readonly']); } public function testPassMaxLengthToView() From 45c5e3f072c3dac5b0ccb347d8121c2ceec8ac85 Mon Sep 17 00:00:00 2001 From: Yannick Snobbert Date: Mon, 29 Sep 2014 17:26:11 +0200 Subject: [PATCH 6/8] Fixed typo --- src/Symfony/Component/Form/Extension/Core/Type/FormType.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/Form/Extension/Core/Type/FormType.php b/src/Symfony/Component/Form/Extension/Core/Type/FormType.php index e2ed66a2d0567..a9917bdcc9935 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/FormType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/FormType.php @@ -87,7 +87,7 @@ public function buildView(FormView $view, FormInterface $form, array $options) } $view->vars = array_replace($view->vars, array( - 'read_only' => $readOnly, + 'read_only' => $readOnly, 'errors' => $form->getErrors(), 'valid' => $form->isSubmitted() ? $form->isValid() : true, 'value' => $form->getViewData(), @@ -193,7 +193,7 @@ public function setDefaultOptions(OptionsResolverInterface $resolver) 'empty_data' => $emptyData, 'trim' => true, 'required' => true, - 'read_only' => false, //Deprecated use attr['readonly'] instead + 'read_only' => false, // Deprecated use attr['readonly'] instead 'max_length' => null, 'pattern' => null, 'property_path' => null, From b5924e98aa04dca2f8e3acef031afee3565e9e12 Mon Sep 17 00:00:00 2001 From: Yannick Snobbert Date: Mon, 6 Oct 2014 19:08:05 +0200 Subject: [PATCH 7/8] Applied webmozart advice --- .../views/Form/widget_attributes.html.php | 3 ++- .../Form/Extension/Core/Type/FormType.php | 1 + .../Component/Form/Tests/AbstractLayoutTest.php | 15 +++++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/widget_attributes.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/widget_attributes.html.php index 480bd2ac12647..ff38706573e62 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/widget_attributes.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/widget_attributes.html.php @@ -1,4 +1,5 @@ -id="escape($id) ?>" name="escape($full_name) ?>" disabled="disabled" +id="escape($id) ?>" name="escape($full_name) ?>" +disabled="disabled" required="required" $v): ?> diff --git a/src/Symfony/Component/Form/Extension/Core/Type/FormType.php b/src/Symfony/Component/Form/Extension/Core/Type/FormType.php index a9917bdcc9935..e8d70a33ed741 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/FormType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/FormType.php @@ -83,6 +83,7 @@ public function buildView(FormView $view, FormInterface $form, array $options) // Complex fields are read-only if they themselves or their parents are. if (!$readOnly && (isset($view->parent->vars['attr']['readonly']) && false !== $view->parent->vars['attr']['readonly'])) { $view->vars['attr']['readonly'] = 'readonly'; + $readOnly = true; } } diff --git a/src/Symfony/Component/Form/Tests/AbstractLayoutTest.php b/src/Symfony/Component/Form/Tests/AbstractLayoutTest.php index 7e726863f87e6..901fc50cf9922 100644 --- a/src/Symfony/Component/Form/Tests/AbstractLayoutTest.php +++ b/src/Symfony/Component/Form/Tests/AbstractLayoutTest.php @@ -1291,6 +1291,21 @@ public function testHidden() ); } + public function testReadOnlyBc() + { + $form = $this->factory->createNamed('name', 'text', null, array( + 'read_only' => true, + )); + + $this->assertWidgetMatchesXpath($form->createView(), array(), + '/input + [@type="text"] + [@name="name"] + [@readonly="readonly"] +' + ); + } + public function testReadOnly() { $form = $this->factory->createNamed('name', 'text', null, array( From c7abd9d25b8e05d1699b51bd8d369a9d95786b26 Mon Sep 17 00:00:00 2001 From: Yannick Snobbert Date: Mon, 3 Nov 2014 15:25:06 +0100 Subject: [PATCH 8/8] Applied webmozart feedback --- .../Component/Form/Extension/Core/Type/FormType.php | 9 +++------ src/Symfony/Component/Form/Tests/AbstractLayoutTest.php | 2 +- .../Form/Tests/Extension/Core/Type/FormTypeTest.php | 9 ++++----- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/Symfony/Component/Form/Extension/Core/Type/FormType.php b/src/Symfony/Component/Form/Extension/Core/Type/FormType.php index e8d70a33ed741..bbafc1300213f 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/FormType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/FormType.php @@ -73,22 +73,19 @@ public function buildView(FormView $view, FormInterface $form, array $options) $name = $form->getName(); - $readOnly = isset($view->vars['attr']['readonly']) && false !== $view->vars['attr']['readonly']; - if ($view->parent) { if ('' === $name) { throw new LogicException('Form node with empty name can be used only as root form node.'); } // Complex fields are read-only if they themselves or their parents are. - if (!$readOnly && (isset($view->parent->vars['attr']['readonly']) && false !== $view->parent->vars['attr']['readonly'])) { - $view->vars['attr']['readonly'] = 'readonly'; - $readOnly = true; + if (!$view->vars['attr']['readonly'] && (isset($view->parent->vars['attr']['readonly']) && false !== $view->parent->vars['attr']['readonly'])) { + $view->vars['attr']['readonly'] = true; } } $view->vars = array_replace($view->vars, array( - 'read_only' => $readOnly, + 'read_only' => $view->vars['attr']['readonly'], 'errors' => $form->getErrors(), 'valid' => $form->isSubmitted() ? $form->isValid() : true, 'value' => $form->getViewData(), diff --git a/src/Symfony/Component/Form/Tests/AbstractLayoutTest.php b/src/Symfony/Component/Form/Tests/AbstractLayoutTest.php index 901fc50cf9922..8a9ecb616822c 100644 --- a/src/Symfony/Component/Form/Tests/AbstractLayoutTest.php +++ b/src/Symfony/Component/Form/Tests/AbstractLayoutTest.php @@ -1309,7 +1309,7 @@ public function testReadOnlyBc() public function testReadOnly() { $form = $this->factory->createNamed('name', 'text', null, array( - 'attr' => array('readonly' => 'readonly'), + 'attr' => array('readonly' => true), )); $this->assertWidgetMatchesXpath($form->createView(), array(), diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php index 67d7f882d2f73..7dba5cf73a5d6 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php @@ -12,7 +12,6 @@ namespace Symfony\Component\Form\Tests\Extension\Core\Type; use Symfony\Component\PropertyAccess\PropertyPath; -use Symfony\Component\Form\Form; use Symfony\Component\Form\CallbackTransformer; use Symfony\Component\Form\Tests\Fixtures\Author; use Symfony\Component\Form\Tests\Fixtures\FixedDataTransformer; @@ -102,22 +101,22 @@ public function testSubmittedDataIsNotTrimmedBeforeTransformingIfNoTrimming() public function testNonReadOnlyFormWithReadOnlyParentIsReadOnly() { - $view = $this->factory->createNamedBuilder('parent', 'form', null, array('attr' => array('readonly' => 'readonly'))) + $view = $this->factory->createNamedBuilder('parent', 'form', null, array('attr' => array('readonly' => true))) ->add('child', 'form') ->getForm() ->createView(); - $this->assertSame('readonly', $view['child']->vars['attr']['readonly']); + $this->assertTrue($view['child']->vars['attr']['readonly']); } public function testReadOnlyFormWithNonReadOnlyParentIsReadOnly() { $view = $this->factory->createNamedBuilder('parent', 'form') - ->add('child', 'form', array('attr' => array('readonly' => 'readonly'))) + ->add('child', 'form', array('attr' => array('readonly' => true))) ->getForm() ->createView(); - $this->assertSame('readonly', $view['child']->vars['attr']['readonly']); + $this->assertTrue($view['child']->vars['attr']['readonly']); } public function testNonReadOnlyFormWithNonReadOnlyParentIsNotReadOnly()