在Symfony2中编辑表单

时间:2015-08-25 18:16:10

标签: php forms symfony doctrine-orm twig

我没有使用Doctrine的生成器,因为我觉得代码很难看,所以我试图让它工作我的editAction并在我的edit.html.twig页面中呈现表单,但是我无法做到工作。我试着按照其他答案给出的其他例子,但它们也没有用。

首先,我的editAction

public function editAction($id, Request $request)
{
    $manager = $this->getDoctrine()->getManager();
    $entity = $manager->getRepository('PanelBundle:Material')->find($id);

    if (!$entity) {
        throw $this->createNotFoundException('O material procurado não está cadastrado');
    }

    $form = $this->createForm(new MaterialType());
    $form->handleRequest($request);

    if ($request->getMethod() == 'POST') {
        $form->submit($request);

        if ($form->isValid()) {
            $manager->merge($entity);
            $manager->flush();

            $this->addFlash('success', 'Material alterado');

            return $this->redirect($this->generateUrl('panel_materials'));
        }
    }

    return $this->render('PanelBundle:Material:edit.html.twig', array(
        'entity' => $entity
    ));
}

现在,我的Twig

{% extends '::layout.html.twig' %}

{% block title %}Editar {{ entity.name }}{% endblock %}

{% block body %}
    <div class="container">
        <h1>Editar {{ entity.name }}</h1>

        <form action="{{ path('panel_edit_material', { 'id': entity.id }) }}" method="POST">
            <div class="form-group">
                {{ form_row(entity.name) }}
            </div>
            <div class="form-group">
                {{ form_row(entity.description) }}
            </div>
            <div class="form-group">
                {{ form_row(entity.quantity) }}
            </div>
            <div class="form-group">
                {{ form_row(entity.price) }}
            </div>

            {{ form_rest(form) }}

            <button type="submit" class="btn btn-success">Alterar</button>
        </form>
    </div>
{% endblock %}

两件事:如果我删除了{ 'id': entity.id },则会显示一条错误,说明缺少必填字段,如果我现在就这样,它会显示searchAndRenderBlock() must be an instance of Symfony\Component\Form\FormView,而不是返回{在控制器中{1}},并返回$entity,错误显示为$form->createView()

2 个答案:

答案 0 :(得分:0)

尝试将实体ID传递给FormView could not be converted to string处的路径函数时,可能会导致{ 'id': entity.id }错误。

对我来说最简单的解决方案似乎是将表单传递给视图(正如您所说的那样),但要从action="{{ path('panel_edit_material', { 'id': entity.id }) }}"标记中删除整个form属性。

如果缺少action属性,它将默认为当前网址(如果我理解该示例,则应该有效)。

如果这不起作用,您仍然可以通过这种方式传递实体的ID:{{ path('panel_edit_material', { 'id': form.id.vars.value }) }}。这还要求您将表单传递给视图而不是实体。

希望这会有所帮助:)

修改:重新阅读后,我注意到{{ entity.name}}的使用。如果您将for传递给视图,则需要将其更改为{{ form.name.vars.value }},或者只需将entityform传递给视图,这样您就可以选择显示原始值或新值

答案 1 :(得分:0)

由于布莱希特的启蒙,我设法解决了这个问题。

我的解决方案就是从页面中删除form_row(..),只留下这样:

<form action="{{ path('panel_edit_material', { 'id': entity.id }) }}" method="POST">
    <div class="form-group">
        {{ form_rest(form) }}
    </div>
    <button type="submit" class="btn btn-success">Alterar</button>
</form>

在控制器中:

$form = $this->createForm(new MaterialType(), $entity);

return $this->render('PanelBundle:Material:edit.html.twig', array(
    'form' => $form->createView(),
    'entity' => $entity
));

就是这样。