diff --git a/src/Symfony/Component/Form/CHANGELOG.md b/src/Symfony/Component/Form/CHANGELOG.md index 6b207848dc..82231b3c45 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 ed683beeaf..2e55a6d0b4 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 @@ class TimeType extends AbstractType 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 @@ class TimeType extends AbstractType '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 @@ class TimeType extends AbstractType '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 f220bf97e8..25803308e9 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 @@ class TimeTypeTest extends BaseTypeTest $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);