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:给定类型为“string or Symfony\Component\Form\FormTypeInterface”、“Symfony\Component\Form\Form”的预期参数。

4

3 回答 3

9

我会在两个单独的字段中创建两个表单类:

<?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);

在您的示例代码中,您试图将整个表单而不是表单类型分配给字段。

希望能帮助到你

于 2012-11-15T22:43:41.050 回答
4

推荐的 symfony 方式是创建单独的 FormType 类,如上所述。但是如果你真的想..

您可以通过调用将动态子表单添加到表单构建器中

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

"form"如果使用 创建此子表单,则此子表单将具有名称$this->createFormBuilder();,这意味着您不能添加以这种方式创建的两个或多个子表单 - 较新的子表单将覆盖以前具有相同名称的子表单。

如果您需要添加多个子表单,则必须使用

$this->get('form.factory')->createNamedBuilder($uniqName)
于 2015-06-15T16:47:09.420 回答
1

无需制作类...在控制器动作中:

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

$form = $this->createFormBuilder()
    ->add($subFormBuilder)
    ->add('number')
    ->getForm();
于 2015-06-22T14:29:09.763 回答