2013-11-01 16 views
11

プリエンファシスされた非エンティティフォームのコレクションを埋め込みたい、ここにコードがあります。最初は親フォームbuildFormメソッドです。symfony2に非エンティティフォームのプリチャージコレクションを埋め込む方法

public function buildForm(FormBuilderInterface $builder, array $options) { 
    $builder->add("example1")->add("example2"); 
    $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { 
     /*some logic to do before adding the collection of forms*/ 
     $form->add('aclAccess', 'collection', array(
      'type' => new ChildFormType(), 
      'allow_add' => true, 
      'mapped' => false, 
      'data' => /* I dont know how to precharge a collection of non-entity forms*/ 
     )); 
    }); 
} 

子フォーム

public function buildForm (FormBuilderInterface $builder, array $options) { 
    $builder->add("test1", "text", array("read_only" => true, "data" => "test")); 
    $builder->->add("test2", "choice", array(
     'choices' => array('opt1' => 'Opt1', 'opt2' => 'Opt2'), 
     'multiple' => true, 
     'expanded' => true 
    )); 
} 

のでbasicly私は私が知っている、各オプショングループがtest1のフィールドの値に依存し、分離形態としてTEST2分野におけるそれらの子のオプションを管理したいですこれは、フォームクラスなしで小枝ですべてをコーディングすることによって行うことができますが、私はフォームクラスを保守性などのphpunitテストを実行するベストプラクティスと思っています...

答えて

13

Using a Form Without a Classのドキュメントによると、アレイ。

あなたはは、これらのいずれかを実行していない場合、そのフォームは配列として データを返します。この例では、$defaultDataはオブジェクトではないため、(data_classオプションは設定されていません)、$form->getData()最終的に は配列を返します。

そして任意の誤解を解消するために、フォームデータについて持っているかもしれない - フォームタイプの基礎となるオブジェクト/クラスは、Entityである必要はありません - あなたは、パブリックプロパティまたはゲッター/セッターで任意のクラスを使用することができますフォームフィールドにマップされます。そのため、Entityクラスは何も特別なものではありません。ORMにそれらを保持する方法を伝える一連のマッピング情報があります。

しかし、戻ってあなたの元の質問に、私はあなたのChildFormTypeがどのようなものか知っているが、のは、それははトリックを行う必要があることを2つのフィールドsequencetitle

$form->add('aclAccess', 'collection', array(
     'type' => new ChildFormType(), 
     'allow_add' => true, 
     'mapped' => false, 
     'data' => array(
      array('sequence' => 1, 'title' => 'Foo') 
      , array('sequence' => 2, 'title' => 'Bar') 
     ) 
    )); 

を持っていると仮定してはいけない

関連する問題