From 3e5fe70695e2b42c556547d5063962efdc1f9c87 Mon Sep 17 00:00:00 2001 From: hlecorche Date: Sat, 28 May 2011 10:47:18 +0200 Subject: [PATCH 1/3] [Form] Reverse DateTimeToStringTransformer must use format --- .../DateTimeToStringTransformer.php | 6 ++++- .../DateTimeToStringTransformerTest.php | 22 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php index 938433dd0bdd5..3d6333610e747 100644 --- a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php +++ b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php @@ -94,7 +94,11 @@ public function reverseTransform($value) } try { - $dateTime = new \DateTime(sprintf("%s %s", $value, $this->outputTimezone)); + $dateTime = \DateTime::createFromFormat($this->format, $value, new \DateTimeZone($this->outputTimezone)); + $last_errors = \DateTime::getLastErrors(); + if($last_errors['warning_count'] > 0 || $last_errors['error_count'] > 0){ + throw new \Exception('Date is invalid.'); + } if ($this->inputTimezone !== $this->outputTimezone) { $dateTime->setTimeZone(new \DateTimeZone($this->inputTimezone)); diff --git a/tests/Symfony/Tests/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformerTest.php b/tests/Symfony/Tests/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformerTest.php index cef36660a7811..31f92717ff96b 100644 --- a/tests/Symfony/Tests/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformerTest.php +++ b/tests/Symfony/Tests/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformerTest.php @@ -55,6 +55,18 @@ public function testTransformExpectsDateTime() $transformer->transform('1234'); } + + public function testTransformOtherFormat() + { + $transformer = new DateTimeToStringTransformer('UTC', 'UTC', 'd/m/Y H:i:s'); + + $input = new \DateTime('2010-02-03 04:05:06 UTC'); + $output = clone $input; + $output->setTimezone(new \DateTimeZone('UTC')); + $output = $output->format('d/m/Y H:i:s'); + + $this->assertEquals($output, $transformer->transform($input)); + } public function testReverseTransform() { @@ -101,4 +113,14 @@ public function testReverseTransformExpectsValidDateString() $reverseTransformer->reverseTransform('2010-2010-2010', null); } + + public function testReverseTransformOtherFormat() + { + $reverseTransformer = new DateTimeToStringTransformer('UTC', 'UTC', 'd/m/Y H:i:s'); + + $output = new \DateTime('2010-02-03 04:05:06 UTC'); + $input = '03/02/2010 04:05:06'; + + $this->assertDateTimeEquals($output, $reverseTransformer->reverseTransform($input)); + } } From 162ca427d65ffcc7f48a5247b69024b604776ec4 Mon Sep 17 00:00:00 2001 From: hlecorche Date: Wed, 1 Jun 2011 15:14:48 +0200 Subject: [PATCH 2/3] [Form] DateTimeToStringTransformerTest: Check if date exists --- .../DataTransformer/DateTimeToStringTransformerTest.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/Symfony/Tests/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformerTest.php b/tests/Symfony/Tests/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformerTest.php index 31f92717ff96b..fd23965e11967 100644 --- a/tests/Symfony/Tests/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformerTest.php +++ b/tests/Symfony/Tests/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformerTest.php @@ -123,4 +123,13 @@ public function testReverseTransformOtherFormat() $this->assertDateTimeEquals($output, $reverseTransformer->reverseTransform($input)); } + + public function testReverseTransformExpectsDateExists() + { + $reverseTransformer = new DateTimeToStringTransformer('UTC', 'UTC', 'Y-m-d H:i:s'); + + $this->setExpectedException('Symfony\Component\Form\Exception\TransformationFailedException'); + + $reverseTransformer->reverseTransform('2011-02-29 04:05:06', null); + } } From 2de60b6ae2f092ffd315d5c079b374cb43f7c48f Mon Sep 17 00:00:00 2001 From: hlecorche Date: Wed, 1 Jun 2011 16:50:03 +0200 Subject: [PATCH 3/3] [Form] DateTimeToStringTransformer: Better message of exception --- .../Core/DataTransformer/DateTimeToStringTransformer.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php index 3d6333610e747..52c6e6119059d 100644 --- a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php +++ b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php @@ -95,10 +95,11 @@ public function reverseTransform($value) try { $dateTime = \DateTime::createFromFormat($this->format, $value, new \DateTimeZone($this->outputTimezone)); - $last_errors = \DateTime::getLastErrors(); - if($last_errors['warning_count'] > 0 || $last_errors['error_count'] > 0){ - throw new \Exception('Date is invalid.'); - } + $errors = \DateTime::getLastErrors(); + if ($errors['warning_count'] > 0 || $errors['error_count'] > 0) { + throw new \Exception('Date is invalid. List of warnings: "' . implode(', "',array_values($errors['warnings'])) . '" ' . + 'List of errors: "' . implode(', "',array_values($errors['errors'])) . '"'); + } if ($this->inputTimezone !== $this->outputTimezone) { $dateTime->setTimeZone(new \DateTimeZone($this->inputTimezone));