diff --git a/src/Symfony/Component/Form/CHANGELOG.md b/src/Symfony/Component/Form/CHANGELOG.md index 3b1fabfd17afd..5586091df0543 100644 --- a/src/Symfony/Component/Form/CHANGELOG.md +++ b/src/Symfony/Component/Form/CHANGELOG.md @@ -9,6 +9,7 @@ CHANGELOG * Add `LazyChoiceLoader` and `choice_lazy` option in `ChoiceType` for loading and rendering choices on demand * Use `form.post_set_data` instead of `form.pre_set_data` in `ResizeFormListener` * Change the priority of `DataCollectorListener` from 255 to -255 + * `BirthdayType` will now have default `attr` values when in `widget` option is set to `single_text` 7.1 --- diff --git a/src/Symfony/Component/Form/Extension/Core/Type/BirthdayType.php b/src/Symfony/Component/Form/Extension/Core/Type/BirthdayType.php index 651b880d86c77..c2c595a3281d1 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/BirthdayType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/BirthdayType.php @@ -12,6 +12,8 @@ namespace Symfony\Component\Form\Extension\Core\Type; use Symfony\Component\Form\AbstractType; +use Symfony\Component\Form\FormInterface; +use Symfony\Component\Form\FormView; use Symfony\Component\OptionsResolver\OptionsResolver; class BirthdayType extends AbstractType @@ -35,4 +37,12 @@ public function getBlockPrefix(): string { return 'birthday'; } + + public function buildView(FormView $view, FormInterface $form, array $options): void + { + $currentMonth = date('m'); + $currentDay = date('d'); + $view->vars['attr']['min'] ??= sprintf('%d-%s-%s', reset($options['years']), $currentMonth, $currentDay); + $view->vars['attr']['max'] ??= sprintf('%d-%s-%s', end($options['years']), $currentMonth, $currentDay); + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/BirthdayTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/BirthdayTypeTest.php index 53e5c959cee95..8cf2d0d3c6415 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/BirthdayTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/BirthdayTypeTest.php @@ -29,4 +29,35 @@ public function testSetInvalidYearsOption() 'widget' => 'choice', ]); } + + public function testWidgetSingleTextHasDefaultAttrMinMax() + { + $currentMonth = date('m'); + $currentDay = date('d'); + $form = $this->factory->create(static::TESTED_TYPE, null, [ + 'widget' => 'single_text', + ]); + $formView = $form->createView(); + $options = $form->getConfig()->getOptions(); + $expectedMin = sprintf('%d-%s-%s', reset($options['years']), $currentMonth, $currentDay); + $expectedMax = sprintf('%d-%s-%s', end($options['years']), $currentMonth, $currentDay); + $this->assertEquals($expectedMin, $formView->vars['attr']['min']); + $this->assertEquals($expectedMax, $formView->vars['attr']['max']); + } + + public function testWidgetSingleTextDoesntRemoveUserAttr() + { + $expectedMin = date('Y-m-d', strtotime('10 years ago')); + $expectedMax = date('Y-m-d', strtotime('1 years ago')); + $form = $this->factory->create(static::TESTED_TYPE, null, [ + 'widget' => 'single_text', + 'attr' => [ + 'min' => $expectedMin, + 'max' => $expectedMax + ] + ]); + $formView = $form->createView(); + $this->assertEquals($expectedMin, $formView->vars['attr']['min']); + $this->assertEquals($expectedMax, $formView->vars['attr']['max']); + } }