2014-10-18 59 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