From ef5835d8336fe675fa1f1a8a35f9b7c9ae55ae7a Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Sat, 4 Jan 2020 09:15:56 +0100 Subject: [PATCH] derive the view timezone from the model timezone --- src/Symfony/Component/Form/CHANGELOG.md | 1 + .../Form/Extension/Core/Type/TimeType.php | 20 +++++++++++++++---- .../Extension/Core/Type/TimeTypeTest.php | 9 +++++++++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Component/Form/CHANGELOG.md b/src/Symfony/Component/Form/CHANGELOG.md index 6b207848dc76..82231b3c45c9 100644 --- a/src/Symfony/Component/Form/CHANGELOG.md +++ b/src/Symfony/Component/Form/CHANGELOG.md @@ -4,6 +4,7 @@ CHANGELOG 5.1.0 ----- + * The `view_timezone` option defaults to the `model_timezone` if no `reference_date` is configured. * Added default `inputmode` attribute to Search, Email and Tel form types. 5.0.0 diff --git a/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php b/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php index ed683beeaf98..2e55a6d0b421 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php @@ -280,6 +280,18 @@ public function configureOptions(OptionsResolver $resolver) return null; }; + $viewTimezone = static function (Options $options, $value): ?string { + if (null !== $value) { + return $value; + } + + if (null !== $options['model_timezone'] && null === $options['reference_date']) { + return $options['model_timezone']; + } + + return null; + }; + $resolver->setDefaults([ 'hours' => range(0, 23), 'minutes' => range(0, 59), @@ -290,7 +302,7 @@ public function configureOptions(OptionsResolver $resolver) 'with_minutes' => true, 'with_seconds' => false, 'model_timezone' => $modelTimezone, - 'view_timezone' => null, + 'view_timezone' => $viewTimezone, 'reference_date' => null, 'placeholder' => $placeholderDefault, 'html5' => true, @@ -310,12 +322,12 @@ public function configureOptions(OptionsResolver $resolver) 'choice_translation_domain' => false, ]); - $resolver->setNormalizer('model_timezone', function (Options $options, $modelTimezone): ?string { - if (null !== $modelTimezone && $options['view_timezone'] !== $modelTimezone && null === $options['reference_date']) { + $resolver->setNormalizer('view_timezone', function (Options $options, $viewTimezone): ?string { + if (null !== $options['model_timezone'] && $viewTimezone !== $options['model_timezone'] && null === $options['reference_date']) { throw new LogicException(sprintf('Using different values for the "model_timezone" and "view_timezone" options without configuring a reference date is not supported.')); } - return $modelTimezone; + return $viewTimezone; }); $resolver->setNormalizer('placeholder', $placeholderNormalizer); 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 f220bf97e8a6..25803308e952 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php @@ -859,6 +859,15 @@ public function testModelTimezoneDefaultToReferenceDateTimezoneIfProvided() $this->assertSame('Europe/Berlin', $form->getConfig()->getOption('model_timezone')); } + public function testViewTimezoneDefaultsToModelTimezoneIfProvided() + { + $form = $this->factory->create(static::TESTED_TYPE, null, [ + 'model_timezone' => 'Europe/Berlin', + ]); + + $this->assertSame('Europe/Berlin', $form->getConfig()->getOption('view_timezone')); + } + public function testPassDefaultChoiceTranslationDomain() { $form = $this->factory->create(static::TESTED_TYPE);