浏览代码

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

KUBO Atsuhiro 13 年之前
父节点
当前提交
20b556dacb

+ 4 - 0
src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php

@@ -96,6 +96,10 @@ class DateTimeToStringTransformer extends BaseDateTimeTransformer
 
         try {
             $dateTime = new \DateTime($value, new \DateTimeZone($this->outputTimezone));
+            $lastErrors = \DateTime::getLastErrors();
+            if (0 < $lastErrors['warning_count'] || 0 < $lastErrors['error_count']) {
+                throw new \UnexpectedValueException(implode(', ', array_merge(array_values($lastErrors['warnings']), array_values($lastErrors['errors']))));
+            }
 
             // Force value to be in same format as given to transform
             if ($value !== $dateTime->format($this->format)) {

+ 9 - 0
tests/Symfony/Tests/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformerTest.php

@@ -140,4 +140,13 @@ class DateTimeToStringTransformerTest extends DateTimeTestCase
 
         $reverseTransformer->reverseTransform('2010-2010-2010');
     }
+
+    public function testReverseTransformWithNonExistingDate()
+    {
+        $reverseTransformer = new DateTimeToStringTransformer();
+
+        $this->setExpectedException('Symfony\Component\Form\Exception\TransformationFailedException');
+
+        $reverseTransformer->reverseTransform('2010-04-31');
+    }
 }

+ 18 - 0
tests/Symfony/Tests/Component/Form/Extension/Core/Type/DateTimeTypeTest.php

@@ -234,4 +234,22 @@ class DateTimeTypeTest extends LocalizedTestCase
         $this->assertEquals(array(new FormError('Customized invalid message', array())), $form['date']->getErrors());
         $this->assertEquals(array(new FormError('Customized invalid message', array())), $form['time']->getErrors());
     }
+
+    public function testSubmit_invalidDateTimeSingleText()
+    {
+        $form = $this->factory->create('datetime', null, array(
+            'data_timezone' => 'UTC',
+            'user_timezone' => 'UTC',
+            'input' => 'datetime',
+            'widget' => 'single_text',
+            'invalid_message' => 'Customized invalid message',
+        ));
+
+        $form->bind('2012-04-31 03:04:05');
+
+        $this->assertFalse($form->isValid());
+        $this->assertNull($form->getData());
+        $this->assertEquals('2012-04-31 03:04:05', $form->getClientData());
+        $this->assertEquals(array(new FormError('Customized invalid message', array())), $form->getErrors());
+    }
 }