2012-10-23 31 views
3

我使用Symfony2.1的FormBuilder創建在所述控制器的動態形式:嵌入動態產生的形式爲另一種

$form = $this->createFormBuilder($defaultData); 
$form->add('field','text'); 

我要嵌入另一種形式中相同的方式,並與主要形式將其嵌入。

$subForm = $this->createFormBuilder(); 
$subForm->add('subfield','text'); 

// Does not work 
$form->add('subform', $subForm); 

不幸的是,此設置無法正常工作。我找不到任何方式如何將動態生成的子表單添加到動態生成的表單中,如上面的示例。

我錯過了什麼函數調用?

通過上述示例代碼引發的異常是

UnexpectedTypeException:給定類型 「字符串或 的Symfony \元器件\表格\ FormTypeInterface」, 「的Symfony \元器件\表格\表」 的預期參數。

回答

3

推薦symfony的,方法是創建單獨的FormType類,如上面提到的。但是,如果你真的想..

您可以添加動態窗體到表單生成器,通過調用

$formBuilder->add($subform /* FormBuilder */); 

此窗體將名稱"form"如果與$this->createFormBuilder();創建的,這意味着你不能將兩個或以這種方式創建更多的子表單 - 新的一個會用相同的名稱覆蓋前一個。

如果需要添加多個子表單,您必須用

$this->get('form.factory')->createNamedBuilder($uniqName) 
+0

謝謝,這個解決方案非常適合我原來的(和舊的)問題的範圍。關鍵確實是對'FormFactory :: createNamedBuilder()'的調用。 –

9

我會在兩個不同的領域建立兩個表格Clases:

<?php 

namespace Acme\DemoBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class FirstFormType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('field', 'text') 
      ->add('subform', new SecondFormType()); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Acme\DemoBundle\Entity\FirstEntity' 
     )); 
    } 

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



<?php 

namespace Acme\DemoBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class SecondFormType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('subfield', 'text'); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Acme\DemoBundle\Entity\SecondEntity', 
     )); 
    } 

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

此創建後,您可以從該行的任何控制器,用於創建表單創建表單:

$form = $this->createForm(new FirstFormType()); 

或版編輯形式:

$form = $this->createForm(new FirstFormType(), $first); 

在喲你正在嘗試將字段分配給整個表單而不是表單類型的示例代碼。

希望它可以幫助

0

創建他們的建設者沒有製作班......一個控制器的動作裏面:

$subFormBuilder = $this->createFormBuilder(
     null /* default data */, 
     ['label' => 'Sub Form'] /* options */ 
    ) 
    ->add('name'); 

$form = $this->createFormBuilder() 
    ->add($subFormBuilder) 
    ->add('number') 
    ->getForm();