From bcda2c2d8ee27d5fc8a802676a0ba4e6467e1d46 Mon Sep 17 00:00:00 2001 From: HeahDude Date: Sun, 5 Mar 2017 19:29:34 +0100 Subject: [PATCH] [Form] Fixed overridden choices option in extended choice types --- .../Form/Extension/Core/Type/CountryType.php | 5 +- .../Form/Extension/Core/Type/CurrencyType.php | 5 +- .../Form/Extension/Core/Type/LanguageType.php | 5 +- .../Form/Extension/Core/Type/LocaleType.php | 5 +- .../Form/Extension/Core/Type/TimezoneType.php | 5 +- .../Core/Type/ExtendedChoiceTypeTest.php | 47 +++++++++++++++++++ .../Tests/Fixtures/ChoiceTypeExtension.php | 45 ++++++++++++++++++ 7 files changed, 112 insertions(+), 5 deletions(-) create mode 100644 src/Symfony/Component/Form/Tests/Extension/Core/Type/ExtendedChoiceTypeTest.php create mode 100644 src/Symfony/Component/Form/Tests/Fixtures/ChoiceTypeExtension.php diff --git a/src/Symfony/Component/Form/Extension/Core/Type/CountryType.php b/src/Symfony/Component/Form/Extension/Core/Type/CountryType.php index a96a42d3d6..6484a4c34f 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/CountryType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/CountryType.php @@ -15,6 +15,7 @@ use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\ChoiceList\ArrayChoiceList; use Symfony\Component\Form\ChoiceList\Loader\ChoiceLoaderInterface; use Symfony\Component\Intl\Intl; +use Symfony\Component\OptionsResolver\Options; use Symfony\Component\OptionsResolver\OptionsResolver; class CountryType extends AbstractType implements ChoiceLoaderInterface @@ -36,7 +37,9 @@ class CountryType extends AbstractType implements ChoiceLoaderInterface public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array( - 'choice_loader' => $this, + 'choice_loader' => function (Options $options) { + return $options['choices'] ? null : $this; + }, 'choice_translation_domain' => false, )); } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/CurrencyType.php b/src/Symfony/Component/Form/Extension/Core/Type/CurrencyType.php index 9970d03ad7..4a8d3c4421 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/CurrencyType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/CurrencyType.php @@ -15,6 +15,7 @@ use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\ChoiceList\ArrayChoiceList; use Symfony\Component\Form\ChoiceList\Loader\ChoiceLoaderInterface; use Symfony\Component\Intl\Intl; +use Symfony\Component\OptionsResolver\Options; use Symfony\Component\OptionsResolver\OptionsResolver; class CurrencyType extends AbstractType implements ChoiceLoaderInterface @@ -36,7 +37,9 @@ class CurrencyType extends AbstractType implements ChoiceLoaderInterface public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array( - 'choice_loader' => $this, + 'choice_loader' => function (Options $options) { + return $options['choices'] ? null : $this; + }, 'choice_translation_domain' => false, )); } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/LanguageType.php b/src/Symfony/Component/Form/Extension/Core/Type/LanguageType.php index 279402a3e2..3e62bdddce 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/LanguageType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/LanguageType.php @@ -15,6 +15,7 @@ use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\ChoiceList\ArrayChoiceList; use Symfony\Component\Form\ChoiceList\Loader\ChoiceLoaderInterface; use Symfony\Component\Intl\Intl; +use Symfony\Component\OptionsResolver\Options; use Symfony\Component\OptionsResolver\OptionsResolver; class LanguageType extends AbstractType implements ChoiceLoaderInterface @@ -36,7 +37,9 @@ class LanguageType extends AbstractType implements ChoiceLoaderInterface public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array( - 'choice_loader' => $this, + 'choice_loader' => function (Options $options) { + return $options['choices'] ? null : $this; + }, 'choice_translation_domain' => false, )); } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/LocaleType.php b/src/Symfony/Component/Form/Extension/Core/Type/LocaleType.php index de795956b7..d5f191c0a2 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/LocaleType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/LocaleType.php @@ -15,6 +15,7 @@ use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\ChoiceList\ArrayChoiceList; use Symfony\Component\Form\ChoiceList\Loader\ChoiceLoaderInterface; use Symfony\Component\Intl\Intl; +use Symfony\Component\OptionsResolver\Options; use Symfony\Component\OptionsResolver\OptionsResolver; class LocaleType extends AbstractType implements ChoiceLoaderInterface @@ -36,7 +37,9 @@ class LocaleType extends AbstractType implements ChoiceLoaderInterface public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array( - 'choice_loader' => $this, + 'choice_loader' => function (Options $options) { + return $options['choices'] ? null : $this; + }, 'choice_translation_domain' => false, )); } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/TimezoneType.php b/src/Symfony/Component/Form/Extension/Core/Type/TimezoneType.php index fbfce90ba5..beb83dde4f 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/TimezoneType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/TimezoneType.php @@ -14,6 +14,7 @@ namespace Symfony\Component\Form\Extension\Core\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\ChoiceList\ArrayChoiceList; use Symfony\Component\Form\ChoiceList\Loader\ChoiceLoaderInterface; +use Symfony\Component\OptionsResolver\Options; use Symfony\Component\OptionsResolver\OptionsResolver; class TimezoneType extends AbstractType implements ChoiceLoaderInterface @@ -33,7 +34,9 @@ class TimezoneType extends AbstractType implements ChoiceLoaderInterface public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array( - 'choice_loader' => $this, + 'choice_loader' => function (Options $options) { + return $options['choices'] ? null : $this; + }, 'choice_translation_domain' => false, )); } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/ExtendedChoiceTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/ExtendedChoiceTypeTest.php new file mode 100644 index 0000000000..6f9b4d128d --- /dev/null +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/ExtendedChoiceTypeTest.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Form\Tests\Extension\Core\Type; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\Form\Forms; +use Symfony\Component\Form\Tests\Fixtures\ChoiceTypeExtension; + +class ExtendedChoiceTypeTest extends TestCase +{ + /** + * @dataProvider provideTestedTypes + */ + public function testChoicesAreOverridden($type) + { + $factory = Forms::createFormFactoryBuilder() + ->addTypeExtension(new ChoiceTypeExtension($type)) + ->getFormFactory() + ; + + $choices = $factory->create($type)->createView()->vars['choices']; + + $this->assertCount(2, $choices); + $this->assertSame('A', $choices[0]->label); + $this->assertSame('a', $choices[0]->value); + $this->assertSame('B', $choices[1]->label); + $this->assertSame('b', $choices[1]->value); + } + + public function provideTestedTypes() + { + yield array(CountryTypeTest::TESTED_TYPE); + yield array(CurrencyTypeTest::TESTED_TYPE); + yield array(LanguageTypeTest::TESTED_TYPE); + yield array(LocaleTypeTest::TESTED_TYPE); + yield array(TimezoneTypeTest::TESTED_TYPE); + } +} diff --git a/src/Symfony/Component/Form/Tests/Fixtures/ChoiceTypeExtension.php b/src/Symfony/Component/Form/Tests/Fixtures/ChoiceTypeExtension.php new file mode 100644 index 0000000000..db4166ff30 --- /dev/null +++ b/src/Symfony/Component/Form/Tests/Fixtures/ChoiceTypeExtension.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Form\Tests\Fixtures; + +use Symfony\Component\Form\AbstractTypeExtension; +use Symfony\Component\Form\Extension\Core\Type\ChoiceType; +use Symfony\Component\OptionsResolver\OptionsResolver; + +class ChoiceTypeExtension extends AbstractTypeExtension +{ + private $extendedType; + + public function __construct($extendedType = ChoiceType::class) + { + $this->extendedType = $extendedType; + } + + /** + * {@inheritdoc} + */ + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefault('choices', array( + 'A' => 'a', + 'B' => 'b', + )); + } + + /** + * {@inheritdoc} + */ + public function getExtendedType() + { + return $this->extendedType; + } +}