2014-10-18 153 views
2

我想延长的Symfony的国家表单类型,因此它会自动设置为首选选择对应于当前区域的所有国家。例如,如果locale设置为'en',我希望首选选项包括所有说英语的国家(US,JM ..),而如果区域设置为'en_JM',我想只将JM添加到首选选项。Symfony的国家的语言环境

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

回答

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'; 
    } 
} 
+0

是THX是有道理的,但我一直在寻找一种方式来获得从内置的国际化系统,阵列,而不必把它写自己...一个选项也许是以[az] _ [AZ]格式获取所有完整语言环境的列表,然后提取所有以我的短语言环境开始的所有内容...但我想知道是否有更好的方法... – smarques 2014-10-18 16:14:25

+0

一种选择是使用 $ variants = \ Symfony \ Component \ Intl \ Intl :: getLocaleBundle() - > getLocaleNames(); ,然后通过仅选择以语言代码开头的元素进行过滤。 仍然是一个大阵列,所以这可能是低效的,最好是创建每个子阵列的缓存。 – smarques 2014-10-19 16:54:01

相关问题