Skip to content

Commit 1c198a8

Browse files
committed
merge translation parameters with value configured for parent form
1 parent 4f3069b commit 1c198a8

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

Extension/Validator/ViolationMapper/ViolationMapper.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,14 +185,16 @@ public function mapViolation(ConstraintViolation $violation, FormInterface $form
185185

186186
if (null !== $this->translator) {
187187
$form = $scope;
188+
$translationParameters = $form->getConfig()->getOption('label_translation_parameters', []);
188189

189190
do {
190191
$translationDomain = $form->getConfig()->getOption('translation_domain');
192+
$translationParameters = array_merge($form->getConfig()->getOption('label_translation_parameters', []), $translationParameters);
191193
} while (null === $translationDomain && null !== $form = $form->getParent());
192194

193195
$label = $this->translator->trans(
194196
$label,
195-
$scope->getConfig()->getOption('label_translation_parameters', []),
197+
$translationParameters,
196198
$translationDomain
197199
);
198200
}

Tests/Extension/Validator/ViolationMapper/ViolationMapperTest.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1786,6 +1786,44 @@ public function testLabelPlaceholderTranslatedWithTranslationDomainDefinedByPare
17861786
$this->assertSame('Message "translated foo label"', $errors[0]->getMessage());
17871787
}
17881788

1789+
public function testLabelPlaceholderTranslatedWithTranslationParametersMergedFromParentForm()
1790+
{
1791+
$translator = $this->createMock(TranslatorInterface::class);
1792+
$translator->expects($this->any())
1793+
->method('trans')
1794+
->with('foo', [
1795+
'{{ param_defined_in_parent }}' => 'param defined in parent value',
1796+
'{{ param_defined_in_child }}' => 'param defined in child value',
1797+
'{{ param_defined_in_parent_overridden_in_child }}' => 'param defined in parent overridden in child child value',
1798+
])
1799+
->willReturn('translated foo label')
1800+
;
1801+
$this->mapper = new ViolationMapper(null, $translator);
1802+
1803+
$form = $this->getForm('', null, null, [], false, true, [
1804+
'label_translation_parameters' => [
1805+
'{{ param_defined_in_parent }}' => 'param defined in parent value',
1806+
'{{ param_defined_in_parent_overridden_in_child }}' => 'param defined in parent overridden in child parent value',
1807+
],
1808+
]);
1809+
$child = $this->getForm('foo', 'foo', null, [], false, true, [
1810+
'label' => 'foo',
1811+
'label_translation_parameters' => [
1812+
'{{ param_defined_in_child }}' => 'param defined in child value',
1813+
'{{ param_defined_in_parent_overridden_in_child }}' => 'param defined in parent overridden in child child value',
1814+
],
1815+
]);
1816+
$form->add($child);
1817+
1818+
$violation = new ConstraintViolation('Message "{{ label }}"', null, [], null, 'data.foo', null);
1819+
$this->mapper->mapViolation($violation, $form);
1820+
1821+
$errors = iterator_to_array($child->getErrors());
1822+
1823+
$this->assertCount(1, $errors, $child->getName().' should have an error, but has none');
1824+
$this->assertSame('Message "translated foo label"', $errors[0]->getMessage());
1825+
}
1826+
17891827
public function testTranslatorNotCalledWithoutLabel()
17901828
{
17911829
$renderer = $this->getMockBuilder(FormRenderer::class)

0 commit comments

Comments
 (0)