Skip to content

Commit

Permalink
[Form][choice] added choice_translation_domain to avoid trans options.
Browse files Browse the repository at this point in the history
  • Loading branch information
aitboudad committed Apr 3, 2015
1 parent be0c98e commit 5a33c2c
Show file tree
Hide file tree
Showing 14 changed files with 228 additions and 123 deletions.
246 changes: 141 additions & 105 deletions UPGRADE-2.7.md

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions src/Symfony/Bridge/Doctrine/Form/Type/DoctrineType.php
Expand Up @@ -292,6 +292,7 @@ public function configureOptions(OptionsResolver $resolver)
'choice_name' => $choiceName,
'choice_value' => $choiceValue,
'id_reader' => null, // internal
'choice_translation_domain' => false,
));

$resolver->setRequired(array('class'));
Expand Down
Expand Up @@ -74,13 +74,13 @@
{%- block choice_widget_options -%}
{% for group_label, choice in options %}
{%- if choice is iterable -%}
<optgroup label="{{ group_label|trans({}, translation_domain) }}">
<optgroup label="{{ choice_translation_domain is sameas(false) ? group_label : group_label|trans({}, choice_translation_domain) }}">
{% set options = choice %}
{{- block('choice_widget_options') -}}
</optgroup>
{%- else -%}
{% set attr = choice.attr %}
<option value="{{ choice.value }}" {{ block('attributes') }}{% if choice is selectedchoice(value) %} selected="selected"{% endif %}>{{ choice.label|trans({}, translation_domain) }}</option>
<option value="{{ choice.value }}" {{ block('attributes') }}{% if choice is selectedchoice(value) %} selected="selected"{% endif %}>{{ choice_translation_domain is sameas(false) ? choice.label : choice.label|trans({}, choice_translation_domain) }}</option>
{%- endif -%}
{% endfor %}
{%- endblock choice_widget_options -%}
Expand Down
Expand Up @@ -2,12 +2,12 @@

$translatorHelper = $view['translator']; // outside of the loop for performance reasons! ?>
<?php $formHelper = $view['form']; ?>
<?php foreach ($choices as $index => $choice): ?>
<?php foreach ($choices as $group_label => $choice): ?>
<?php if (is_array($choice) || $choice instanceof ChoiceGroupView): ?>
<optgroup label="<?php echo $view->escape($translatorHelper->trans($index, array(), $translation_domain)) ?>">
<optgroup label="<?php echo $view->escape(false !== $choice_translation_domain ? $translatorHelper->trans($group_label, array(), $choice_translation_domain) : $group_label) ?>">
<?php echo $formHelper->block($form, 'choice_widget_options', array('choices' => $choice)) ?>
</optgroup>
<?php else: ?>
<option value="<?php echo $view->escape($choice->value) ?>" <?php echo $view['form']->block($form, 'attributes', array('attr' => $choice->attr)) ?><?php if ($is_selected($choice->value, $value)): ?> selected="selected"<?php endif?>><?php echo $view->escape($translatorHelper->trans($choice->label, array(), $translation_domain)) ?></option>
<option value="<?php echo $view->escape($choice->value) ?>" <?php echo $view['form']->block($form, 'attributes', array('attr' => $choice->attr)) ?><?php if ($is_selected($choice->value, $value)): ?> selected="selected"<?php endif?>><?php echo $view->escape(false !== $choice_translation_domain ? $translatorHelper->trans($choice->label, array(), $choice_translation_domain) : $choice->label) ?></option>
<?php endif ?>
<?php endforeach ?>
3 changes: 2 additions & 1 deletion src/Symfony/Component/Form/CHANGELOG.md
Expand Up @@ -4,6 +4,7 @@ CHANGELOG
2.7.0
-----

* added option "choice_translation_domain" to ChoiceType.
* deprecated option "precision" in favor of "scale"
* deprecated the overwriting of AbstractType::setDefaultOptions() in favor of overwriting AbstractType::configureOptions().
* deprecated the overwriting of AbstractTypeExtension::setDefaultOptions() in favor of overwriting AbstractTypeExtension::configureOptions().
Expand All @@ -16,7 +17,7 @@ CHANGELOG
* deprecated ChoiceToBooleanArrayTransformer and ChoicesToBooleanArrayTransformer
* deprecated FixCheckboxInputListener and FixRadioInputListener
* deprecated the "choice_list" option of ChoiceType
* added new options to ChoiceType:
* added new options to ChoiceType:
* "choices_as_values"
* "choice_loader"
* "choice_label"
Expand Down
17 changes: 17 additions & 0 deletions src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php
Expand Up @@ -158,6 +158,11 @@ public function buildForm(FormBuilderInterface $builder, array $options)
*/
public function buildView(FormView $view, FormInterface $form, array $options)
{
$choiceTranslationDomain = $options['choice_translation_domain'];
if ($view->parent && null === $choiceTranslationDomain) {
$choiceTranslationDomain = $view->vars['translation_domain'];
}

/** @var ChoiceListView $choiceListView */
$choiceListView = $form->getConfig()->hasAttribute('choice_list_view')
? $form->getConfig()->getAttribute('choice_list_view')
Expand All @@ -170,6 +175,7 @@ public function buildView(FormView $view, FormInterface $form, array $options)
'choices' => $choiceListView->choices,
'separator' => '-------------------',
'placeholder' => null,
'choice_translation_domain' => $choiceTranslationDomain,
));

