Skip to content

Commit eba4aba

Browse files
committed
merged 2.0
2 parents a26e66c + f541844 commit eba4aba

File tree

8 files changed

+65
-1
lines changed

8 files changed

+65
-1
lines changed

.travis.yml

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
language: php
22

33
php:
4+
- 5.3.3
45
- 5.3
56
- 5.4
67

src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformer.php

+3-1
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,8 @@ protected function getIntlDateFormatter()
157157
$calendar = $this->calendar;
158158
$pattern = $this->pattern;
159159

160-
return new \IntlDateFormatter(\Locale::getDefault(), $dateFormat, $timeFormat, $timezone, $calendar, $pattern);
160+
$intlDateFormatter = new \IntlDateFormatter(\Locale::getDefault(), $dateFormat, $timeFormat, $timezone, $calendar, $pattern);
161+
$intlDateFormatter->setLenient(false);
162+
return $intlDateFormatter;
161163
}
162164
}

src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php

+4
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ public function reverseTransform($value)
9696

9797
try {
9898
$dateTime = new \DateTime($value, new \DateTimeZone($this->outputTimezone));
99+
$lastErrors = \DateTime::getLastErrors();
100+
if (0 < $lastErrors['warning_count'] || 0 < $lastErrors['error_count']) {
101+
throw new \UnexpectedValueException(implode(', ', array_merge(array_values($lastErrors['warnings']), array_values($lastErrors['errors']))));
102+
}
99103

100104
// Force value to be in same format as given to transform
101105
if ($value !== $dateTime->format($this->format)) {

src/Symfony/Component/Form/Extension/Core/Type/DateType.php

+1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public function buildForm(FormBuilderInterface $builder, array $options)
6161
\IntlDateFormatter::GREGORIAN,
6262
$pattern
6363
);
64+
$formatter->setLenient(false);
6465

6566
if ('single_text' === $options['widget']) {
6667
$builder->addViewTransformer(new DateTimeToLocalizedStringTransformer($options['data_timezone'], $options['user_timezone'], $format, \IntlDateFormatter::NONE, \IntlDateFormatter::GREGORIAN, $pattern));

src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformerTest.php

+10
Original file line numberDiff line numberDiff line change
@@ -284,4 +284,14 @@ public function testValidateTimeFormatOption()
284284
{
285285
new DateTimeToLocalizedStringTransformer(null, null, null, 'foobar');
286286
}
287+
288+
/**
289+
* @expectedException Symfony\Component\Form\Exception\TransformationFailedException
290+
*/
291+
public function testReverseTransformWithNonExistingDate()
292+
{
293+
$transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', \IntlDateFormatter::SHORT);
294+
295+
$this->assertDateTimeEquals($this->dateTimeWithoutSeconds, $transformer->reverseTransform('31.04.10 04:05'));
296+
}
287297
}

src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToStringTransformerTest.php

+9
Original file line numberDiff line numberDiff line change
@@ -138,4 +138,13 @@ public function testReverseTransformExpectsValidDateString()
138138

139139
$reverseTransformer->reverseTransform('2010-2010-2010');
140140
}
141+
142+
public function testReverseTransformWithNonExistingDate()
143+
{
144+
$reverseTransformer = new DateTimeToStringTransformer();
145+
146+
$this->setExpectedException('Symfony\Component\Form\Exception\TransformationFailedException');
147+
148+
$reverseTransformer->reverseTransform('2010-04-31');
149+
}
141150
}

src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php

+18
Original file line numberDiff line numberDiff line change
@@ -243,4 +243,22 @@ public function testSingleTextWidgetShouldUseTheRightInputType()
243243
$view = $form->createView();
244244
$this->assertEquals('datetime', $view->getVar('type'));
245245
}
246+
247+
public function testSubmit_invalidDateTimeSingleText()
248+
{
249+
$form = $this->factory->create('datetime', null, array(
250+
'data_timezone' => 'UTC',
251+
'user_timezone' => 'UTC',
252+
'input' => 'datetime',
253+
'widget' => 'single_text',
254+
'invalid_message' => 'Customized invalid message',
255+
));
256+
257+
$form->bind('2012-04-31 03:04:05');
258+
259+
$this->assertFalse($form->isValid());
260+
$this->assertNull($form->getData());
261+
$this->assertEquals('2012-04-31 03:04:05', $form->getClientData());
262+
$this->assertEquals(array(new FormError('Customized invalid message', array())), $form->getErrors());
263+
}
246264
}

src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php

+19
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Component\Form\Tests\Extension\Core\Type;
1313

1414
use Symfony\Component\Form\Extension\Core\View\ChoiceView;
15+
use Symfony\Component\Form\FormError;
1516

1617
class DateTypeTest extends LocalizedTestCase
1718
{
@@ -546,4 +547,22 @@ public function testSingleTextWidgetShouldUseTheRightInputType()
546547
$view = $form->createView();
547548
$this->assertEquals('date', $view->getVar('type'));
548549
}
550+
551+
public function testInvalidDateWithSingleTextDateTime()
552+
{
553+
$form = $this->factory->create('date', null, array(
554+
'data_timezone' => 'UTC',
555+
'user_timezone' => 'UTC',
556+
'widget' => 'single_text',
557+
'input' => 'datetime',
558+
'invalid_message' => 'Customized invalid message',
559+
));
560+
561+
$form->bind('31.4.2012');
562+
563+
$this->assertFalse($form->isValid());
564+
$this->assertNull($form->getData());
565+
$this->assertEquals('31.4.2012', $form->getClientData());
566+
$this->assertEquals(array(new FormError('Customized invalid message', array())), $form->getErrors());
567+
}
549568
}

0 commit comments

Comments
 (0)