2012-01-04 11 views
1

エンティティがあり、配列タイプ属性があります:productKey.I productKeysを表示するためにフォームに選択肢を追加しようとしました。コードを書きました:Symfony2の選択フォームフィールドに配列をリストする方法

1.myのにformType:

public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder 
       ->add('heading','text',array('label'=>'title')) 
       ->add('productKey','choice',array(
        'required'=>TRUE, 
        'label'=>'choose your product', 
       )); 
    } 

2.In私の製品のエンティティはProductKeyをが定義されています:

/** 
     * @var array $productKey 
     * 
     * @ORM\Column(name="productKey", type="array",nullable=true) 
     */ 
     private $productKey; 

3.In私のコントローラ:

$entity = new Product(); 
$productKey = array("1"=>"one","2"=>"two","3"=>"three"); 
$entity ->setProductKey($productKey); 
$formType = new TicketType($productKey); 
$form = $this->createForm($formType,$entity); 
return array(
    'form'=>$form->createView(), 
    'entity'=>$entity 
); 

私のプロジェクトを実行すると、productKeyの値を表示することはできません!それはちょうど空の選択チース入力に見えます。 は、どのように私はそれを解決できますか?

答えて

6

あなたは、フォームタイプでchoicesオプションを使用して選択肢を指定する必要があります。

public function buildForm(FormBuilder $builder, array $options) 
{ 
    $builder 
     ->add('productKey', 'choice', array(
      'choices' => array('1' => 'one', '2' => 'two', '3' => 'three'), 
     )) 
    ; 
} 

選択肢がサービスから来る場合は、カスタムproduct_keyフォームタイプを作成し、サービスコンテナにそれを設定することができます。

services: 
    product_key_form_type: 
     class: ProductKeyFormType 
     arguments: 
      - @product_key_choices_provider 
     tags: 
      - { name: form.type, alias: product_key } 

このフォーム・タイプは次のようになります。

class ProductKeyFormType extends AbstractType 
{ 
    private $provider; 

    public function __construct($provider) 
    { 
     $this->provider = $provider; 
    } 

    public function getDefaultOptions(array $options) 
    { 
     return array(
      'choices' => $this->provider->getProductKeyChoices(), 
     ); 
    } 

    public function getParent(array $options) 
    { 
     return 'choice'; 
    } 

    public function getName() 
    { 
     return 'product_key'; 
    } 
} 

をそしてそうのようなあなたの現在のフォームタイプで使用することになります。そのすべてが多すぎる場合は、

public function buildForm(FormBuilder $builder, array $options) 
{ 
    $builder 
     ->add('productKey', 'product_key') 
    ; 
} 

フォームにproduct_key_choicesオプションを追加することもできます('product_key_choices' => array()getDefaultOptionsに追加してください)。コントローラから選択肢を渡すだけです。これは起動して実行するのが簡単ですが、フォームを使用するたびにこのオプションを渡す必要があるため移植性が低くなります。

+0

しかし、私が渡したい配列は、サービス内の関数を介して渡されます。この関数はコントローラ内で呼び出されなければなりません。このように: 'code' $ productKey = $ this-> get( 'someservice') - > getProductKey ($ entity); 'code' formTypeクラスで配列を取得する方法はありますか? – Gina

+0

私はいくつかの他のオプションで私の答えを更新しました。 –

+0

ありがとうございます。私は質問を解決するために簡単な方法を使用しました。私はformTypeクラスに構造関数を追加し、FormTypeを新しいものにすると、配列が渡されます。 – Gina

関連する問題