From d0555f44984c1612c14de3e6d60b4e5d4d53dfc2 Mon Sep 17 00:00:00 2001 From: Eric GELOEN Date: Mon, 4 Nov 2013 21:38:50 +0100 Subject: [PATCH] Check for hour, minute & second validity --- .../DateTimeToArrayTransformer.php | 18 +++++-- .../Form/Tests/AbstractLayoutTest.php | 9 ++-- .../DateTimeToArrayTransformerTest.php | 48 +++++++++++++++++++ 3 files changed, 67 insertions(+), 8 deletions(-) diff --git a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToArrayTransformer.php b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToArrayTransformer.php index 34af282057..e746d00ed5 100644 --- a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToArrayTransformer.php +++ b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToArrayTransformer.php @@ -144,15 +144,15 @@ class DateTimeToArrayTransformer extends BaseDateTimeTransformer )); } - if (isset($value['month']) && !ctype_digit($value['month']) && !is_int($value['month'])) { + if (isset($value['month']) && !ctype_digit((string) $value['month'])) { throw new TransformationFailedException('This month is invalid'); } - if (isset($value['day']) && !ctype_digit($value['day']) && !is_int($value['day'])) { + if (isset($value['day']) && !ctype_digit((string) $value['day'])) { throw new TransformationFailedException('This day is invalid'); } - if (isset($value['year']) && !ctype_digit($value['year']) && !is_int($value['year'])) { + if (isset($value['year']) && !ctype_digit((string) $value['year'])) { throw new TransformationFailedException('This year is invalid'); } @@ -160,6 +160,18 @@ class DateTimeToArrayTransformer extends BaseDateTimeTransformer throw new TransformationFailedException('This is an invalid date'); } + if (isset($value['hour']) && !ctype_digit((string) $value['hour'])) { + throw new TransformationFailedException('This hour is invalid'); + } + + if (isset($value['minute']) && !ctype_digit((string) $value['minute'])) { + throw new TransformationFailedException('This minute is invalid'); + } + + if (isset($value['second']) && !ctype_digit((string) $value['second'])) { + throw new TransformationFailedException('This second is invalid'); + } + try { $dateTime = new \DateTime(sprintf( '%s-%s-%s %s:%s:%s %s', diff --git a/src/Symfony/Component/Form/Tests/AbstractLayoutTest.php b/src/Symfony/Component/Form/Tests/AbstractLayoutTest.php index 4e922caf0b..10650e5998 100644 --- a/src/Symfony/Component/Form/Tests/AbstractLayoutTest.php +++ b/src/Symfony/Component/Form/Tests/AbstractLayoutTest.php @@ -899,13 +899,12 @@ abstract class AbstractLayoutTest extends \Symfony\Component\Form\Test\FormInteg ); } - public function testDateTimeWithEmptyValueOnTime() + public function testDateTimeWithHourAndMinute() { - $data = array('year' => '2011', 'month' => '2', 'day' => '3', 'hour' => '', 'minute' => ''); + $data = array('year' => '2011', 'month' => '2', 'day' => '3', 'hour' => '4', 'minute' => '5'); $form = $this->factory->createNamed('name', 'datetime', $data, array( 'input' => 'array', - 'empty_value' => array('hour' => 'Change&Me', 'minute' => 'Change&Me'), 'required' => false, )); @@ -930,10 +929,10 @@ abstract class AbstractLayoutTest extends \Symfony\Component\Form\Test\FormInteg [ ./select [@id="name_time_hour"] - [./option[@value=""][not(@selected)][not(@disabled)][.="[trans]Change&Me[/trans]"]] + [./option[@value="4"][@selected="selected"]] /following-sibling::select [@id="name_time_minute"] - [./option[@value=""][not(@selected)][not(@disabled)][.="[trans]Change&Me[/trans]"]] + [./option[@value="5"][@selected="selected"]] ] ] [count(.//select)=5] diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToArrayTransformerTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToArrayTransformerTest.php index 4898b88d34..db5f2b1638 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToArrayTransformerTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToArrayTransformerTest.php @@ -509,4 +509,52 @@ class DateTimeToArrayTransformerTest extends DateTimeTestCase 'second' => '6', )); } + + /** + * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException + */ + public function testReverseTransformWithEmptyStringHour() + { + $transformer = new DateTimeToArrayTransformer(); + $transformer->reverseTransform(array( + 'year' => '2010', + 'month' => '2', + 'day' => '31', + 'hour' => '', + 'minute' => '5', + 'second' => '6', + )); + } + + /** + * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException + */ + public function testReverseTransformWithEmptyStringMinute() + { + $transformer = new DateTimeToArrayTransformer(); + $transformer->reverseTransform(array( + 'year' => '2010', + 'month' => '2', + 'day' => '31', + 'hour' => '4', + 'minute' => '', + 'second' => '6', + )); + } + + /** + * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException + */ + public function testReverseTransformWithEmptyStringSecond() + { + $transformer = new DateTimeToArrayTransformer(); + $transformer->reverseTransform(array( + 'year' => '2010', + 'month' => '2', + 'day' => '31', + 'hour' => '4', + 'minute' => '5', + 'second' => '', + )); + } }