Symfony国家/地区

时间:2014-10-18 09:46:32

标签: php symfony internationalization

我想扩展Symfony的国家/地区表单类型,以便它自动设置与当前语言环境对应的所有国家/地区的首选选项。例如,如果区域设置设置为' en'我希望首选的选择包括所有英语国家(美国,JM ..),而如果语言环境是' en_JM'我想将JM添加到首选选项中。

我知道如何在表单中获取语言环境,但我想知道,是否有一种首选方法可以使用Symfony i18n组件通过短语言环境(即:en或de)提取此国家/地区代码列表?

1 个答案:

答案 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';
    }
}