diff --git a/UPGRADE-4.3.md b/UPGRADE-4.3.md index 8050fed267..7a2dca2063 100644 --- a/UPGRADE-4.3.md +++ b/UPGRADE-4.3.md @@ -23,6 +23,7 @@ Config Form ---- + * Using the `format` option of `DateType` and `DateTimeType` when the `html5` option is enabled is deprecated. * Using names for buttons that do not start with a letter, a digit, or an underscore is deprecated and will lead to an exception in 5.0. * Using names for buttons that do not contain only letters, digits, underscores, hyphens, and colons is deprecated and diff --git a/UPGRADE-5.0.md b/UPGRADE-5.0.md index 07a21d558b..f61211c1cc 100644 --- a/UPGRADE-5.0.md +++ b/UPGRADE-5.0.md @@ -78,6 +78,7 @@ Finder Form ---- + * Removed support for using the `format` option of `DateType` and `DateTimeType` when the `html5` option is enabled. * Using names for buttons that do not start with a letter, a digit, or an underscore leads to an exception. * Using names for buttons that do not contain only letters, digits, underscores, hyphens, and colons leads to an exception. diff --git a/src/Symfony/Component/Form/CHANGELOG.md b/src/Symfony/Component/Form/CHANGELOG.md index 2304727571..d25fbc6a4c 100644 --- a/src/Symfony/Component/Form/CHANGELOG.md +++ b/src/Symfony/Component/Form/CHANGELOG.md @@ -4,6 +4,7 @@ CHANGELOG 4.3.0 ----- + * Using the `format` option of `DateType` and `DateTimeType` when the `html5` option is enabled is deprecated. * Using names for buttons that do not start with a letter, a digit, or an underscore is deprecated and will lead to an exception in 5.0. * Using names for buttons that do not contain only letters, digits, underscores, hyphens, and colons is deprecated and diff --git a/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php b/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php index 291d86af6f..4e84b71a7c 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php @@ -159,6 +159,10 @@ class DateTimeType extends AbstractType $dateOptions['input'] = $timeOptions['input'] = 'array'; $dateOptions['error_bubbling'] = $timeOptions['error_bubbling'] = true; + if (isset($dateOptions['format']) && DateType::HTML5_FORMAT !== $dateOptions['format']) { + $dateOptions['html5'] = false; + } + $builder ->addViewTransformer(new DataTransformerChain([ new DateTimeToArrayTransformer($options['model_timezone'], $options['view_timezone'], $parts), @@ -294,6 +298,8 @@ class DateTimeType extends AbstractType 'choice', ]); + $resolver->setAllowedTypes('input_format', 'string'); + $resolver->setDeprecated('date_format', function (Options $options, $dateFormat) { if (null !== $dateFormat && 'single_text' === $options['widget'] && self::HTML5_FORMAT === $options['format']) { return sprintf('Using the "date_format" option of %s with an HTML5 date widget is deprecated since Symfony 4.3 and will lead to an exception in 5.0.', self::class); @@ -318,8 +324,14 @@ class DateTimeType extends AbstractType return ''; }); + $resolver->setDeprecated('html5', function (Options $options, $html5) { + if ($html5 && self::HTML5_FORMAT !== $options['format']) { + return sprintf('Using a custom format when the "html5" option of %s is enabled is deprecated since Symfony 4.3 and will lead to an exception in 5.0.', self::class); + //throw new LogicException(sprintf('Cannot use the "format" option of %s when the "html5" option is disabled.', self::class)); + } - $resolver->setAllowedTypes('input_format', 'string'); + return ''; + }); } /** diff --git a/src/Symfony/Component/Form/Extension/Core/Type/DateType.php b/src/Symfony/Component/Form/Extension/Core/Type/DateType.php index ced29d88e0..39002df2b6 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/DateType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/DateType.php @@ -306,8 +306,16 @@ class DateType extends AbstractType $resolver->setAllowedTypes('years', 'array'); $resolver->setAllowedTypes('months', 'array'); $resolver->setAllowedTypes('days', 'array'); - $resolver->setAllowedTypes('input_format', 'string'); + + $resolver->setDeprecated('html5', function (Options $options, $html5) { + if ($html5 && 'single_text' === $options['widget'] && self::HTML5_FORMAT !== $options['format']) { + return sprintf('Using a custom format when the "html5" option of %s is enabled is deprecated since Symfony 4.3 and will lead to an exception in 5.0.', self::class); + //throw new LogicException(sprintf('Cannot use the "format" option of %s when the "html5" option is disabled.', self::class)); + } + + return ''; + }); } /** diff --git a/src/Symfony/Component/Form/Tests/Command/DebugCommandTest.php b/src/Symfony/Component/Form/Tests/Command/DebugCommandTest.php index 99391245da..b572daf7b2 100644 --- a/src/Symfony/Component/Form/Tests/Command/DebugCommandTest.php +++ b/src/Symfony/Component/Form/Tests/Command/DebugCommandTest.php @@ -45,7 +45,7 @@ class DebugCommandTest extends TestCase Built-in form types (Symfony\Component\Form\Extension\Core\Type) ---------------------------------------------------------------- - DateTimeType, IntegerType, TimezoneType + BirthdayType, DateTimeType, DateType, IntegerType, TimezoneType Service form types ------------------ 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 20899c1570..93935157fe 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php @@ -470,6 +470,9 @@ class DateTimeTypeTest extends BaseTypeTest $this->assertArrayNotHasKey('type', $view->vars); } + /** + * @group legacy + */ public function testDontPassHtml5TypeIfNotHtml5Format() { $view = $this->factory->create(static::TESTED_TYPE, null, [ 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 3ff363f958..f84547141f 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php @@ -76,6 +76,7 @@ class DateTypeTest extends BaseTypeTest 'widget' => 'single_text', 'input' => 'datetime', 'format' => 'yyyy', + 'html5' => false, ]); $form->submit('2010'); @@ -93,6 +94,7 @@ class DateTypeTest extends BaseTypeTest $form = $this->factory->create(static::TESTED_TYPE, null, [ 'format' => \IntlDateFormatter::MEDIUM, + 'html5' => false, 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'widget' => 'single_text', @@ -114,6 +116,7 @@ class DateTypeTest extends BaseTypeTest $form = $this->factory->create(static::TESTED_TYPE, null, [ 'format' => \IntlDateFormatter::MEDIUM, + 'html5' => false, 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'widget' => 'single_text', @@ -136,6 +139,7 @@ class DateTypeTest extends BaseTypeTest $form = $this->factory->create(static::TESTED_TYPE, null, [ 'format' => \IntlDateFormatter::MEDIUM, + 'html5' => false, 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'widget' => 'single_text', @@ -157,6 +161,7 @@ class DateTypeTest extends BaseTypeTest $form = $this->factory->create(static::TESTED_TYPE, null, [ 'format' => \IntlDateFormatter::MEDIUM, + 'html5' => false, 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'widget' => 'single_text', @@ -180,6 +185,7 @@ class DateTypeTest extends BaseTypeTest $form = $this->factory->create(static::TESTED_TYPE, null, [ 'format' => \IntlDateFormatter::MEDIUM, + 'html5' => false, 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'widget' => 'single_text', @@ -270,6 +276,7 @@ class DateTypeTest extends BaseTypeTest 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'format' => 'MM*yyyy*dd', + 'html5' => false, 'widget' => 'single_text', 'input' => 'datetime', ]); @@ -286,6 +293,7 @@ class DateTypeTest extends BaseTypeTest 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'format' => 'MM*yyyy*dd', + 'html5' => false, 'widget' => 'single_text', 'input' => 'string', ]); @@ -302,6 +310,7 @@ class DateTypeTest extends BaseTypeTest 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'format' => 'MM*yyyy*dd', + 'html5' => false, 'widget' => 'single_text', 'input' => 'timestamp', ]); @@ -320,6 +329,7 @@ class DateTypeTest extends BaseTypeTest 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'format' => 'MM*yyyy*dd', + 'html5' => false, 'widget' => 'single_text', 'input' => 'array', ]); @@ -368,6 +378,7 @@ class DateTypeTest extends BaseTypeTest { $this->factory->create(static::TESTED_TYPE, null, [ 'format' => '0', + 'html5' => false, 'widget' => 'single_text', 'input' => 'string', ]); @@ -394,6 +405,7 @@ class DateTypeTest extends BaseTypeTest $this->factory->create(static::TESTED_TYPE, null, [ 'widget' => 'single_text', 'format' => 'wrong', + 'html5' => false, ]); } @@ -456,6 +468,7 @@ class DateTypeTest extends BaseTypeTest $form = $this->factory->create(static::TESTED_TYPE, null, [ 'format' => \IntlDateFormatter::MEDIUM, + 'html5' => false, 'model_timezone' => 'UTC', 'view_timezone' => 'America/New_York', 'input' => 'string', @@ -478,6 +491,7 @@ class DateTypeTest extends BaseTypeTest $form = $this->factory->create(static::TESTED_TYPE, null, [ 'format' => \IntlDateFormatter::MEDIUM, + 'html5' => false, 'model_timezone' => 'UTC', 'view_timezone' => 'America/New_York', 'input' => 'datetime', @@ -856,6 +870,7 @@ class DateTypeTest extends BaseTypeTest $view = $this->factory->create(static::TESTED_TYPE, null, [ 'widget' => 'single_text', 'format' => \IntlDateFormatter::MEDIUM, + 'html5' => false, ]) ->createView();