diff --git a/src/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php b/src/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php index 2869c2b804c4..07dd87b46179 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php @@ -1521,4 +1521,18 @@ public function testSubmitNullMultipleUsesDefaultEmptyData() $this->assertEquals($collection, $form->getNormData()); $this->assertEquals($collection, $form->getData()); } + + public function testSubmitArray() + { + $entity1 = new SingleIntIdEntity(1, 'Foo'); + $this->persist([$entity1]); + + $form = $this->factory->create(static::TESTED_TYPE, null, [ + 'em' => 'default', + 'class' => self::SINGLE_IDENT_CLASS, + ]); + $form->submit([]); + + $this->assertFalse($form->isSynchronized()); + } } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/CheckboxType.php b/src/Symfony/Component/Form/Extension/Core/Type/CheckboxType.php index 19ff62c154a0..1c8f24c804e7 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/CheckboxType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/CheckboxType.php @@ -59,6 +59,7 @@ public function configureOptions(OptionsResolver $resolver) 'value' => '1', 'empty_data' => $emptyData, 'compound' => false, + 'accept_multiple_values' => false, ]); } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php b/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php index 28320ca38942..5d02cc1f9aa7 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php @@ -328,6 +328,8 @@ public function configureOptions(OptionsResolver $resolver) 'placeholder' => $placeholderDefault, 'error_bubbling' => false, 'compound' => $compound, + // submitted arrays are dealt with in data transformers + 'accept_multiple_values' => true, // The view data is always a string, even if the "data" option // is manually set to an object. // See https://github.com/symfony/symfony/pull/5582 diff --git a/src/Symfony/Component/Form/Extension/Core/Type/ColorType.php b/src/Symfony/Component/Form/Extension/Core/Type/ColorType.php index 9c2734ead6f4..d504666881b3 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/ColorType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/ColorType.php @@ -12,9 +12,18 @@ namespace Symfony\Component\Form\Extension\Core\Type; use Symfony\Component\Form\AbstractType; +use Symfony\Component\OptionsResolver\OptionsResolver; class ColorType extends AbstractType { + /** + * {@inheritdoc} + */ + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefault('accept_multiple_values', false); + } + /** * {@inheritdoc} */ diff --git a/src/Symfony/Component/Form/Extension/Core/Type/DateIntervalType.php b/src/Symfony/Component/Form/Extension/Core/Type/DateIntervalType.php index 181ce74993d6..6ad868107464 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/DateIntervalType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/DateIntervalType.php @@ -233,6 +233,9 @@ public function configureOptions(OptionsResolver $resolver) // this option. 'data_class' => null, 'compound' => $compound, + 'accept_multiple_values' => function (Options $options) { + return $options['compound']; + }, 'empty_data' => $emptyData, 'labels' => [], ] diff --git a/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php b/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php index 04b0221fdc63..016f61646341 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php @@ -235,6 +235,9 @@ public function configureOptions(OptionsResolver $resolver) // this option. 'data_class' => null, 'compound' => $compound, + 'accept_multiple_values' => function (Options $options) { + return $options['compound']; + }, 'empty_data' => function (Options $options) { return $options['compound'] ? [] : ''; }, diff --git a/src/Symfony/Component/Form/Extension/Core/Type/DateType.php b/src/Symfony/Component/Form/Extension/Core/Type/DateType.php index 09f5e1de5c87..41674d2b557c 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/DateType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/DateType.php @@ -276,6 +276,9 @@ public function configureOptions(OptionsResolver $resolver) // this option. 'data_class' => null, 'compound' => $compound, + 'accept_multiple_values' => function (Options $options) { + return $options['compound']; + }, 'empty_data' => function (Options $options) { return $options['compound'] ? [] : ''; }, diff --git a/src/Symfony/Component/Form/Extension/Core/Type/EmailType.php b/src/Symfony/Component/Form/Extension/Core/Type/EmailType.php index 2434778c760c..e430a0214d24 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/EmailType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/EmailType.php @@ -12,9 +12,18 @@ namespace Symfony\Component\Form\Extension\Core\Type; use Symfony\Component\Form\AbstractType; +use Symfony\Component\OptionsResolver\OptionsResolver; class EmailType extends AbstractType { + /** + * {@inheritdoc} + */ + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefault('accept_multiple_values', false); + } + /** * {@inheritdoc} */ diff --git a/src/Symfony/Component/Form/Extension/Core/Type/FileType.php b/src/Symfony/Component/Form/Extension/Core/Type/FileType.php index 59c72889d668..25d0a5ecd099 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/FileType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/FileType.php @@ -105,6 +105,8 @@ public function configureOptions(OptionsResolver $resolver) 'data_class' => $dataClass, 'empty_data' => $emptyData, 'multiple' => false, + // invalid submitted arrays will be detected when the submitted data are processed by the type + 'accept_multiple_values' => true, 'allow_file_upload' => true, ]); } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/FormType.php b/src/Symfony/Component/Form/Extension/Core/Type/FormType.php index 35429b2cb728..e4df3796254b 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/FormType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/FormType.php @@ -179,10 +179,18 @@ public function configureOptions(OptionsResolver $resolver) 'post_max_size_message' => 'The uploaded file was too large. Please try to upload a smaller file.', 'upload_max_size_message' => $uploadMaxSizeMessage, // internal 'allow_file_upload' => false, + 'accept_multiple_values' => function (Options $options) { + if ($options['compound']) { + return true; + } + + return null; + }, ]); $resolver->setAllowedTypes('label_attr', 'array'); $resolver->setAllowedTypes('upload_max_size_message', ['callable']); + $resolver->setAllowedTypes('accept_multiple_values', ['bool', 'null']); } /** diff --git a/src/Symfony/Component/Form/Extension/Core/Type/HiddenType.php b/src/Symfony/Component/Form/Extension/Core/Type/HiddenType.php index dae7f2bd3d91..5703ecfd184b 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/HiddenType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/HiddenType.php @@ -27,6 +27,7 @@ public function configureOptions(OptionsResolver $resolver) // Pass errors to the parent 'error_bubbling' => true, 'compound' => false, + 'accept_multiple_values' => false, ]); } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/IntegerType.php b/src/Symfony/Component/Form/Extension/Core/Type/IntegerType.php index 3e119ed5ce26..34bd3e1e6f86 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/IntegerType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/IntegerType.php @@ -43,6 +43,7 @@ public function configureOptions(OptionsResolver $resolver) // Integer cast rounds towards 0, so do the same when displaying fractions 'rounding_mode' => IntegerToLocalizedStringTransformer::ROUND_DOWN, 'compound' => false, + 'accept_multiple_values' => false, ]); $resolver->setAllowedValues('rounding_mode', [ diff --git a/src/Symfony/Component/Form/Extension/Core/Type/MoneyType.php b/src/Symfony/Component/Form/Extension/Core/Type/MoneyType.php index 45d0b219c827..996d9ecd852d 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/MoneyType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/MoneyType.php @@ -56,6 +56,7 @@ public function configureOptions(OptionsResolver $resolver) 'divisor' => 1, 'currency' => 'EUR', 'compound' => false, + 'accept_multiple_values' => false, ]); $resolver->setAllowedTypes('scale', 'int'); diff --git a/src/Symfony/Component/Form/Extension/Core/Type/NumberType.php b/src/Symfony/Component/Form/Extension/Core/Type/NumberType.php index 1054b5899bd1..f0c3f2ff48b2 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/NumberType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/NumberType.php @@ -41,6 +41,7 @@ public function configureOptions(OptionsResolver $resolver) 'grouping' => false, 'rounding_mode' => NumberToLocalizedStringTransformer::ROUND_HALF_UP, 'compound' => false, + 'accept_multiple_values' => false, ]); $resolver->setAllowedValues('rounding_mode', [ diff --git a/src/Symfony/Component/Form/Extension/Core/Type/PasswordType.php b/src/Symfony/Component/Form/Extension/Core/Type/PasswordType.php index 5a5b2605a422..58fe6fb7eb7c 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/PasswordType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/PasswordType.php @@ -35,6 +35,7 @@ public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ 'always_empty' => true, + 'accept_multiple_values' => false, 'trim' => false, ]); } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/PercentType.php b/src/Symfony/Component/Form/Extension/Core/Type/PercentType.php index dedb9e8cdd1c..7459d0da217d 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/PercentType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/PercentType.php @@ -35,6 +35,7 @@ public function configureOptions(OptionsResolver $resolver) 'scale' => 0, 'type' => 'fractional', 'compound' => false, + 'accept_multiple_values' => false, ]); $resolver->setAllowedValues('type', [ diff --git a/src/Symfony/Component/Form/Extension/Core/Type/RangeType.php b/src/Symfony/Component/Form/Extension/Core/Type/RangeType.php index a69633c54040..12d24a11a685 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/RangeType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/RangeType.php @@ -12,9 +12,18 @@ namespace Symfony\Component\Form\Extension\Core\Type; use Symfony\Component\Form\AbstractType; +use Symfony\Component\OptionsResolver\OptionsResolver; class RangeType extends AbstractType { + /** + * {@inheritdoc} + */ + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefault('accept_multiple_values', false); + } + /** * {@inheritdoc} */ diff --git a/src/Symfony/Component/Form/Extension/Core/Type/SearchType.php b/src/Symfony/Component/Form/Extension/Core/Type/SearchType.php index 4766ad094cd8..c3840e402273 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/SearchType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/SearchType.php @@ -12,9 +12,18 @@ namespace Symfony\Component\Form\Extension\Core\Type; use Symfony\Component\Form\AbstractType; +use Symfony\Component\OptionsResolver\OptionsResolver; class SearchType extends AbstractType { + /** + * {@inheritdoc} + */ + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefault('accept_multiple_values', false); + } + /** * {@inheritdoc} */ diff --git a/src/Symfony/Component/Form/Extension/Core/Type/TelType.php b/src/Symfony/Component/Form/Extension/Core/Type/TelType.php index de74a3ed3721..17f67ef77696 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/TelType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/TelType.php @@ -12,9 +12,18 @@ namespace Symfony\Component\Form\Extension\Core\Type; use Symfony\Component\Form\AbstractType; +use Symfony\Component\OptionsResolver\OptionsResolver; class TelType extends AbstractType { + /** + * {@inheritdoc} + */ + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefault('accept_multiple_values', false); + } + /** * {@inheritdoc} */ diff --git a/src/Symfony/Component/Form/Extension/Core/Type/TextType.php b/src/Symfony/Component/Form/Extension/Core/Type/TextType.php index 9b3c59db85bb..766e1265bc83 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/TextType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/TextType.php @@ -37,6 +37,7 @@ public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ 'compound' => false, + 'accept_multiple_values' => false, ]); } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/TextareaType.php b/src/Symfony/Component/Form/Extension/Core/Type/TextareaType.php index e4127f932cfc..4b1a590b66e5 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/TextareaType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/TextareaType.php @@ -14,6 +14,7 @@ use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormView; +use Symfony\Component\OptionsResolver\OptionsResolver; class TextareaType extends AbstractType { @@ -25,6 +26,14 @@ public function buildView(FormView $view, FormInterface $form, array $options) $view->vars['pattern'] = null; } + /** + * {@inheritdoc} + */ + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefault('accept_multiple_values', false); + } + /** * {@inheritdoc} */ diff --git a/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php b/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php index c88bea812bda..b907206c8800 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php @@ -273,6 +273,9 @@ public function configureOptions(OptionsResolver $resolver) return $options['compound'] ? [] : ''; }, 'compound' => $compound, + 'accept_multiple_values' => function (Options $options) { + return $options['compound']; + }, 'choice_translation_domain' => false, ]); diff --git a/src/Symfony/Component/Form/Extension/Core/Type/UrlType.php b/src/Symfony/Component/Form/Extension/Core/Type/UrlType.php index 17460688b7fd..6f33eedb874b 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/UrlType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/UrlType.php @@ -34,6 +34,7 @@ public function buildForm(FormBuilderInterface $builder, array $options) public function configureOptions(OptionsResolver $resolver) { $resolver->setDefault('default_protocol', 'http'); + $resolver->setDefault('accept_multiple_values', false); $resolver->setAllowedTypes('default_protocol', ['null', 'string']); } diff --git a/src/Symfony/Component/Form/Form.php b/src/Symfony/Component/Form/Form.php index 1ab5d146efd6..937e5d7a0f57 100644 --- a/src/Symfony/Component/Form/Form.php +++ b/src/Symfony/Component/Form/Form.php @@ -535,7 +535,7 @@ public function submit($submittedData, $clearMissing = true) } elseif (!$this->config->getOption('allow_file_upload') && $this->config->getRequestHandler()->isFileUpload($submittedData)) { $submittedData = null; $this->transformationFailure = new TransformationFailedException('Submitted data was expected to be text or number, file upload given.'); - } elseif (\is_array($submittedData) && !$this->config->getCompound() && !$this->config->hasOption('multiple')) { + } elseif (\is_array($submittedData) && !$this->config->getCompound() && false === $this->config->getOption('accept_multiple_values', null)) { $submittedData = null; $this->transformationFailure = new TransformationFailedException('Submitted data was expected to be text or number, array given.'); } diff --git a/src/Symfony/Component/Form/Tests/CompoundFormTest.php b/src/Symfony/Component/Form/Tests/CompoundFormTest.php index 85c7431bcf70..de489d49036b 100644 --- a/src/Symfony/Component/Form/Tests/CompoundFormTest.php +++ b/src/Symfony/Component/Form/Tests/CompoundFormTest.php @@ -1036,20 +1036,50 @@ public function testDisabledButtonIsNotSubmitted() $this->assertFalse($submit->isSubmitted()); } - public function testArrayTransformationFailureOnSubmit() + public function testArrayTransformationFailureOnSubmitWhenMultipleValuesNotAccepted() { - $this->form->add($this->getBuilder('foo')->setCompound(false)->getForm()); - $this->form->add($this->getBuilder('bar', null, null, ['multiple' => false])->setCompound(false)->getForm()); - + $this->form->add($this->getBuilder('foo', null, null, ['accept_multiple_values' => false])->getForm()); $this->form->submit([ - 'foo' => ['foo'], - 'bar' => ['bar'], + 'foo' => [ + 'foo', + 'bar' => [ + 'baz' => 'baz', + ], + ], ]); $this->assertNull($this->form->get('foo')->getData()); $this->assertSame('Submitted data was expected to be text or number, array given.', $this->form->get('foo')->getTransformationFailure()->getMessage()); + } + + public function testArrayDataIsAllowedWhenFormIsCompound() + { + $this->form->add($this->getBuilder('foo', null, null, ['compound' => true])->getForm()); + $this->form->submit([ + 'foo' => [ + 'foo', + 'bar' => [ + 'baz' => 'baz', + ], + ], + ]); + + $this->assertSame(['foo', 'bar' => ['baz' => 'baz']], $this->form->get('foo')->getData()); + } + + public function testArrayDataIsAllowedWhenNotExplicitlyForbidden() + { + $this->form->add($this->getBuilder('foo')->getForm()); + $this->form->submit([ + 'foo' => [ + 'foo', + 'bar' => [ + 'baz' => 'baz', + ], + ], + ]); - $this->assertSame(['bar'], $this->form->get('bar')->getData()); + $this->assertSame(['foo', 'bar' => ['baz' => 'baz']], $this->form->get('foo')->getData()); } public function testFileUpload() diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/BaseTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/BaseTypeTest.php index 92eff38669ff..b72599011bb8 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/BaseTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/BaseTypeTest.php @@ -167,6 +167,14 @@ public function testSubmitNullUsesDefaultEmptyData($emptyData = 'empty', $expect $this->assertSame($expectedData, $form->getData()); } + public function testSubmitArray() + { + $form = $this->factory->create($this->getTestedType()); + $form->submit([]); + + $this->assertSame($form->getConfig()->getOption('accept_multiple_values'), $form->isSynchronized()); + } + protected function getTestedType() { return static::TESTED_TYPE; diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/ButtonTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/ButtonTypeTest.php index 350602306f64..2c26e4a188fa 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/ButtonTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/ButtonTypeTest.php @@ -34,4 +34,9 @@ public function testSubmitNullUsesDefaultEmptyData($emptyData = 'empty', $expect { parent::testSubmitNullUsesDefaultEmptyData($emptyData, $expectedData); } + + public function testSubmitArray() + { + $this->markTestSkipped(); + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/CheckboxTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/CheckboxTypeTest.php index fb2d571884ad..fca6e9516b0a 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/CheckboxTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/CheckboxTypeTest.php @@ -190,4 +190,9 @@ public function testSubmitNullUsesDefaultEmptyData($emptyData = 'empty', $expect $this->assertSame($expectedData, $form->getNormData()); $this->assertSame($expectedData, $form->getData()); } + + protected function supportsMultipleValues() + { + return false; + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypeTest.php index 4a7f006f6f2e..7e4dffc42401 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypeTest.php @@ -2053,4 +2053,12 @@ public function provideTrimCases() 'Multiple expanded' => [true, true], ]; } + + public function testSubmitArray() + { + $form = $this->factory->create($this->getTestedType()); + $form->submit([]); + + $this->assertFalse($form->isSynchronized()); + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/CountryTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/CountryTypeTest.php index 96fce79f21d3..7b431d29586d 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/CountryTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/CountryTypeTest.php @@ -69,4 +69,12 @@ public function testInvalidChoiceValuesAreDropped() $this->assertSame([], $type->loadChoicesForValues(['foo'])); } + + public function testSubmitArray() + { + $form = $this->factory->create($this->getTestedType()); + $form->submit([]); + + $this->assertFalse($form->isSynchronized()); + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/CurrencyTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/CurrencyTypeTest.php index ae8c960cc150..bfb596693c70 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/CurrencyTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/CurrencyTypeTest.php @@ -52,4 +52,12 @@ public function testInvalidChoiceValuesAreDropped() $this->assertSame([], $type->loadChoicesForValues(['foo'])); } + + public function testSubmitArray() + { + $form = $this->factory->create($this->getTestedType()); + $form->submit([]); + + $this->assertFalse($form->isSynchronized()); + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/IntegerTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/IntegerTypeTest.php index 273402aefeb3..ea47f288bbe1 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/IntegerTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/IntegerTypeTest.php @@ -50,4 +50,9 @@ public function testSubmitNullUsesDefaultEmptyData($emptyData = '10', $expectedD $this->assertSame($expectedData, $form->getNormData()); $this->assertSame($expectedData, $form->getData()); } + + protected function supportsMultipleValues() + { + return false; + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/LanguageTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/LanguageTypeTest.php index 60614a97177f..b4bcf6bc3f64 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/LanguageTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/LanguageTypeTest.php @@ -62,4 +62,12 @@ public function testInvalidChoiceValuesAreDropped() $this->assertSame([], $type->loadChoicesForValues(['foo'])); } + + public function testSubmitArray() + { + $form = $this->factory->create($this->getTestedType()); + $form->submit([]); + + $this->assertFalse($form->isSynchronized()); + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/LocaleTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/LocaleTypeTest.php index e5b3ec9d2ab1..b17364c67b33 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/LocaleTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/LocaleTypeTest.php @@ -52,4 +52,12 @@ public function testInvalidChoiceValuesAreDropped() $this->assertSame([], $type->loadChoicesForValues(['foo'])); } + + public function testSubmitArray() + { + $form = $this->factory->create($this->getTestedType()); + $form->submit([]); + + $this->assertFalse($form->isSynchronized()); + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/MoneyTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/MoneyTypeTest.php index f75ea9024905..7602c311493f 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/MoneyTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/MoneyTypeTest.php @@ -82,4 +82,9 @@ public function testSubmitNullUsesDefaultEmptyData($emptyData = '10.00', $expect $this->assertSame($expectedData, $form->getNormData()); $this->assertSame($expectedData, $form->getData()); } + + protected function supportsMultipleValues() + { + return false; + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/NumberTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/NumberTypeTest.php index c19c82b11769..978aab95b031 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/NumberTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/NumberTypeTest.php @@ -75,4 +75,9 @@ public function testSubmitNullUsesDefaultEmptyData($emptyData = '10', $expectedD $this->assertSame($expectedData, $form->getNormData()); $this->assertSame($expectedData, $form->getData()); } + + protected function supportsMultipleValues() + { + return false; + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/PasswordTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/PasswordTypeTest.php index 872311b91df0..7aab3b2620ae 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/PasswordTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/PasswordTypeTest.php @@ -51,4 +51,9 @@ public function testSubmitNull($expected = null, $norm = null, $view = null) { parent::testSubmitNull($expected, $norm, ''); } + + protected function supportsMultipleValues() + { + return false; + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/SubmitTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/SubmitTypeTest.php index e86704bcfb2a..84eb1c54ede6 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/SubmitTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/SubmitTypeTest.php @@ -62,4 +62,9 @@ public function testSubmitCanBeAddedToForm() $this->assertSame($form, $form->add('send', static::TESTED_TYPE)); } + + public function testSubmitArray() + { + $this->markTestSkipped(); + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/TextTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/TextTypeTest.php index 42853f607f6b..d160bfd5f5e1 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/TextTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/TextTypeTest.php @@ -58,4 +58,9 @@ public function testSetDataThroughParamsWithZero($data, $dataAsString) $this->assertSame($dataAsString, $view->vars['value']); $this->assertSame($dataAsString, $form->getData()); } + + protected function supportsMultipleValues() + { + return false; + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimezoneTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimezoneTypeTest.php index 672dd1dc0fed..48b8e687dedd 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimezoneTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimezoneTypeTest.php @@ -72,4 +72,12 @@ public function testFilterByRegions() $this->assertContains(new ChoiceView('Europe/Amsterdam', 'Europe/Amsterdam', 'Amsterdam'), $choices, '', false, false); } + + public function testSubmitArray() + { + $form = $this->factory->create($this->getTestedType()); + $form->submit([]); + + $this->assertFalse($form->isSynchronized()); + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/UrlTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/UrlTypeTest.php index a5608557dd1d..e0c82d1cda0e 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/UrlTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/UrlTypeTest.php @@ -95,4 +95,9 @@ public function testSubmitNullUsesDefaultEmptyData($emptyData = 'empty', $expect $this->assertSame($expectedData, $form->getNormData()); $this->assertSame($expectedData, $form->getData()); } + + protected function supportsMultipleValues() + { + return false; + } } diff --git a/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_1.json b/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_1.json index e9c1a0f4963e..69a5ee7c666e 100644 --- a/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_1.json +++ b/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_1.json @@ -19,6 +19,7 @@ ], "overridden": { "Symfony\\Component\\Form\\Extension\\Core\\Type\\FormType": [ + "accept_multiple_values", "compound", "data_class", "empty_data", diff --git a/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_1.txt b/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_1.txt index 92759b1b0b46..beb3fec52302 100644 --- a/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_1.txt +++ b/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_1.txt @@ -2,31 +2,31 @@ Symfony\Component\Form\Extension\Core\Type\ChoiceType (Block prefix: "choice") ============================================================================== - --------------------------- -------------------- ------------------------- ----------------------- - Options Overridden options Parent options Extension options - --------------------------- -------------------- ------------------------- ----------------------- - choice_attr FormType FormType FormTypeCsrfExtension - choice_label -------------------- ------------------------- ----------------------- - choice_loader compound action csrf_field_name - choice_name data_class allow_file_upload csrf_message - choice_translation_domain empty_data attr csrf_protection - choice_value error_bubbling auto_initialize csrf_token_id - choices trim block_name csrf_token_manager - choices_as_values by_reference - expanded data - group_by disabled - multiple inherit_data - placeholder label - preferred_choices label_attr - label_format - mapped - method - post_max_size_message - property_path - required - translation_domain - upload_max_size_message - --------------------------- -------------------- ------------------------- ----------------------- + --------------------------- ------------------------ ------------------------- ----------------------- + Options Overridden options Parent options Extension options + --------------------------- ------------------------ ------------------------- ----------------------- + choice_attr FormType FormType FormTypeCsrfExtension + choice_label ------------------------ ------------------------- ----------------------- + choice_loader accept_multiple_values action csrf_field_name + choice_name compound allow_file_upload csrf_message + choice_translation_domain data_class attr csrf_protection + choice_value empty_data auto_initialize csrf_token_id + choices error_bubbling block_name csrf_token_manager + choices_as_values trim by_reference + expanded data + group_by disabled + multiple inherit_data + placeholder label + preferred_choices label_attr + label_format + mapped + method + post_max_size_message + property_path + required + translation_domain + upload_max_size_message + --------------------------- ------------------------ ------------------------- ----------------------- Parent types ------------ diff --git a/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_2.json b/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_2.json index 6c18e7169f39..c2ab932527ad 100644 --- a/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_2.json +++ b/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_2.json @@ -3,6 +3,7 @@ "block_prefix": "form", "options": { "own": [ + "accept_multiple_values", "action", "allow_file_upload", "attr", diff --git a/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_2.txt b/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_2.txt index 24dfb07e074d..9033d6b45905 100644 --- a/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_2.txt +++ b/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_2.txt @@ -5,6 +5,7 @@ Symfony\Component\Form\Extension\Core\Type\FormType (Block prefix: "form") ------------------------- Options ------------------------- + accept_multiple_values action allow_file_upload attr