Explorar o código

[Form] fixed a bug that caused input date validation not to be strict when using the single_text widget with a date field

KUBO Atsuhiro %!s(int64=13) %!d(string=hai) anos
pai
achega
7e3213cf3f

+ 3 - 1
src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformer.php

@@ -157,6 +157,8 @@ class DateTimeToLocalizedStringTransformer extends BaseDateTimeTransformer
         $calendar = $this->calendar;
         $pattern = $this->pattern;
 
-        return new \IntlDateFormatter(\Locale::getDefault(), $dateFormat, $timeFormat, $timezone, $calendar, $pattern);
+        $intlDateFormatter = new \IntlDateFormatter(\Locale::getDefault(), $dateFormat, $timeFormat, $timezone, $calendar, $pattern);
+        $intlDateFormatter->setLenient(false);
+        return $intlDateFormatter;
     }
 }

+ 1 - 0
src/Symfony/Component/Form/Extension/Core/Type/DateType.php

@@ -61,6 +61,7 @@ class DateType extends AbstractType
             \IntlDateFormatter::GREGORIAN,
             $pattern
         );
+        $formatter->setLenient(false);
 
         if ($options['widget'] === 'single_text') {
             $builder->appendClientTransformer(new DateTimeToLocalizedStringTransformer($options['data_timezone'], $options['user_timezone'], $format, \IntlDateFormatter::NONE, \IntlDateFormatter::GREGORIAN, $pattern));

+ 10 - 0
tests/Symfony/Tests/Component/Form/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformerTest.php

@@ -286,4 +286,14 @@ class DateTimeToLocalizedStringTransformerTest extends DateTimeTestCase
     {
         new DateTimeToLocalizedStringTransformer(null, null, null, 'foobar');
     }
+
+    /**
+     * @expectedException Symfony\Component\Form\Exception\TransformationFailedException
+     */
+    public function testReverseTransformWithNonExistingDate()
+    {
+        $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', \IntlDateFormatter::SHORT);
+
+        $this->assertDateTimeEquals($this->dateTimeWithoutSeconds, $transformer->reverseTransform('31.04.10 04:05'));
+    }
 }

+ 19 - 0
tests/Symfony/Tests/Component/Form/Extension/Core/Type/DateTypeTest.php

@@ -13,6 +13,7 @@ namespace Symfony\Tests\Component\Form\Extension\Core\Type;
 
 require_once __DIR__ . '/LocalizedTestCase.php';
 
+use Symfony\Component\Form\FormError;
 
 class DateTypeTest extends LocalizedTestCase
 {
@@ -460,4 +461,22 @@ class DateTypeTest extends LocalizedTestCase
 
         $this->assertSame('single_text', $view->get('widget'));
     }
+
+    public function testInvalidDateWithSingleTextDateTime()
+    {
+        $form = $this->factory->create('date', null, array(
+            'data_timezone' => 'UTC',
+            'user_timezone' => 'UTC',
+            'widget' => 'single_text',
+            'input' => 'datetime',
+            'invalid_message' => 'Customized invalid message',
+        ));
+
+        $form->bind('31.4.2012');
+
+        $this->assertFalse($form->isValid());
+        $this->assertNull($form->getData());
+        $this->assertEquals('31.4.2012', $form->getClientData());
+        $this->assertEquals(array(new FormError('Customized invalid message', array())), $form->getErrors());
+    }
 }