diff --git a/src/Symfony/Component/Form/CHANGELOG.md b/src/Symfony/Component/Form/CHANGELOG.md index cebd4b87ac..55529f923c 100644 --- a/src/Symfony/Component/Form/CHANGELOG.md +++ b/src/Symfony/Component/Form/CHANGELOG.md @@ -4,6 +4,7 @@ CHANGELOG 2.8.0 ----- + * added option "choice_translation_domain" to DateType, TimeType and DateTimeType. * deprecated option "read_only" in favor of "attr['readonly']" * added the html5 "range" FormType * deprecated the "cascade_validation" option in favor of setting "constraints" diff --git a/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php b/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php index cddeac9b4d..ef4d1ad260 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php @@ -116,6 +116,7 @@ class DateTimeType extends AbstractType 'days', 'empty_value', 'placeholder', + 'choice_translation_domain', 'required', 'translation_domain', 'html5', @@ -131,6 +132,7 @@ class DateTimeType extends AbstractType 'with_seconds', 'empty_value', 'placeholder', + 'choice_translation_domain', 'required', 'translation_domain', 'html5', @@ -245,6 +247,7 @@ class DateTimeType extends AbstractType $resolver->setDefined(array( 'empty_value', // deprecated 'placeholder', + 'choice_translation_domain', 'years', 'months', 'days', diff --git a/src/Symfony/Component/Form/Extension/Core/Type/DateType.php b/src/Symfony/Component/Form/Extension/Core/Type/DateType.php index 2a620a1220..f6d5a52346 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/DateType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/DateType.php @@ -94,10 +94,13 @@ class DateType extends AbstractType // Only pass a subset of the options to children $yearOptions['choices'] = $this->formatTimestamps($formatter, '/y+/', $this->listYears($options['years'])); $yearOptions['placeholder'] = $options['placeholder']['year']; + $yearOptions['choice_translation_domain'] = $options['choice_translation_domain']['year']; $monthOptions['choices'] = $this->formatTimestamps($formatter, '/[M|L]+/', $this->listMonths($options['months'])); $monthOptions['placeholder'] = $options['placeholder']['month']; + $monthOptions['choice_translation_domain'] = $options['choice_translation_domain']['month']; $dayOptions['choices'] = $this->formatTimestamps($formatter, '/d+/', $this->listDays($options['days'])); $dayOptions['placeholder'] = $options['placeholder']['day']; + $dayOptions['choice_translation_domain'] = $options['choice_translation_domain']['day']; } // Append generic carry-along options @@ -205,6 +208,23 @@ class DateType extends AbstractType ); }; + $choiceTranslationDomainNormalizer = function (Options $options, $choiceTranslationDomain) { + if (is_array($choiceTranslationDomain)) { + $default = false; + + return array_replace( + array('year' => $default, 'month' => $default, 'day' => $default), + $choiceTranslationDomain + ); + }; + + return array( + 'year' => $choiceTranslationDomain, + 'month' => $choiceTranslationDomain, + 'day' => $choiceTranslationDomain, + ); + }; + $format = function (Options $options) { return $options['widget'] === 'single_text' ? DateType::HTML5_FORMAT : DateType::DEFAULT_FORMAT; }; @@ -231,10 +251,12 @@ class DateType extends AbstractType // this option. 'data_class' => null, 'compound' => $compound, + 'choice_translation_domain' => false, )); $resolver->setNormalizer('empty_value', $placeholderNormalizer); $resolver->setNormalizer('placeholder', $placeholderNormalizer); + $resolver->setNormalizer('choice_translation_domain', $choiceTranslationDomainNormalizer); $resolver->setAllowedValues('input', array( 'datetime', diff --git a/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php b/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php index d4803d03e7..516403f907 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php @@ -69,6 +69,7 @@ class TimeType extends AbstractType // Only pass a subset of the options to children $hourOptions['choices'] = $hours; $hourOptions['placeholder'] = $options['placeholder']['hour']; + $hourOptions['choice_translation_domain'] = $options['choice_translation_domain']['hour']; if ($options['with_minutes']) { foreach ($options['minutes'] as $minute) { @@ -77,6 +78,7 @@ class TimeType extends AbstractType $minuteOptions['choices'] = $minutes; $minuteOptions['placeholder'] = $options['placeholder']['minute']; + $minuteOptions['choice_translation_domain'] = $options['choice_translation_domain']['minute']; } if ($options['with_seconds']) { @@ -88,6 +90,7 @@ class TimeType extends AbstractType $secondOptions['choices'] = $seconds; $secondOptions['placeholder'] = $options['placeholder']['second']; + $secondOptions['choice_translation_domain'] = $options['choice_translation_domain']['second']; } // Append generic carry-along options @@ -194,6 +197,23 @@ class TimeType extends AbstractType ); }; + $choiceTranslationDomainNormalizer = function (Options $options, $choiceTranslationDomain) { + if (is_array($choiceTranslationDomain)) { + $default = false; + + return array_replace( + array('hour' => $default, 'minute' => $default, 'second' => $default), + $choiceTranslationDomain + ); + }; + + return array( + 'hour' => $choiceTranslationDomain, + 'minute' => $choiceTranslationDomain, + 'second' => $choiceTranslationDomain, + ); + }; + $resolver->setDefaults(array( 'hours' => range(0, 23), 'minutes' => range(0, 59), @@ -217,10 +237,12 @@ class TimeType extends AbstractType // this option. 'data_class' => null, 'compound' => $compound, + 'choice_translation_domain' => false, )); $resolver->setNormalizer('empty_value', $placeholderNormalizer); $resolver->setNormalizer('placeholder', $placeholderNormalizer); + $resolver->setNormalizer('choice_translation_domain', $choiceTranslationDomainNormalizer); $resolver->setAllowedValues('input', array( 'datetime', diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php index bd7d0f2495..c6e2322afc 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php @@ -519,4 +519,57 @@ class DateTimeTypeTest extends TestCase $this->assertSame(array(), iterator_to_array($form['time']->getErrors())); $this->assertSame(array($error), iterator_to_array($form->getErrors())); } + + public function testPassDefaultChoiceTranslationDomain() + { + $form = $this->factory->create('Symfony\Component\Form\Extension\Core\Type\DateTimeType', null, array( + 'with_seconds' => true, + )); + + $view = $form->createView(); + + $this->assertFalse($view['date']['year']->vars['choice_translation_domain']); + $this->assertFalse($view['date']['month']->vars['choice_translation_domain']); + $this->assertFalse($view['date']['day']->vars['choice_translation_domain']); + $this->assertFalse($view['time']['hour']->vars['choice_translation_domain']); + $this->assertFalse($view['time']['minute']->vars['choice_translation_domain']); + $this->assertFalse($view['time']['second']->vars['choice_translation_domain']); + } + + public function testPassChoiceTranslationDomainAsString() + { + $form = $this->factory->create('Symfony\Component\Form\Extension\Core\Type\DateTimeType', null, array( + 'choice_translation_domain' => 'messages', + 'with_seconds' => true, + )); + + $view = $form->createView(); + $this->assertSame('messages', $view['date']['year']->vars['choice_translation_domain']); + $this->assertSame('messages', $view['date']['month']->vars['choice_translation_domain']); + $this->assertSame('messages', $view['date']['day']->vars['choice_translation_domain']); + $this->assertSame('messages', $view['time']['hour']->vars['choice_translation_domain']); + $this->assertSame('messages', $view['time']['minute']->vars['choice_translation_domain']); + $this->assertSame('messages', $view['time']['second']->vars['choice_translation_domain']); + } + + public function testPassChoiceTranslationDomainAsArray() + { + $form = $this->factory->create('Symfony\Component\Form\Extension\Core\Type\DateTimeType', null, array( + 'choice_translation_domain' => array( + 'year' => 'foo', + 'month' => 'test', + 'hour' => 'foo', + 'second' => 'test', + ), + 'with_seconds' => true, + )); + + $view = $form->createView(); + $this->assertSame('foo', $view['date']['year']->vars['choice_translation_domain']); + $this->assertSame('test', $view['date']['month']->vars['choice_translation_domain']); + $this->assertFalse($view['date']['day']->vars['choice_translation_domain']); + $this->assertSame('foo', $view['time']['hour']->vars['choice_translation_domain']); + $this->assertFalse($view['time']['minute']->vars['choice_translation_domain']); + $this->assertSame('test', $view['time']['second']->vars['choice_translation_domain']); + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php index 3cc7ecb5c7..d80be47ebe 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php @@ -950,4 +950,41 @@ class DateTypeTest extends TestCase $this->assertEquals($listChoices, $view['year']->vars['choices']); } + + public function testPassDefaultChoiceTranslationDomain() + { + $form = $this->factory->create('Symfony\Component\Form\Extension\Core\Type\DateType'); + + $view = $form->createView(); + $this->assertFalse($view['year']->vars['choice_translation_domain']); + $this->assertFalse($view['month']->vars['choice_translation_domain']); + $this->assertFalse($view['day']->vars['choice_translation_domain']); + } + + public function testPassChoiceTranslationDomainAsString() + { + $form = $this->factory->create('Symfony\Component\Form\Extension\Core\Type\DateType', null, array( + 'choice_translation_domain' => 'messages', + )); + + $view = $form->createView(); + $this->assertSame('messages', $view['year']->vars['choice_translation_domain']); + $this->assertSame('messages', $view['month']->vars['choice_translation_domain']); + $this->assertSame('messages', $view['day']->vars['choice_translation_domain']); + } + + public function testPassChoiceTranslationDomainAsArray() + { + $form = $this->factory->create('Symfony\Component\Form\Extension\Core\Type\DateType', null, array( + 'choice_translation_domain' => array( + 'year' => 'foo', + 'day' => 'test', + ), + )); + + $view = $form->createView(); + $this->assertSame('foo', $view['year']->vars['choice_translation_domain']); + $this->assertFalse($view['month']->vars['choice_translation_domain']); + $this->assertSame('test', $view['day']->vars['choice_translation_domain']); + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php index 9ff665e186..fd60b0d6b0 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php @@ -736,4 +736,42 @@ class TimeTypeTest extends TestCase 'seconds' => 'bad value', )); } + + public function testPassDefaultChoiceTranslationDomain() + { + $form = $this->factory->create('Symfony\Component\Form\Extension\Core\Type\TimeType'); + + $view = $form->createView(); + $this->assertFalse($view['hour']->vars['choice_translation_domain']); + $this->assertFalse($view['minute']->vars['choice_translation_domain']); + } + + public function testPassChoiceTranslationDomainAsString() + { + $form = $this->factory->create('Symfony\Component\Form\Extension\Core\Type\TimeType', null, array( + 'choice_translation_domain' => 'messages', + 'with_seconds' => true, + )); + + $view = $form->createView(); + $this->assertSame('messages', $view['hour']->vars['choice_translation_domain']); + $this->assertSame('messages', $view['minute']->vars['choice_translation_domain']); + $this->assertSame('messages', $view['second']->vars['choice_translation_domain']); + } + + public function testPassChoiceTranslationDomainAsArray() + { + $form = $this->factory->create('Symfony\Component\Form\Extension\Core\Type\TimeType', null, array( + 'choice_translation_domain' => array( + 'hour' => 'foo', + 'second' => 'test', + ), + 'with_seconds' => true, + )); + + $view = $form->createView(); + $this->assertSame('foo', $view['hour']->vars['choice_translation_domain']); + $this->assertFalse($view['minute']->vars['choice_translation_domain']); + $this->assertSame('test', $view['second']->vars['choice_translation_domain']); + } }