diff --git a/src/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php b/src/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php index 2869c2b804..42e210400e 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php @@ -1366,6 +1366,180 @@ class EntityTypeTest extends BaseTypeTest $this->assertNull($view['child']->vars['translation_domain']); } + public function testPassLabelTranslationParametersToView() + { + $view = $this->factory->create(static::TESTED_TYPE, null, [ + 'label_translation_parameters' => ['%param%' => 'value'], + 'em' => 'default', + 'class' => self::SINGLE_IDENT_CLASS, + ]) + ->createView(); + + $this->assertSame(['%param%' => 'value'], $view->vars['label_translation_parameters']); + } + + public function testPassHelpTranslationParametersToView() + { + $view = $this->factory->create(static::TESTED_TYPE, null, [ + 'help_translation_parameters' => ['%param%' => 'value'], + 'em' => 'default', + 'class' => self::SINGLE_IDENT_CLASS, + ]) + ->createView(); + + $this->assertSame(['%param%' => 'value'], $view->vars['help_translation_parameters']); + } + + public function testPassAttrTranslationParametersToView() + { + $view = $this->factory->create(static::TESTED_TYPE, null, [ + 'attr_translation_parameters' => ['%param%' => 'value'], + 'em' => 'default', + 'class' => self::SINGLE_IDENT_CLASS, + ]) + ->createView(); + + $this->assertSame(['%param%' => 'value'], $view->vars['attr_translation_parameters']); + } + + public function testInheritLabelTranslationParametersFromParent() + { + $view = $this->factory + ->createNamedBuilder('parent', FormTypeTest::TESTED_TYPE, null, [ + 'label_translation_parameters' => ['%param%' => 'value'], + ]) + ->add('child', static::TESTED_TYPE, [ + 'em' => 'default', + 'class' => self::SINGLE_IDENT_CLASS, + ]) + ->getForm() + ->createView(); + + $this->assertEquals(['%param%' => 'value'], $view['child']->vars['label_translation_parameters']); + } + + public function testInheritHelpTranslationParametersFromParent() + { + $view = $this->factory + ->createNamedBuilder('parent', FormTypeTest::TESTED_TYPE, null, [ + 'help_translation_parameters' => ['%param%' => 'value'], + ]) + ->add('child', static::TESTED_TYPE, [ + 'em' => 'default', + 'class' => self::SINGLE_IDENT_CLASS, + ]) + ->getForm() + ->createView(); + + $this->assertEquals(['%param%' => 'value'], $view['child']->vars['help_translation_parameters']); + } + + public function testInheritAttrTranslationParametersFromParent() + { + $view = $this->factory + ->createNamedBuilder('parent', FormTypeTest::TESTED_TYPE, null, [ + 'attr_translation_parameters' => ['%param%' => 'value'], + ]) + ->add('child', static::TESTED_TYPE, [ + 'em' => 'default', + 'class' => self::SINGLE_IDENT_CLASS, + ]) + ->getForm() + ->createView(); + + $this->assertEquals(['%param%' => 'value'], $view['child']->vars['attr_translation_parameters']); + } + + public function testPreferOwnLabelTranslationParameters() + { + $view = $this->factory + ->createNamedBuilder('parent', FormTypeTest::TESTED_TYPE, null, [ + 'label_translation_parameters' => ['%parent_param%' => 'parent_value', '%override_param%' => 'parent_override_value'], + ]) + ->add('child', static::TESTED_TYPE, [ + 'label_translation_parameters' => ['%override_param%' => 'child_value'], + 'em' => 'default', + 'class' => self::SINGLE_IDENT_CLASS, + ]) + ->getForm() + ->createView(); + + $this->assertEquals(['%parent_param%' => 'parent_value', '%override_param%' => 'child_value'], $view['child']->vars['label_translation_parameters']); + } + + public function testPreferOwnHelpTranslationParameters() + { + $view = $this->factory + ->createNamedBuilder('parent', FormTypeTest::TESTED_TYPE, null, [ + 'help_translation_parameters' => ['%parent_param%' => 'parent_value', '%override_param%' => 'parent_override_value'], + ]) + ->add('child', static::TESTED_TYPE, [ + 'help_translation_parameters' => ['%override_param%' => 'child_value'], + 'em' => 'default', + 'class' => self::SINGLE_IDENT_CLASS, + ]) + ->getForm() + ->createView(); + + $this->assertEquals(['%parent_param%' => 'parent_value', '%override_param%' => 'child_value'], $view['child']->vars['help_translation_parameters']); + } + + public function testPreferOwnAttrTranslationParameters() + { + $view = $this->factory + ->createNamedBuilder('parent', FormTypeTest::TESTED_TYPE, null, [ + 'attr_translation_parameters' => ['%parent_param%' => 'parent_value', '%override_param%' => 'parent_override_value'], + ]) + ->add('child', static::TESTED_TYPE, [ + 'attr_translation_parameters' => ['%override_param%' => 'child_value'], + 'em' => 'default', + 'class' => self::SINGLE_IDENT_CLASS, + ]) + ->getForm() + ->createView(); + + $this->assertEquals(['%parent_param%' => 'parent_value', '%override_param%' => 'child_value'], $view['child']->vars['attr_translation_parameters']); + } + + public function testDefaultLabelTranslationParameters() + { + $view = $this->factory->createNamedBuilder('parent', FormTypeTest::TESTED_TYPE) + ->add('child', static::TESTED_TYPE, [ + 'em' => 'default', + 'class' => self::SINGLE_IDENT_CLASS, + ]) + ->getForm() + ->createView(); + + $this->assertEquals([], $view['child']->vars['label_translation_parameters']); + } + + public function testDefaultHelpTranslationParameters() + { + $view = $this->factory->createNamedBuilder('parent', FormTypeTest::TESTED_TYPE) + ->add('child', static::TESTED_TYPE, [ + 'em' => 'default', + 'class' => self::SINGLE_IDENT_CLASS, + ]) + ->getForm() + ->createView(); + + $this->assertEquals([], $view['child']->vars['help_translation_parameters']); + } + + public function testDefaultAttrTranslationParameters() + { + $view = $this->factory->createNamedBuilder('parent', FormTypeTest::TESTED_TYPE) + ->add('child', static::TESTED_TYPE, [ + 'em' => 'default', + 'class' => self::SINGLE_IDENT_CLASS, + ]) + ->getForm() + ->createView(); + + $this->assertEquals([], $view['child']->vars['attr_translation_parameters']); + } + public function testPassLabelToView() { $view = $this->factory->createNamed('__test___field', static::TESTED_TYPE, null, [ diff --git a/src/Symfony/Bridge/Doctrine/composer.json b/src/Symfony/Bridge/Doctrine/composer.json index 7c0bed953d..849d2069ad 100644 --- a/src/Symfony/Bridge/Doctrine/composer.json +++ b/src/Symfony/Bridge/Doctrine/composer.json @@ -27,7 +27,7 @@ "require-dev": { "symfony/stopwatch": "~3.4|~4.0", "symfony/dependency-injection": "~3.4|~4.0", - "symfony/form": "~3.4|~4.0", + "symfony/form": "~4.3", "symfony/http-kernel": "~3.4|~4.0", "symfony/messenger": "~4.2", "symfony/property-access": "~3.4|~4.0", @@ -47,6 +47,7 @@ "conflict": { "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", "symfony/dependency-injection": "<3.4", + "symfony/form": "<4.3", "symfony/messenger": "<4.2" }, "suggest": { diff --git a/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_3_layout.html.twig b/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_3_layout.html.twig index eaa61a7cfe..95f371b567 100644 --- a/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_3_layout.html.twig +++ b/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_3_layout.html.twig @@ -187,9 +187,9 @@ {%- endif -%} {%- else -%} {%- if help_html is same as(false) -%} - {{- help|trans({}, translation_domain) -}} + {{- help|trans(help_translation_parameters, translation_domain) -}} {%- else -%} - {{- help|trans({}, translation_domain)|raw -}} + {{- help|trans(help_translation_parameters, translation_domain)|raw -}} {%- endif -%} {%- endif -%} diff --git a/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_layout.html.twig b/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_layout.html.twig index 1b79dbcac3..0b301b42cc 100644 --- a/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_layout.html.twig +++ b/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_layout.html.twig @@ -219,7 +219,7 @@ {% set label = name|humanize %} {%- endif -%} {%- endif -%} - <{{ element|default('label') }}{% if label_attr %}{% with { attr: label_attr } %}{{ block('attributes') }}{% endwith %}{% endif %}>{{ translation_domain is same as(false) ? label : label|trans({}, translation_domain) }}{% block form_label_errors %}{{- form_errors(form) -}}{% endblock form_label_errors %} + <{{ element|default('label') }}{% if label_attr %}{% with { attr: label_attr } %}{{ block('attributes') }}{% endwith %}{% endif %}>{{ translation_domain is same as(false) ? label : label|trans(label_translation_parameters, translation_domain) }}{% block form_label_errors %}{{- form_errors(form) -}}{% endblock form_label_errors %} {%- else -%} {%- if errors|length > 0 -%}
@@ -312,9 +312,9 @@ {%- endif -%} {%- else -%} {%- if help_html is same as(false) -%} - {{- help|trans({}, translation_domain) -}} + {{- help|trans(help_translation_parameters, translation_domain) -}} {%- else -%} - {{- help|trans({}, translation_domain)|raw -}} + {{- help|trans(help_translation_parameters, translation_domain)|raw -}} {%- endif -%} {%- endif -%} diff --git a/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig b/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig index 4013e0021a..234faab533 100644 --- a/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig +++ b/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig @@ -232,7 +232,7 @@ {% set label = name|humanize %} {%- endif -%} {%- endif -%} - + {%- endblock button_widget -%} {%- block submit_widget -%} @@ -279,7 +279,7 @@ {%- if translation_domain is same as(false) -%} {{- label -}} {%- else -%} - {{- label|trans({}, translation_domain) -}} + {{- label|trans(label_translation_parameters, translation_domain) -}} {%- endif -%} {%- endif -%} @@ -301,9 +301,9 @@ {%- endif -%} {%- else -%} {%- if help_html is same as(false) -%} - {{- help|trans({}, translation_domain) -}} + {{- help|trans(help_translation_parameters, translation_domain) -}} {%- else -%} - {{- help|trans({}, translation_domain)|raw -}} + {{- help|trans(help_translation_parameters, translation_domain)|raw -}} {%- endif -%} {%- endif -%}

@@ -433,7 +433,7 @@ {%- for attrname, attrvalue in attr -%} {{- " " -}} {%- if attrname in ['placeholder', 'title'] -%} - {{- attrname }}="{{ translation_domain is same as(false) ? attrvalue : attrvalue|trans({}, translation_domain) }}" + {{- attrname }}="{{ translation_domain is same as(false) ? attrvalue : attrvalue|trans(attr_translation_parameters, translation_domain) }}" {%- elseif attrvalue is same as(true) -%} {{- attrname }}="{{ attrname }}" {%- elseif attrvalue is not same as(false) -%} diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/Fixtures/StubTranslator.php b/src/Symfony/Bridge/Twig/Tests/Extension/Fixtures/StubTranslator.php index 55c0dfa18a..9abd707b40 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/Fixtures/StubTranslator.php +++ b/src/Symfony/Bridge/Twig/Tests/Extension/Fixtures/StubTranslator.php @@ -17,6 +17,6 @@ class StubTranslator implements TranslatorInterface { public function trans($id, array $parameters = [], $domain = null, $locale = null) { - return '[trans]'.$id.'[/trans]'; + return '[trans]'.strtr($id, $parameters).'[/trans]'; } } diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/Fixtures/templates/form/custom_widgets.html.twig b/src/Symfony/Bridge/Twig/Tests/Extension/Fixtures/templates/form/custom_widgets.html.twig index 4eda8d76d3..9375051e47 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/Fixtures/templates/form/custom_widgets.html.twig +++ b/src/Symfony/Bridge/Twig/Tests/Extension/Fixtures/templates/form/custom_widgets.html.twig @@ -11,7 +11,7 @@ {% if label is empty %} {% set label = name|humanize %} {% endif %} - + {% endspaceless %} {% endblock _names_entry_label %} @@ -20,6 +20,6 @@ {% if label is empty %} {% set label = name|humanize %} {% endif %} - + {% endspaceless %} {% endblock _name_c_entry_label %} diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/attributes.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/attributes.html.php index dbed8eff72..047d342a8d 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/attributes.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/attributes.html.php @@ -1,6 +1,6 @@ $v): ?> -escape($k), $view->escape(false !== $translation_domain ? $view['translator']->trans($v, [], $translation_domain) : $v)) ?> +escape($k), $view->escape(false !== $translation_domain ? $view['translator']->trans($v, $attr_translation_parameters, $translation_domain) : $v)) ?> escape($k), $view->escape($k)) ?> diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/button_widget.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/button_widget.html.php index 2a10aa0f41..42a7c5db02 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/button_widget.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/button_widget.html.php @@ -1,4 +1,4 @@ $name, '%id%' => $id]) : $view['form']->humanize($name); } ?> - + diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_help.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_help.html.php index fc4b24726c..9e3ed9b6c6 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_help.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_help.html.php @@ -1,6 +1,6 @@ - trans($help, [], $translation_domain) : $help; ?> + trans($help, $help_translation_parameters, $translation_domain) : $help; ?> escape($help) : $help ?>

