Sfoglia il codice sorgente

[Form] DateTimeToArrayTransformer does not accept partially filled arrays anymore. Replaces DateField::isPartiallyFilled() and TimeField::isPartiallyFilled()

Bernhard Schussek 14 anni fa
parent
commit
ac5440f8d4

+ 13 - 0
src/Symfony/Component/Form/ValueTransformer/DateTimeToArrayTransformer.php

@@ -112,6 +112,19 @@ class DateTimeToArrayTransformer extends BaseDateTimeTransformer
             return null;
         }
 
+        $emptyFields = array();
+
+        foreach ($this->getOption('fields') as $field) {
+            if (empty($value[$field])) {
+                $emptyFields[] = $field;
+            }
+        }
+
+        if (count($emptyFields) > 0) {
+            throw new TransformationFailedException(sprintf(
+                    'The fields "%s" should not be empty', implode('", "', $emptyFields)));
+        }
+
         try {
             $dateTime = new \DateTime(sprintf(
                 '%s-%s-%s %s:%s:%s %s',

+ 106 - 1
tests/Symfony/Tests/Component/Form/ValueTransformer/DateTimeToArrayTransformerTest.php

@@ -150,7 +150,7 @@ class DateTimeToArrayTransformerTest extends DateTimeTestCase
         $this->assertDateTimeEquals($output, $transformer->reverseTransform($input, null));
     }
 
-    public function testReverseTransform_empty()
+    public function testReverseTransform_completelyEmpty()
     {
         $transformer = new DateTimeToArrayTransformer();
 
@@ -166,6 +166,111 @@ class DateTimeToArrayTransformerTest extends DateTimeTestCase
         $this->assertSame(null, $transformer->reverseTransform($input, null));
     }
 
+    public function testReverseTransform_completelyEmpty_subsetOfFields()
+    {
+        $transformer = new DateTimeToArrayTransformer(array(
+            'fields' => array('year', 'month', 'day')
+        ));
+
+        $input = array(
+            'year' => '',
+            'month' => '',
+            'day' => '',
+        );
+
+        $this->assertSame(null, $transformer->reverseTransform($input, null));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Form\ValueTransformer\TransformationFailedException
+     */
+    public function testReverseTransform_partiallyEmpty_year()
+    {
+        $transformer = new DateTimeToArrayTransformer();
+        $transformer->reverseTransform(array(
+            'month' => '2',
+            'day' => '3',
+            'hour' => '4',
+            'minute' => '5',
+            'second' => '6',
+        ));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Form\ValueTransformer\TransformationFailedException
+     */
+    public function testReverseTransform_partiallyEmpty_month()
+    {
+        $transformer = new DateTimeToArrayTransformer();
+        $transformer->reverseTransform(array(
+            'year' => '2010',
+            'day' => '3',
+            'hour' => '4',
+            'minute' => '5',
+            'second' => '6',
+        ));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Form\ValueTransformer\TransformationFailedException
+     */
+    public function testReverseTransform_partiallyEmpty_day()
+    {
+        $transformer = new DateTimeToArrayTransformer();
+        $transformer->reverseTransform(array(
+            'year' => '2010',
+            'month' => '2',
+            'hour' => '4',
+            'minute' => '5',
+            'second' => '6',
+        ));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Form\ValueTransformer\TransformationFailedException
+     */
+    public function testReverseTransform_partiallyEmpty_hour()
+    {
+        $transformer = new DateTimeToArrayTransformer();
+        $transformer->reverseTransform(array(
+            'year' => '2010',
+            'month' => '2',
+            'day' => '3',
+            'minute' => '5',
+            'second' => '6',
+        ));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Form\ValueTransformer\TransformationFailedException
+     */
+    public function testReverseTransform_partiallyEmpty_minute()
+    {
+        $transformer = new DateTimeToArrayTransformer();
+        $transformer->reverseTransform(array(
+            'year' => '2010',
+            'month' => '2',
+            'day' => '3',
+            'hour' => '4',
+            'second' => '6',
+        ));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Form\ValueTransformer\TransformationFailedException
+     */
+    public function testReverseTransform_partiallyEmpty_second()
+    {
+        $transformer = new DateTimeToArrayTransformer();
+        $transformer->reverseTransform(array(
+            'year' => '2010',
+            'month' => '2',
+            'day' => '3',
+            'hour' => '4',
+            'minute' => '5',
+        ));
+    }
+
     public function testReverseTransform_null()
     {
         $transformer = new DateTimeToArrayTransformer();