Я хотел бы расширить тип формы страны Symfony, чтобы он автоматически устанавливал в качестве предпочтительного варианта все страны, соответствующие текущей локали. Например, если для локали задано значение «en», я бы хотел, чтобы предпочтительные варианты включали все англоязычные страны (США, JM ..), а если для локали — «en_JM», я бы хотел просто добавить JM к предпочтительным вариантам.
Я знаю, как получить языковой стандарт внутри формы, но мне было интересно, есть ли предпочтительный способ извлечь этот список кодов стран по коротким языковым стандартам (т. Е. En или de) с использованием компонентов Symfony i18n?
Возможно, существует лучший способ получить доступ ко всем странам, которые говорят на этом языке, но вы можете создать массив кодов стран ISO альфа-2 для каждого языка и затем передать языковой стандарт в пользовательский тип формы в качестве одного из обязательных параметров.
public function registerAction(Request $request)
{
$builder->add('location', new LocationType(), array(
'locale' => $request->getLocale(),
));
}
Пользовательский тип формы
<?php
namespace Your\Bundle\WebsiteBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class LocationType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$preferredChoices = array(
'en' => array(
'US', // United States
'CA', // Canada
'GB', // United Kingdom
'IE', // Ireland
'AU', // Australia
'ZA', // South Africa
// etc
),
'it' => array(
'IT', // Italy
'CH', // Switzerland
),
'nl' => array(
'NL', // Netherlands
'BE', // Belgium
'SR', // Suriname
'ZA', // South Africa
),
);
$builder
->add('country', 'country', array(
'preferred_choices' => $preferredChoices[$options['locale']],
))
// ->add( more )
;
}
/**
* {@inheritdoc}
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setRequired(array(
'locale',
));
$resolver->setAllowedTypes(array(
'locale' => 'string',
));
}
/**
* {@inheritdoc}
*/
public function getName()
{
return 'location';
}
}
Других решений пока нет …