block($form, 'attributes', ['attr' => $help_attr]); ?>>

diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_label.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_label.html.php index 8e8e5b9498..b3465042ef 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_label.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_label.html.php @@ -4,5 +4,5 @@ $name, '%id%' => $id]) : $view['form']->humanize($name); } ?> -block($form, 'attributes', ['attr' => $label_attr]); } ?>>escape(false !== $translation_domain ? $view['translator']->trans($label, [], $translation_domain) : $label) ?> +block($form, 'attributes', ['attr' => $label_attr]); } ?>>escape(false !== $translation_domain ? $view['translator']->trans($label, $label_translation_parameters, $translation_domain) : $label) ?> diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Templating/Helper/Fixtures/StubTranslator.php b/src/Symfony/Bundle/FrameworkBundle/Tests/Templating/Helper/Fixtures/StubTranslator.php index 9175b37115..402b3a886c 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Templating/Helper/Fixtures/StubTranslator.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Templating/Helper/Fixtures/StubTranslator.php @@ -17,6 +17,6 @@ class StubTranslator implements TranslatorInterface { public function trans($id, array $parameters = [], $domain = null, $locale = null) { - return '[trans]'.$id.'[/trans]'; + return '[trans]'.strtr($id, $parameters).'[/trans]'; } } diff --git a/src/Symfony/Component/Form/CHANGELOG.md b/src/Symfony/Component/Form/CHANGELOG.md index b6d83d613b..142a1d92fa 100644 --- a/src/Symfony/Component/Form/CHANGELOG.md +++ b/src/Symfony/Component/Form/CHANGELOG.md @@ -8,6 +8,30 @@ CHANGELOG option is set to `single_text` * added `block_prefix` option to `BaseType`. * added `help_html` option to display the `help` text as HTML. + * added `label_translation_parameters`, `attr_translation_parameters`, `help_translation_parameters` options + to `FormType` to pass translation parameters to form labels, attributes (`placeholder` and `title`) and help text respectively. + The passed parameters will replace placeholders in translation messages. + + ```php + class OrderType extends AbstractType + { + public function buildForm(FormBuilderInterface $builder, array $options) + { + $builder->add('comment', TextType::class, [ + 'label' => 'Comment to the order to %company%', + 'label_translation_parameters' => [ + '%company%' => 'Acme', + ], + 'help' => 'The address of the %company% is %address%', + 'help_translation_parameters' => [ + '%company%' => 'Acme Ltd.', + '%address%' => '4 Form street, Symfonyville', + ], + ]) + } + } + ``` + 4.2.0 ----- diff --git a/src/Symfony/Component/Form/Extension/Core/Type/BaseType.php b/src/Symfony/Component/Form/Extension/Core/Type/BaseType.php index cac3ae2311..f6c222a1be 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/BaseType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/BaseType.php @@ -44,6 +44,8 @@ abstract class BaseType extends AbstractType $name = $form->getName(); $blockName = $options['block_name'] ?: $form->getName(); $translationDomain = $options['translation_domain']; + $labelTranslationParameters = $options['label_translation_parameters']; + $attrTranslationParameters = $options['attr_translation_parameters']; $labelFormat = $options['label_format']; if ($view->parent) { @@ -61,6 +63,9 @@ abstract class BaseType extends AbstractType $translationDomain = $view->parent->vars['translation_domain']; } + $labelTranslationParameters = array_merge($view->parent->vars['label_translation_parameters'], $labelTranslationParameters); + $attrTranslationParameters = array_merge($view->parent->vars['attr_translation_parameters'], $attrTranslationParameters); + if (!$labelFormat) { $labelFormat = $view->parent->vars['label_format']; } @@ -97,6 +102,8 @@ abstract class BaseType extends AbstractType 'block_prefixes' => $blockPrefixes, 'unique_block_prefix' => $uniqueBlockPrefix, 'translation_domain' => $translationDomain, + 'label_translation_parameters' => $labelTranslationParameters, + 'attr_translation_parameters' => $attrTranslationParameters, // Using the block name here speeds up performance in collection // forms, where each entry has the same full block name. // Including the type is important too, because if rows of a @@ -118,6 +125,8 @@ abstract class BaseType extends AbstractType 'disabled' => false, 'label' => null, 'label_format' => null, + 'label_translation_parameters' => [], + 'attr_translation_parameters' => [], 'attr' => [], 'translation_domain' => null, 'auto_initialize' => true, diff --git a/src/Symfony/Component/Form/Extension/Core/Type/FormType.php b/src/Symfony/Component/Form/Extension/Core/Type/FormType.php index 3934416ff6..208d44f5fa 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/FormType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/FormType.php @@ -68,6 +68,7 @@ class FormType extends BaseType parent::buildView($view, $form, $options); $name = $form->getName(); + $helpTranslationParameters = $options['help_translation_parameters']; if ($view->parent) { if ('' === $name) { @@ -78,6 +79,8 @@ class FormType extends BaseType if (!isset($view->vars['attr']['readonly']) && isset($view->parent->vars['attr']['readonly']) && false !== $view->parent->vars['attr']['readonly']) { $view->vars['attr']['readonly'] = true; } + + $helpTranslationParameters = array_merge($view->parent->vars['help_translation_parameters'], $helpTranslationParameters); } $formConfig = $form->getConfig(); @@ -92,6 +95,7 @@ class FormType extends BaseType 'help' => $options['help'], 'help_attr' => $options['help_attr'], 'help_html' => $options['help_html'], + 'help_translation_parameters' => $helpTranslationParameters, 'compound' => $formConfig->getCompound(), 'method' => $formConfig->getMethod(), 'action' => $formConfig->getAction(), @@ -185,6 +189,7 @@ class FormType extends BaseType 'help' => null, 'help_attr' => [], 'help_html' => false, + 'help_translation_parameters' => [], ]); $resolver->setAllowedTypes('label_attr', 'array'); diff --git a/src/Symfony/Component/Form/Tests/AbstractLayoutTest.php b/src/Symfony/Component/Form/Tests/AbstractLayoutTest.php index 24d8dbcf94..43ff2ded12 100644 --- a/src/Symfony/Component/Form/Tests/AbstractLayoutTest.php +++ b/src/Symfony/Component/Form/Tests/AbstractLayoutTest.php @@ -2572,6 +2572,82 @@ abstract class AbstractLayoutTest extends FormIntegrationTestCase [@type="color"] [@name="name"] [@value="#0000ff"] +' + ); + } + + public function testLabelWithTranslationParameters() + { + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $html = $this->renderLabel($form->createView(), 'Address is %address%', [ + 'label_translation_parameters' => [ + '%address%' => 'Paris, rue de la Paix', + ], + ]); + + $this->assertMatchesXpath($html, + '/label + [@for="name"] + [.="[trans]Address is Paris, rue de la Paix[/trans]"] +' + ); + } + + public function testHelpWithTranslationParameters() + { + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'help' => 'for company %company%', + 'help_translation_parameters' => [ + '%company%' => 'ACME Ltd.', + ], + ]); + $html = $this->renderHelp($form->createView()); + + $this->assertMatchesXpath($html, + '/* + [@id="name_help"] + [.="[trans]for company ACME Ltd.[/trans]"] +' + ); + } + + public function testAttributesWithTranslationParameters() + { + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'attr' => [ + 'title' => 'Message to %company%', + 'placeholder' => 'Enter a message to %company%', + ], + 'attr_translation_parameters' => [ + '%company%' => 'ACME Ltd.', + ], + ]); + $html = $this->renderWidget($form->createView()); + + $this->assertMatchesXpath($html, + '/input + [@title="[trans]Message to ACME Ltd.[/trans]"] + [@placeholder="[trans]Enter a message to ACME Ltd.[/trans]"] +' + ); + } + + public function testButtonWithTranslationParameters() + { + $form = $this->factory->createNamedBuilder('myform') + ->add('mybutton', 'Symfony\Component\Form\Extension\Core\Type\ButtonType', [ + 'label' => 'Submit to %company%', + 'label_translation_parameters' => [ + '%company%' => 'ACME Ltd.', + ], + ]) + ->getForm(); + $view = $form->get('mybutton')->createView(); + $html = $this->renderWidget($view, ['label_format' => 'form.%name%']); + + $this->assertMatchesXpath($html, + '/button + [.="[trans]Submit to ACME Ltd.[/trans]"] ' ); } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/BaseTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/BaseTypeTest.php index 92eff38669..5bd97257a6 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/BaseTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/BaseTypeTest.php @@ -119,6 +119,102 @@ abstract class BaseTypeTest extends TypeTestCase $this->assertNull($view['child']->vars['translation_domain']); } + public function testPassLabelTranslationParametersToView() + { + $view = $this->factory->create($this->getTestedType(), null, [ + 'label_translation_parameters' => ['%param%' => 'value'], + ]) + ->createView(); + + $this->assertSame(['%param%' => 'value'], $view->vars['label_translation_parameters']); + } + + public function testPassAttrTranslationParametersToView() + { + $view = $this->factory->create($this->getTestedType(), null, [ + 'attr_translation_parameters' => ['%param%' => 'value'], + ]) + ->createView(); + + $this->assertSame(['%param%' => 'value'], $view->vars['attr_translation_parameters']); + } + + public function testInheritLabelTranslationParametersFromParent() + { + $view = $this->factory + ->createNamedBuilder('parent', FormTypeTest::TESTED_TYPE, null, [ + 'label_translation_parameters' => ['%param%' => 'value'], + ]) + ->add('child', $this->getTestedType()) + ->getForm() + ->createView(); + + $this->assertEquals(['%param%' => 'value'], $view['child']->vars['label_translation_parameters']); + } + + public function testInheritAttrTranslationParametersFromParent() + { + $view = $this->factory + ->createNamedBuilder('parent', FormTypeTest::TESTED_TYPE, null, [ + 'attr_translation_parameters' => ['%param%' => 'value'], + ]) + ->add('child', $this->getTestedType()) + ->getForm() + ->createView(); + + $this->assertEquals(['%param%' => 'value'], $view['child']->vars['attr_translation_parameters']); + } + + public function testPreferOwnLabelTranslationParameters() + { + $view = $this->factory + ->createNamedBuilder('parent', FormTypeTest::TESTED_TYPE, null, [ + 'label_translation_parameters' => ['%parent_param%' => 'parent_value', '%override_param%' => 'parent_override_value'], + ]) + ->add('child', $this->getTestedType(), [ + 'label_translation_parameters' => ['%override_param%' => 'child_value'], + ]) + ->getForm() + ->createView(); + + $this->assertEquals(['%parent_param%' => 'parent_value', '%override_param%' => 'child_value'], $view['child']->vars['label_translation_parameters']); + } + + public function testPreferOwnAttrTranslationParameters() + { + $view = $this->factory + ->createNamedBuilder('parent', FormTypeTest::TESTED_TYPE, null, [ + 'attr_translation_parameters' => ['%parent_param%' => 'parent_value', '%override_param%' => 'parent_override_value'], + ]) + ->add('child', $this->getTestedType(), [ + 'attr_translation_parameters' => ['%override_param%' => 'child_value'], + ]) + ->getForm() + ->createView(); + + $this->assertEquals(['%parent_param%' => 'parent_value', '%override_param%' => 'child_value'], $view['child']->vars['attr_translation_parameters']); + } + + public function testDefaultLabelTranslationParameters() + { + $view = $this->factory->createNamedBuilder('parent', FormTypeTest::TESTED_TYPE) + ->add('child', $this->getTestedType()) + ->getForm() + ->createView(); + + $this->assertEquals([], $view['child']->vars['label_translation_parameters']); + } + + public function testDefaultAttrTranslationParameters() + { + $view = $this->factory->createNamedBuilder('parent', FormTypeTest::TESTED_TYPE) + ->add('child', $this->getTestedType()) + ->getForm() + ->createView(); + + $this->assertEquals([], $view['child']->vars['attr_translation_parameters']); + } + public function testPassLabelToView() { $view = $this->factory->createNamed('__test___field', $this->getTestedType(), null, ['label' => 'My label']) diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php index 47e7ae66be..0c7f97dc1e 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php @@ -651,4 +651,52 @@ class FormTypeTest extends BaseTypeTest $this->assertSame(['form', 'child', '_parent_child'], $view['child']->vars['block_prefixes']); } + + public function testDefaultHelpTranslationParameters() + { + $view = $this->factory->createNamedBuilder('parent', self::TESTED_TYPE) + ->add('child', $this->getTestedType()) + ->getForm() + ->createView(); + + $this->assertEquals([], $view['child']->vars['help_translation_parameters']); + } + + public function testPassHelpTranslationParametersToView() + { + $view = $this->factory->create($this->getTestedType(), null, [ + 'help_translation_parameters' => ['%param%' => 'value'], + ]) + ->createView(); + + $this->assertSame(['%param%' => 'value'], $view->vars['help_translation_parameters']); + } + + public function testInheritHelpTranslationParametersFromParent() + { + $view = $this->factory + ->createNamedBuilder('parent', self::TESTED_TYPE, null, [ + 'help_translation_parameters' => ['%param%' => 'value'], + ]) + ->add('child', $this->getTestedType()) + ->getForm() + ->createView(); + + $this->assertEquals(['%param%' => 'value'], $view['child']->vars['help_translation_parameters']); + } + + public function testPreferOwnHelpTranslationParameters() + { + $view = $this->factory + ->createNamedBuilder('parent', self::TESTED_TYPE, null, [ + 'help_translation_parameters' => ['%parent_param%' => 'parent_value', '%override_param%' => 'parent_override_value'], + ]) + ->add('child', $this->getTestedType(), [ + 'help_translation_parameters' => ['%override_param%' => 'child_value'], + ]) + ->getForm() + ->createView(); + + $this->assertEquals(['%parent_param%' => 'parent_value', '%override_param%' => 'child_value'], $view['child']->vars['help_translation_parameters']); + } } diff --git a/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_1.json b/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_1.json index c0f335f27e..36d74742a7 100644 --- a/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_1.json +++ b/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_1.json @@ -30,6 +30,7 @@ "action", "allow_file_upload", "attr", + "attr_translation_parameters", "auto_initialize", "block_name", "block_prefix", @@ -39,10 +40,12 @@ "help", "help_attr", "help_html", + "help_translation_parameters", "inherit_data", "label", "label_attr", "label_format", + "label_translation_parameters", "mapped", "method", "post_max_size_message", diff --git a/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_1.txt b/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_1.txt index 49fba719da..ed393b7e7f 100644 --- a/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_1.txt +++ b/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_1.txt @@ -2,35 +2,38 @@ Symfony\Component\Form\Extension\Core\Type\ChoiceType (Block prefix: "choice") ============================================================================== - --------------------------- -------------------- ------------------------- ----------------------- - Options Overridden options Parent options Extension options - --------------------------- -------------------- ------------------------- ----------------------- - choice_attr FormType FormType FormTypeCsrfExtension - choice_label -------------------- ------------------------- ----------------------- - choice_loader compound action csrf_field_name - choice_name data_class allow_file_upload csrf_message - choice_translation_domain empty_data attr csrf_protection - choice_value error_bubbling auto_initialize csrf_token_id - choices trim block_name csrf_token_manager - expanded block_prefix - group_by by_reference - multiple data - placeholder disabled - preferred_choices help - help_attr - help_html - inherit_data - label - label_attr - label_format - mapped - method - post_max_size_message - property_path - required - translation_domain - upload_max_size_message - --------------------------- -------------------- ------------------------- ----------------------- + --------------------------- -------------------- ------------------------------ ----------------------- + Options Overridden options Parent options Extension options + --------------------------- -------------------- ------------------------------ ----------------------- + choice_attr FormType FormType FormTypeCsrfExtension + choice_label -------------------- ------------------------------ ----------------------- + choice_loader compound action csrf_field_name + choice_name data_class allow_file_upload csrf_message + choice_translation_domain empty_data attr csrf_protection + choice_value error_bubbling attr_translation_parameters csrf_token_id + choices trim auto_initialize csrf_token_manager + expanded block_name + group_by block_prefix + multiple by_reference + placeholder data + preferred_choices disabled + help + help_attr + help_html + help_translation_parameters + inherit_data + label + label_attr + label_format + label_translation_parameters + mapped + method + post_max_size_message + property_path + required + translation_domain + upload_max_size_message + --------------------------- -------------------- ------------------------------ ----------------------- Parent types ------------ diff --git a/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_2.json b/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_2.json index 49fcd8bd13..149e73da13 100644 --- a/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_2.json +++ b/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_2.json @@ -6,6 +6,7 @@ "action", "allow_file_upload", "attr", + "attr_translation_parameters", "auto_initialize", "block_name", "block_prefix", @@ -19,10 +20,12 @@ "help", "help_attr", "help_html", + "help_translation_parameters", "inherit_data", "label", "label_attr", "label_format", + "label_translation_parameters", "mapped", "method", "post_max_size_message", diff --git a/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_2.txt b/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_2.txt index 732c0d2f7c..79a97f23d3 100644 --- a/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_2.txt +++ b/src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_2.txt @@ -2,36 +2,39 @@ Symfony\Component\Form\Extension\Core\Type\FormType (Block prefix: "form") ========================================================================== - ------------------------- - Options - ------------------------- - action - allow_file_upload - attr - auto_initialize - block_name - block_prefix - by_reference - compound - data - data_class - disabled - empty_data - error_bubbling - help - help_attr - help_html - inherit_data - label - label_attr - label_format - mapped - method - post_max_size_message - property_path - required - translation_domain - trim - upload_max_size_message - ------------------------- + ------------------------------ + Options + ------------------------------ + action + allow_file_upload + attr + attr_translation_parameters + auto_initialize + block_name + block_prefix + by_reference + compound + data + data_class + disabled + empty_data + error_bubbling + help + help_attr + help_html + help_translation_parameters + inherit_data + label + label_attr + label_format + label_translation_parameters + mapped + method + post_max_size_message + property_path + required + translation_domain + trim + upload_max_size_message + ------------------------------