From 4939f0e32304329207e4248de35406bfc0c23c61 Mon Sep 17 00:00:00 2001 From: Yonel Ceruto Date: Fri, 25 Oct 2019 19:00:46 -0400 Subject: [PATCH] Fix handling of empty_data's \Closure value in Date/Time form types --- .../Form/Extension/Core/Type/DateTimeType.php | 16 ++++++++-- .../Form/Extension/Core/Type/DateType.php | 30 ++++++++++++++----- .../Form/Extension/Core/Type/TimeType.php | 20 +++++++++++-- .../Extension/Core/Type/DateTimeTypeTest.php | 10 +++++++ .../Extension/Core/Type/DateTypeTest.php | 10 +++++++ .../Extension/Core/Type/TimeTypeTest.php | 10 +++++++ 6 files changed, 83 insertions(+), 13 deletions(-) diff --git a/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php b/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php index 04b0221fdc632..6edefd622e477 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php @@ -107,7 +107,17 @@ public function buildForm(FormBuilderInterface $builder, array $options) 'invalid_message_parameters', ])); - if (isset($emptyData['date'])) { + if ($emptyData instanceof \Closure) { + $lazyEmptyData = static function ($option) use ($emptyData) { + return static function (FormInterface $form) use ($emptyData, $option) { + $emptyData = $emptyData($form->getParent()); + + return isset($emptyData[$option]) ? $emptyData[$option] : ''; + }; + }; + + $dateOptions['empty_data'] = $lazyEmptyData('date'); + } elseif (isset($emptyData['date'])) { $dateOptions['empty_data'] = $emptyData['date']; } @@ -126,7 +136,9 @@ public function buildForm(FormBuilderInterface $builder, array $options) 'invalid_message_parameters', ])); - if (isset($emptyData['time'])) { + if ($emptyData instanceof \Closure) { + $timeOptions['empty_data'] = $lazyEmptyData('time'); + } elseif (isset($emptyData['time'])) { $timeOptions['empty_data'] = $emptyData['time']; } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/DateType.php b/src/Symfony/Component/Form/Extension/Core/Type/DateType.php index 464c262c13680..5aea4418b200d 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/DateType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/DateType.php @@ -81,14 +81,28 @@ public function buildForm(FormBuilderInterface $builder, array $options) // so we need to handle the cascade setting here $emptyData = $builder->getEmptyData() ?: []; - if (isset($emptyData['year'])) { - $yearOptions['empty_data'] = $emptyData['year']; - } - if (isset($emptyData['month'])) { - $monthOptions['empty_data'] = $emptyData['month']; - } - if (isset($emptyData['day'])) { - $dayOptions['empty_data'] = $emptyData['day']; + if ($emptyData instanceof \Closure) { + $lazyEmptyData = static function ($option) use ($emptyData) { + return static function (FormInterface $form) use ($emptyData, $option) { + $emptyData = $emptyData($form->getParent()); + + return isset($emptyData[$option]) ? $emptyData[$option] : ''; + }; + }; + + $yearOptions['empty_data'] = $lazyEmptyData('year'); + $monthOptions['empty_data'] = $lazyEmptyData('month'); + $dayOptions['empty_data'] = $lazyEmptyData('day'); + } else { + if (isset($emptyData['year'])) { + $yearOptions['empty_data'] = $emptyData['year']; + } + if (isset($emptyData['month'])) { + $monthOptions['empty_data'] = $emptyData['month']; + } + if (isset($emptyData['day'])) { + $dayOptions['empty_data'] = $emptyData['day']; + } } if (isset($options['invalid_message'])) { diff --git a/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php b/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php index c88bea812bdab..f0b5ac2ac4df8 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php @@ -76,7 +76,17 @@ public function buildForm(FormBuilderInterface $builder, array $options) // so we need to handle the cascade setting here $emptyData = $builder->getEmptyData() ?: []; - if (isset($emptyData['hour'])) { + if ($emptyData instanceof \Closure) { + $lazyEmptyData = static function ($option) use ($emptyData) { + return static function (FormInterface $form) use ($emptyData, $option) { + $emptyData = $emptyData($form->getParent()); + + return isset($emptyData[$option]) ? $emptyData[$option] : ''; + }; + }; + + $hourOptions['empty_data'] = $lazyEmptyData('hour'); + } elseif (isset($emptyData['hour'])) { $hourOptions['empty_data'] = $emptyData['hour']; } @@ -143,14 +153,18 @@ public function buildForm(FormBuilderInterface $builder, array $options) $builder->add('hour', self::$widgets[$options['widget']], $hourOptions); if ($options['with_minutes']) { - if (isset($emptyData['minute'])) { + if ($emptyData instanceof \Closure) { + $minuteOptions['empty_data'] = $lazyEmptyData('minute'); + } elseif (isset($emptyData['minute'])) { $minuteOptions['empty_data'] = $emptyData['minute']; } $builder->add('minute', self::$widgets[$options['widget']], $minuteOptions); } if ($options['with_seconds']) { - if (isset($emptyData['second'])) { + if ($emptyData instanceof \Closure) { + $secondOptions['empty_data'] = $lazyEmptyData('second'); + } elseif (isset($emptyData['second'])) { $secondOptions['empty_data'] = $emptyData['second']; } $builder->add('second', self::$widgets[$options['widget']], $secondOptions); diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php index e3f3b729d3ec7..8af524f1fceae 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Form\Tests\Extension\Core\Type; use Symfony\Component\Form\FormError; +use Symfony\Component\Form\FormInterface; class DateTimeTypeTest extends BaseTypeTest { @@ -608,6 +609,9 @@ public function testSubmitNullUsesDateEmptyData($widget, $emptyData, $expectedDa ]); $form->submit(null); + if ($emptyData instanceof \Closure) { + $emptyData = $emptyData($form); + } $this->assertSame($emptyData, $form->getViewData()); $this->assertEquals($expectedData, $form->getNormData()); $this->assertEquals($expectedData, $form->getData()); @@ -616,11 +620,17 @@ public function testSubmitNullUsesDateEmptyData($widget, $emptyData, $expectedDa public function provideEmptyData() { $expectedData = \DateTime::createFromFormat('Y-m-d H:i', '2018-11-11 21:23'); + $lazyEmptyData = static function (FormInterface $form) { + return $form->getConfig()->getCompound() ? ['date' => ['year' => '2018', 'month' => '11', 'day' => '11'], 'time' => ['hour' => '21', 'minute' => '23']] : '2018-11-11T21:23:00'; + }; return [ 'Simple field' => ['single_text', '2018-11-11T21:23:00', $expectedData], 'Compound text field' => ['text', ['date' => ['year' => '2018', 'month' => '11', 'day' => '11'], 'time' => ['hour' => '21', 'minute' => '23']], $expectedData], 'Compound choice field' => ['choice', ['date' => ['year' => '2018', 'month' => '11', 'day' => '11'], 'time' => ['hour' => '21', 'minute' => '23']], $expectedData], + 'Simple field lazy' => ['single_text', $lazyEmptyData, $expectedData], + 'Compound text field lazy' => ['text', $lazyEmptyData, $expectedData], + 'Compound choice field lazy' => ['choice', $lazyEmptyData, $expectedData], ]; } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php index 96c74fe0e4209..cb2c2d0a30bdc 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php @@ -13,6 +13,7 @@ use Symfony\Component\Form\ChoiceList\View\ChoiceView; use Symfony\Component\Form\FormError; +use Symfony\Component\Form\FormInterface; use Symfony\Component\Intl\Util\IntlTestHelper; class DateTypeTest extends BaseTypeTest @@ -985,6 +986,9 @@ public function testSubmitNullUsesDateEmptyData($widget, $emptyData, $expectedDa ]); $form->submit(null); + if ($emptyData instanceof \Closure) { + $emptyData = $emptyData($form); + } $this->assertSame($emptyData, $form->getViewData()); $this->assertEquals($expectedData, $form->getNormData()); $this->assertEquals($expectedData, $form->getData()); @@ -993,11 +997,17 @@ public function testSubmitNullUsesDateEmptyData($widget, $emptyData, $expectedDa public function provideEmptyData() { $expectedData = \DateTime::createFromFormat('Y-m-d H:i:s', '2018-11-11 00:00:00'); + $lazyEmptyData = static function (FormInterface $form) { + return $form->getConfig()->getCompound() ? ['year' => '2018', 'month' => '11', 'day' => '11'] : '2018-11-11'; + }; return [ 'Simple field' => ['single_text', '2018-11-11', $expectedData], 'Compound text fields' => ['text', ['year' => '2018', 'month' => '11', 'day' => '11'], $expectedData], 'Compound choice fields' => ['choice', ['year' => '2018', 'month' => '11', 'day' => '11'], $expectedData], + 'Simple field lazy' => ['single_text', $lazyEmptyData, $expectedData], + 'Compound text fields lazy' => ['text', $lazyEmptyData, $expectedData], + 'Compound choice fields lazy' => ['choice', $lazyEmptyData, $expectedData], ]; } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php index e89dd8d20c9e1..1f0797f000db4 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php @@ -13,6 +13,7 @@ use Symfony\Component\Form\ChoiceList\View\ChoiceView; use Symfony\Component\Form\FormError; +use Symfony\Component\Form\FormInterface; class TimeTypeTest extends BaseTypeTest { @@ -785,6 +786,9 @@ public function testSubmitNullUsesDateEmptyData($widget, $emptyData, $expectedDa ]); $form->submit(null); + if ($emptyData instanceof \Closure) { + $emptyData = $emptyData($form); + } $this->assertSame($emptyData, $form->getViewData()); $this->assertEquals($expectedData, $form->getNormData()); $this->assertEquals($expectedData, $form->getData()); @@ -793,11 +797,17 @@ public function testSubmitNullUsesDateEmptyData($widget, $emptyData, $expectedDa public function provideEmptyData() { $expectedData = \DateTime::createFromFormat('Y-m-d H:i', '1970-01-01 21:23'); + $lazyEmptyData = static function (FormInterface $form) { + return $form->getConfig()->getCompound() ? ['hour' => '21', 'minute' => '23'] : '21:23'; + }; return [ 'Simple field' => ['single_text', '21:23', $expectedData], 'Compound text field' => ['text', ['hour' => '21', 'minute' => '23'], $expectedData], 'Compound choice field' => ['choice', ['hour' => '21', 'minute' => '23'], $expectedData], + 'Simple field lazy' => ['single_text', $lazyEmptyData, $expectedData], + 'Compound text field lazy' => ['text', $lazyEmptyData, $expectedData], + 'Compound choice field lazy' => ['choice', $lazyEmptyData, $expectedData], ]; } } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy