2013-11-01 32 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我要管理的test2的領域這些子選項分離的形式,每個選項組將取決於TEST1字段的值,我知道這可以通過編寫沒有形式類的樹枝中的所有東西來完成,但我認爲表單類是運行phpunit測試的最佳實踐,用於可維護性等...

回答

13

根據關於Using a Form Without a Class的文檔,綁定數據只是一個陣列。

如果做任何的這些,那麼形式將返回數據 作爲數組。在這個例子中,由於$defaultData不是一個對象 (並且沒有data_class選項被設置),$form->getData()最終 返回一個數組。

,及清理您可能對錶格數據的任何誤解 - 底層對象/類的表單類型的並不一定是實體 - 你可以使用任何類的公共屬性或getter/setter方法映射到表單字段。對於這個問題,實體類是沒有什麼特別的自己 - 他們只是有一堆的映射信息,它告訴ORM如何堅持他們。

但是,回到你原來的問題,我不知道你的ChildFormType是什麼樣子,但是讓我們假設它有兩個字段,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') 
     ) 
    )); 

應該做的伎倆