我找到了一个解决方法,因为不使用 JavaScript 似乎不可能自动呈现表单。
我不是一次渲染整个表单,而是使用{{ form_widget(form) }}
逐个字段渲染并使用{{ form_widget(form.categoy.vars.prototype) }}
来渲染 Category 集合。模板代码如下所示:
<div id="form">
{{ form_start(form) }}
{{ form_errors(form) }}
...
{{ form_row(form.name) }}
{{ form_row(form.price) }}
...
<h2>Categories</h2>
{{ form_row(form.idCategory) }}
{{ form_widget(form.idCategoryNew.vars.prototype) }}
...
<button type="submit">Create</button>
{{ form_end(form) }}
</div>
和产品类型:
$builder
->add('name'))
->add('price'))
...
->add('idCategory', 'entity', array('class' => 'MyBundle\Entity\Category'))
->add('idCateogryNew', 'collection', array('type' => new CategoryType(), 'allow_add' => true))
...
编辑:
我找到了一个更好的解决方法,其中包括将收集表单传递给树枝模板。这种方式很容易处理表单提交后的post请求。如果有人想要代码,请询问:)
编辑2:
根据@agapitocandemor 请求:
在您的MainEntityController
(在我的情况下为 ProductController)中,搜索呈现表单的方法(newAction
在我的情况下)并创建要呈现的实体表单:
public function newAction()
{
$entity = new Product();
$entityform = $this->createForm(new ProductType(), $entity);
$subentityform = $this->createForm(new CategoryType(), new Category);
return $this->render('MyBundle:Product:new.html.twig', array(
'entity' => $entity,
'entityform' => $entityform->createView(),
'subentityform' => $subentityform->createView()
));
}
最后,为了呈现subentityform
你只需{{ form_widget(subentityform) }}
要从new
你的主实体的模板中调用。