使用实体类型表单在Symfony 2中自动渲染集合

时间:2013-08-09 21:44:21

标签: forms symfony collections entity twig

我有两个实体:产品和类别。 每个实体使用Symfony Form Builder呈现自定义表单。

我正在尝试使用collection field type在“商品”表单中包含“类别”表单。包含行如下所示:

$builder->add('idCategory', 'collection', array('type' => new CategoryType());

工作正常(根据Symfony documentation)。但我不想用JavaScript创建表单,我希望在不更改twig模板的情况下使用表单的其余部分进行呈现:

<form action="{{ path('product_create') }}" method="post" {{ form_enctype(form) }}>
    {{ form_widget(form) }}
    <button type="submit">Create</button>
</form>

甚至可能吗?有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您知道要包含在产品中的类别数量吗?

答案 1 :(得分:0)

我发现了一种解决方法,因为似乎无法在不使用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))
    ...

修改

我找到了一个更好的解决方法,包括将集合表单传递给twig模板。这种方式在表单提交后很容易处理发布请求。如果有人想要代码,请询问:)

编辑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