Php 将动态生成的表单嵌入到另一个表单中
我使用Symfony2.1的FormBuilder在控制器中创建动态表单:Php 将动态生成的表单嵌入到另一个表单中,php,forms,symfony,symfony-forms,symfony-2.1,Php,Forms,Symfony,Symfony Forms,Symfony 2.1,我使用Symfony2.1的FormBuilder在控制器中创建动态表单: $form = $this->createFormBuilder($defaultData); $form->add('field','text'); 我想以同样的方式嵌入另一个表单,并将其与主表单一起嵌入 $subForm = $this->createFormBuilder(); $subForm->add('subfield','text'); // Does not work $for
$form = $this->createFormBuilder($defaultData);
$form->add('field','text');
我想以同样的方式嵌入另一个表单,并将其与主表单一起嵌入
$subForm = $this->createFormBuilder();
$subForm->add('subfield','text');
// Does not work
$form->add('subform', $subForm);
不幸的是,此设置无法正常工作。我找不到任何方法来将动态生成的子表单添加到动态生成的表单中,如上面的示例所示
我缺少的函数调用是什么
上面的示例代码引发的异常是
UnexpectedTypeException:应为类型为“字符串或”的参数
Symfony\Component\Form\FormTypeInterface“,
给定“Symfony\Component\Form\Form”
我将在两个单独的字段中创建两个表单类别:
<?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);
在示例代码中,您试图将整个表单而不是表单类型分配给字段
希望它能有所帮助,建议symfony方法是创建单独的FormType类,如上所述。但是如果你真的想 您可以通过调用
$formBuilder->add($subform /* FormBuilder */);
如果使用$This->createFormBuilder()创建此子表单,则其名称将为“表单”
代码>,这意味着您不能添加以这种方式创建的两个或多个子表单-较新的子表单将用相同的名称覆盖以前的子表单
如果需要添加多个子表单,则必须使用
$this->get('form.factory')->createNamedBuilder($uniqName)
不上课。。。在控制器动作中:
$subFormBuilder = $this->createFormBuilder(
null /* default data */,
['label' => 'Sub Form'] /* options */
)
->add('name');
$form = $this->createFormBuilder()
->add($subFormBuilder)
->add('number')
->getForm();
谢谢,这个解决方案非常适合我的原始(和旧)问题的范围。关键确实是调用FormFactory::createNamedBuilder()
。有时你真的不想,但真的需要:)这是最好的答案,不知道为什么另一个有这么多赞成票。