feature #13651 [2.7][Form][choice] added choice_translation_domain to avoid trans options. (aitboudad)
This PR was merged into the 2.7 branch.
Discussion
----------
[2.7][Form][choice] added choice_translation_domain to avoid trans options.
| Q | A
| ------------- | ---
| Bug fix? | no
| New feature? | yes
| BC breaks? | no
| Deprecations? | no
| Fixed tickets | ~
| Tests pass? | yes
| License | MIT
see https://github.com/symfony/symfony/issues/12941#issuecomment-72904531
Commits
-------
5a33c2c
[Form][choice] added choice_translation_domain to avoid trans options.
This commit is contained in:
commit
fb514b6f30
@ -429,6 +429,42 @@ Form
|
||||
Their functionality is covered by the new classes `RadioListMapper` and
|
||||
`CheckboxListMapper`.
|
||||
|
||||
* The ability to translate Doctrine type entries by the translator component
|
||||
is now disabled by default and to enable it you must explicitly set the option
|
||||
"choice_translation_domain" to true
|
||||
|
||||
Before:
|
||||
|
||||
```
|
||||
$form->add('products', 'entity', array(
|
||||
'class' => 'AppBundle/Entity/Product',
|
||||
));
|
||||
```
|
||||
|
||||
After:
|
||||
|
||||
```
|
||||
$form->add('products', 'entity', array(
|
||||
'class' => 'AppBundle/Entity/Product',
|
||||
'choice_translation_domain' => true,
|
||||
));
|
||||
```
|
||||
|
||||
* In the block `choice_widget_options` the `translation_domain` has been replaced
|
||||
with the `choice_translation_domain` option.
|
||||
|
||||
Before:
|
||||
|
||||
```jinja
|
||||
{{ choice.label|trans({}, translation_domain) }}
|
||||
```
|
||||
|
||||
After:
|
||||
|
||||
```jinja
|
||||
{{ choice_translation_domain is sameas(false) ? choice.label : choice.label|trans({}, choice_translation_domain) }}
|
||||
```
|
||||
|
||||
Serializer
|
||||
----------
|
||||
|
||||
|
@ -292,6 +292,7 @@ abstract class DoctrineType extends AbstractType
|
||||
'choice_name' => $choiceName,
|
||||
'choice_value' => $choiceValue,
|
||||
'id_reader' => null, // internal
|
||||
'choice_translation_domain' => false,
|
||||
));
|
||||
|
||||
$resolver->setRequired(array('class'));
|
||||
|
@ -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 -%}
|
||||
|
@ -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 ?>
|
||||
|
@ -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().
|
||||
|
@ -158,6 +158,11 @@ class ChoiceType extends AbstractType
|
||||
*/
|
||||
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')
|
||||
@ -170,6 +175,7 @@ class ChoiceType extends AbstractType
|
||||
'choices' => $choiceListView->choices,
|
||||
'separator' => '-------------------',
|
||||
'placeholder' => null,
|
||||
'choice_translation_domain' => $choiceTranslationDomain,
|
||||
));
|
||||
|
||||
// The decision, whether a choice is selected, is potentially done
|
||||
@ -295,6 +301,14 @@ class ChoiceType extends AbstractType
|
||||
return $options['expanded'];
|
||||
};
|
||||
|
||||
$choiceTranslationDomainNormalizer = function (Options $options, $choiceTranslationDomain) {
|
||||
if (true === $choiceTranslationDomain) {
|
||||
return $options['translation_domain'];
|
||||
}
|
||||
|
||||
return $choiceTranslationDomain;
|
||||
};
|
||||
|
||||
$resolver->setDefaults(array(
|
||||
'multiple' => false,
|
||||
'expanded' => false,
|
||||
@ -317,14 +331,17 @@ class ChoiceType extends AbstractType
|
||||
// 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'));
|
||||
|
@ -24,6 +24,7 @@ class CountryType extends AbstractType
|
||||
{
|
||||
$resolver->setDefaults(array(
|
||||
'choices' => Intl::getRegionBundle()->getCountryNames(),
|
||||
'choice_translation_domain' => false,
|
||||
));
|
||||
}
|
||||
|
||||
|
@ -24,6 +24,7 @@ class CurrencyType extends AbstractType
|
||||
{
|
||||
$resolver->setDefaults(array(
|
||||
'choices' => Intl::getCurrencyBundle()->getCurrencyNames(),
|
||||
'choice_translation_domain' => false,
|
||||
));
|
||||
}
|
||||
|
||||
|
@ -24,6 +24,7 @@ class LanguageType extends AbstractType
|
||||
{
|
||||
$resolver->setDefaults(array(
|
||||
'choices' => Intl::getLanguageBundle()->getLanguageNames(),
|
||||
'choice_translation_domain' => false,
|
||||
));
|
||||
}
|
||||
|
||||
|
@ -24,6 +24,7 @@ class LocaleType extends AbstractType
|
||||
{
|
||||
$resolver->setDefaults(array(
|
||||
'choices' => Intl::getLocaleBundle()->getLocaleNames(),
|
||||
'choice_translation_domain' => false,
|
||||
));
|
||||
}
|
||||
|
||||
|
@ -30,6 +30,7 @@ class TimezoneType extends AbstractType
|
||||
{
|
||||
$resolver->setDefaults(array(
|
||||
'choices' => self::getTimezones(),
|
||||
'choice_translation_domain' => false,
|
||||
));
|
||||
}
|
||||
|
||||
|
@ -840,7 +840,7 @@ abstract class AbstractBootstrap3LayoutTest extends AbstractLayoutTest
|
||||
'/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]
|
||||
'
|
||||
);
|
||||
@ -858,7 +858,7 @@ abstract class AbstractBootstrap3LayoutTest extends AbstractLayoutTest
|
||||
[@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]
|
||||
'
|
||||
);
|
||||
@ -1388,7 +1388,7 @@ abstract class AbstractBootstrap3LayoutTest extends AbstractLayoutTest
|
||||
'/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]
|
||||
'
|
||||
);
|
||||
@ -1402,7 +1402,7 @@ abstract class AbstractBootstrap3LayoutTest extends AbstractLayoutTest
|
||||
'/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]
|
||||
'
|
||||
);
|
||||
@ -1826,8 +1826,8 @@ abstract class AbstractBootstrap3LayoutTest extends AbstractLayoutTest
|
||||
[@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]
|
||||
|
@ -1016,7 +1016,7 @@ abstract class AbstractLayoutTest extends \Symfony\Component\Form\Test\FormInteg
|
||||
$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]
|
||||
'
|
||||
);
|
||||
@ -1033,7 +1033,7 @@ abstract class AbstractLayoutTest extends \Symfony\Component\Form\Test\FormInteg
|
||||
'/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]
|
||||
'
|
||||
);
|
||||
@ -1557,7 +1557,7 @@ abstract class AbstractLayoutTest extends \Symfony\Component\Form\Test\FormInteg
|
||||
$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]
|
||||
'
|
||||
);
|
||||
@ -1570,7 +1570,7 @@ abstract class AbstractLayoutTest extends \Symfony\Component\Form\Test\FormInteg
|
||||
$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]
|
||||
'
|
||||
);
|
||||
@ -1936,8 +1936,8 @@ abstract class AbstractLayoutTest extends \Symfony\Component\Form\Test\FormInteg
|
||||
[@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]
|
||||
|
@ -1331,6 +1331,51 @@ class ChoiceTypeTest extends \Symfony\Component\Form\Test\TypeTestCase
|
||||
$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(
|
||||
|
Reference in New Issue
Block a user