// The decision, whether a choice is selected, is potentially done
Expand Down Expand Up @@ -295,6 +301,14 @@ public function configureOptions(OptionsResolver $resolver)
return $options['expanded'];
};

$choiceTranslationDomainNormalizer = function (Options $options, $choiceTranslationDomain) {
if (true === $choiceTranslationDomain) {
return $options['translation_domain'];
}

return $choiceTranslationDomain;
};

$resolver->setDefaults(array(
'multiple' => false,
'expanded' => false,
Expand All @@ -317,14 +331,17 @@ public function configureOptions(OptionsResolver $resolver)
// is manually set to an object.
// See https://github.com/symfony/symfony/pull/5582
'data_class' => null,
'choice_translation_domain' => true,
));

$resolver->setNormalizer('choice_list', $choiceListNormalizer);
$resolver->setNormalizer('empty_value', $placeholderNormalizer);
$resolver->setNormalizer('placeholder', $placeholderNormalizer);
$resolver->setNormalizer('choice_translation_domain', $choiceTranslationDomainNormalizer);

$resolver->setAllowedTypes('choice_list', array('null', 'Symfony\Component\Form\ChoiceList\ChoiceListInterface'));
$resolver->setAllowedTypes('choices', array('null', 'array', '\Traversable'));
$resolver->setAllowedTypes('choice_translation_domain', array('null', 'bool', 'string'));
$resolver->setAllowedTypes('choices_as_values', 'bool');
$resolver->setAllowedTypes('choice_loader', array('null', 'Symfony\Component\Form\ChoiceList\Loader\ChoiceLoaderInterface'));
$resolver->setAllowedTypes('choice_label', array('null', 'callable', 'string', 'Symfony\Component\PropertyAccess\PropertyPath'));
Expand Down
Expand Up @@ -24,6 +24,7 @@ public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'choices' => Intl::getRegionBundle()->getCountryNames(),
'choice_translation_domain' => false,
));
}

Expand Down
Expand Up @@ -24,6 +24,7 @@ public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'choices' => Intl::getCurrencyBundle()->getCurrencyNames(),
'choice_translation_domain' => false,
));
}

Expand Down
Expand Up @@ -24,6 +24,7 @@ public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'choices' => Intl::getLanguageBundle()->getLanguageNames(),
'choice_translation_domain' => false,
));
}

Expand Down
Expand Up @@ -24,6 +24,7 @@ public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'choices' => Intl::getLocaleBundle()->getLocaleNames(),
'choice_translation_domain' => false,
));
}

Expand Down
Expand Up @@ -30,6 +30,7 @@ public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'choices' => self::getTimezones(),
'choice_translation_domain' => false,
));
}

