将动态生成的表单嵌入到另一个表单中

Vil*_*ila 3 php forms symfony-forms symfony symfony-2.1

我使用Symfony2.1的FormBuilder在控制器中创建一个动态表单:

$form = $this->createFormBuilder($defaultData);
$form->add('field','text');
Run Code Online (Sandbox Code Playgroud)

我想以同样的方式嵌入另一个表单并将其嵌入主表单中.

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

// Does not work
$form->add('subform', $subForm);
Run Code Online (Sandbox Code Playgroud)

不幸的是,此设置无法正常工作.我找不到任何方法如何将动态生成的子表单添加到动态生成的表单中,如上例所示.

我错过了什么函数调用?

上面的示例代码抛出的异常是

UnexpectedTypeException:给定的类型为"string或Symfony\Component\Form\FormTypeInterface","Symfony\Component\Form\Form"的预期参数.

nas*_*600 9

我会在两个单独的字段中创建两个Form 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';
    }
}
Run Code Online (Sandbox Code Playgroud)

创建完成后,您可以使用此行创建表单,从任何Controller创建表单:

$form = $this->createForm(new FirstFormType());
Run Code Online (Sandbox Code Playgroud)

或版本表格:

$form = $this->createForm(new FirstFormType(), $first);
Run Code Online (Sandbox Code Playgroud)

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

希望能帮助到你


alp*_*aca 5

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

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

$formBuilder->add($subform /* FormBuilder */);
Run Code Online (Sandbox Code Playgroud)

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

如果您需要添加多个子表单,则必须使用以下命令创建它们的构建器

$this->get('form.factory')->createNamedBuilder($uniqName)
Run Code Online (Sandbox Code Playgroud)