Skip to content

Commit ebd5c70

Browse files
committed
[Form][LanguageType] Add whitelist option
1 parent 07818f2 commit ebd5c70

File tree

2 files changed

+35
-11
lines changed

2 files changed

+35
-11
lines changed

src/Symfony/Component/Form/Extension/Core/Type/LanguageType.php

+18-11
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,25 @@ public function configureOptions(OptionsResolver $resolver)
3030
'choice_loader' => function (Options $options) {
3131
$choiceTranslationLocale = $options['choice_translation_locale'];
3232
$useAlpha3Codes = $options['alpha3'];
33-
$choiceSelfTranslation = $options['choice_self_translation'];
33+
$useChoiceSelfTranslation = true === $options['choice_self_translation'];
34+
$whitelist = $options['whitelist'];
3435

35-
return new IntlCallbackChoiceLoader(function () use ($choiceTranslationLocale, $useAlpha3Codes, $choiceSelfTranslation) {
36-
if (true === $choiceSelfTranslation) {
37-
foreach (Languages::getLanguageCodes() as $alpha2Code) {
38-
try {
39-
$languageCode = $useAlpha3Codes ? Languages::getAlpha3Code($alpha2Code) : $alpha2Code;
40-
$languagesList[$languageCode] = Languages::getName($alpha2Code, $alpha2Code);
41-
} catch (MissingResourceException $e) {
42-
// ignore errors like "Couldn't read the indices for the locale 'meta'"
36+
return new IntlCallbackChoiceLoader(function () use ($choiceTranslationLocale, $useAlpha3Codes, $useChoiceSelfTranslation, $whitelist) {
37+
if ($whitelist) {
38+
$whitelist = array_flip($whitelist);
39+
}
40+
41+
foreach (Languages::getLanguageCodes() as $alpha2Code) {
42+
try {
43+
$languageCode = $useAlpha3Codes ? Languages::getAlpha3Code($alpha2Code) : $alpha2Code;
44+
if ($whitelist && !isset($whitelist[$languageCode])) {
45+
continue;
4346
}
47+
48+
$languagesList[$languageCode] = Languages::getName($alpha2Code, $useChoiceSelfTranslation ? $alpha2Code : $choiceTranslationLocale);
49+
} catch (MissingResourceException $e) {
50+
// ignore errors like "Couldn't read the indices for the locale 'meta'"
4451
}
45-
} else {
46-
$languagesList = $useAlpha3Codes ? Languages::getAlpha3Names($choiceTranslationLocale) : Languages::getNames($choiceTranslationLocale);
4752
}
4853

4954
return array_flip($languagesList);
@@ -53,11 +58,13 @@ public function configureOptions(OptionsResolver $resolver)
5358
'choice_translation_locale' => null,
5459
'alpha3' => false,
5560
'choice_self_translation' => false,
61+
'whitelist' => null,
5662
]);
5763

5864
$resolver->setAllowedTypes('choice_self_translation', ['bool']);
5965
$resolver->setAllowedTypes('choice_translation_locale', ['null', 'string']);
6066
$resolver->setAllowedTypes('alpha3', 'bool');
67+
$resolver->setAllowedTypes('whitelist', ['null', 'array']);
6168

6269
$resolver->setNormalizer('choice_self_translation', function (Options $options, $value) {
6370
if (true === $value && $options['choice_translation_locale']) {

src/Symfony/Component/Form/Tests/Extension/Core/Type/LanguageTypeTest.php

+17
Original file line numberDiff line numberDiff line change
@@ -150,4 +150,21 @@ public function testSubmitNullUsesDefaultEmptyData($emptyData = 'en', $expectedD
150150
{
151151
parent::testSubmitNullUsesDefaultEmptyData($emptyData, $expectedData);
152152
}
153+
154+
public function testWhitelist()
155+
{
156+
$choices = $this->factory
157+
->create(static::TESTED_TYPE, null, [
158+
'whitelist' => [
159+
'fr',
160+
'de',
161+
],
162+
])
163+
->createView()->vars['choices'];
164+
165+
$this->assertContainsEquals(new ChoiceView('fr', 'fr', 'French'), $choices);
166+
$this->assertContainsEquals(new ChoiceView('de', 'de', 'German'), $choices);
167+
$this->assertNotContainsEquals(new ChoiceView('en', 'en', 'English'), $choices);
168+
$this->assertNotContainsEquals(new ChoiceView('es', 'es', 'Spanish'), $choices);
169+
}
153170
}

0 commit comments

Comments
 (0)