Expand Down
Expand Up @@ -840,7 +840,7 @@ public function testCountry()
'/select
[@name="name"]
[@class="my&class form-control"]
[./option[@value="AT"][@selected="selected"][.="[trans]Austria[/trans]"]]
[./option[@value="AT"][@selected="selected"][.="Austria"]]
[count(./option)>200]
'
);
Expand All @@ -858,7 +858,7 @@ public function testCountryWithPlaceholder()
[@name="name"]
[@class="my&class form-control"]
[./option[@value=""][not(@selected)][not(@disabled)][.="[trans]Select&Country[/trans]"]]
[./option[@value="AT"][@selected="selected"][.="[trans]Austria[/trans]"]]
[./option[@value="AT"][@selected="selected"][.="Austria"]]
[count(./option)>201]
'
);
Expand Down Expand Up @@ -1388,7 +1388,7 @@ public function testLanguage()
'/select
[@name="name"]
[@class="my&class form-control"]
[./option[@value="de"][@selected="selected"][.="[trans]German[/trans]"]]
[./option[@value="de"][@selected="selected"][.="German"]]
[count(./option)>200]
'
);
Expand All @@ -1402,7 +1402,7 @@ public function testLocale()
'/select
[@name="name"]
[@class="my&class form-control"]
[./option[@value="de_AT"][@selected="selected"][.="[trans]German (Austria)[/trans]"]]
[./option[@value="de_AT"][@selected="selected"][.="German (Austria)"]]
[count(./option)>200]
'
);
Expand Down Expand Up @@ -1826,8 +1826,8 @@ public function testTimezone()
[@class="my&class form-control"]
[not(@required)]
[./optgroup
[@label="[trans]Europe[/trans]"]
[./option[@value="Europe/Vienna"][@selected="selected"][.="[trans]Vienna[/trans]"]]
[@label="Europe"]
[./option[@value="Europe/Vienna"][@selected="selected"][.="Vienna"]]
]
[count(./optgroup)>10]
[count(.//option)>200]
Expand Down
12 changes: 6 additions & 6 deletions src/Symfony/Component/Form/Tests/AbstractLayoutTest.php
Expand Up @@ -1016,7 +1016,7 @@ public function testCountry()
$this->assertWidgetMatchesXpath($form->createView(), array(),
'/select
[@name="name"]
[./option[@value="AT"][@selected="selected"][.="[trans]Austria[/trans]"]]
[./option[@value="AT"][@selected="selected"][.="Austria"]]
[count(./option)>200]
'
);
Expand All @@ -1033,7 +1033,7 @@ public function testCountryWithPlaceholder()
'/select
[@name="name"]
[./option[@value=""][not(@selected)][not(@disabled)][.="[trans]Select&Country[/trans]"]]
[./option[@value="AT"][@selected="selected"][.="[trans]Austria[/trans]"]]
[./option[@value="AT"][@selected="selected"][.="Austria"]]
[count(./option)>201]
'
);
Expand Down Expand Up @@ -1557,7 +1557,7 @@ public function testLanguage()
$this->assertWidgetMatchesXpath($form->createView(), array(),
'/select
[@name="name"]
[./option[@value="de"][@selected="selected"][.="[trans]German[/trans]"]]
[./option[@value="de"][@selected="selected"][.="German"]]
[count(./option)>200]
'
);
Expand All @@ -1570,7 +1570,7 @@ public function testLocale()
$this->assertWidgetMatchesXpath($form->createView(), array(),
'/select
[@name="name"]
[./option[@value="de_AT"][@selected="selected"][.="[trans]German (Austria)[/trans]"]]
[./option[@value="de_AT"][@selected="selected"][.="German (Austria)"]]
[count(./option)>200]
'
);
Expand Down Expand Up @@ -1936,8 +1936,8 @@ public function testTimezone()
[@name="name"]
[not(@required)]
[./optgroup
[@label="[trans]Europe[/trans]"]
[./option[@value="Europe/Vienna"][@selected="selected"][.="[trans]Vienna[/trans]"]]
[@label="Europe"]
[./option[@value="Europe/Vienna"][@selected="selected"][.="Vienna"]]
]
[count(./optgroup)>10]
[count(.//option)>200]
Expand Down
Expand Up @@ -1331,6 +1331,51 @@ public function testPassExpandedToView()
$this->assertTrue($view->vars['expanded']);
}

public function testPassChoiceTranslationDomainToView()
{
$form = $this->factory->create('choice', null, array(
'choices' => $this->choices,
));
$view = $form->createView();

$this->assertNull($view->vars['choice_translation_domain']);
}

public function testChoiceTranslationDomainWithTrueValueToView()
{
$form = $this->factory->create('choice', null, array(
'choices' => $this->choices,
'choice_translation_domain' => true,
));
$view = $form->createView();

$this->assertNull($view->vars['choice_translation_domain']);
}

public function testDefaulChoiceTranslationDomainIsSameAsTranslationDomainToView()
{
$form = $this->factory->create('choice', null, array(
'choices' => $this->choices,
'translation_domain' => 'foo',
));
$view = $form->createView();

$this->assertEquals('foo', $view->vars['choice_translation_domain']);
}

public function testInheritChoiceTranslationDomainFromParent()
{
$view = $this->factory
->createNamedBuilder('parent', 'form', null, array(
'translation_domain' => 'domain',
))
->add('child', 'choice')
->getForm()
->createView();

$this->assertEquals('domain', $view['child']->vars['choice_translation_domain']);
}

public function testPlaceholderIsNullByDefaultIfRequired()
{
$form = $this->factory->create('choice', null, array(
Expand Down

0 comments on commit 5a33c2c

Please sign in to comment.