我想扩展Symfony的国家/地区表单类型,以便它自动设置与当前语言环境对应的所有国家/地区的首选选项。例如,如果区域设置设置为' en'我希望首选的选择包括所有英语国家(美国,JM ..),而如果语言环境是' en_JM'我想将JM添加到首选选项中。
我知道如何在表单中获取语言环境,但我想知道,是否有一种首选方法可以使用Symfony i18n组件通过短语言环境(即:en或de)提取此国家/地区代码列表?
答案 0 :(得分:0)
可能有更好的方法来获得所有使用该语言的国家/地区,但您可以为每种语言创建一系列ISO alpha-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';
}
}