7

解释:

我已经生成了一个实体的 CRUD,得到了以下默认操作:

  • indexAction():列出所有实体。
  • showAction($id):查找(按 ID)并显示一个实体。
  • deleteAction($id):删除一个实体。
  • 另一个动作。

因此,我看到我只能删除使用参数 $id 的操作中的实体(例如: showAction($id) ),但我想删除 indexAction 模板中的实体,因为我向用户保存了一个步骤。

deleteAction 需要一个请求、一个 ID 并使用 POST 方法。

我试图编写如下代码:

<a href="{{ path('entity_delete', { 'id': entity.id }) }}" class="btn">
 <img src="{{ asset('bundles/acme/images/delete.png') }}" ... />
</a>

当我执行操作时,我收到以下错误:

找不到“GET /acme/something/4/delete”的路由:不允许方法(允许:POST、DELETE)

这个回应很清楚,这正是我所期望的,所以我尝试做类似的事情,但使用了一个表格。像这样的东西:

<form id="formDelete" action="{{ path('entity_delete', { 'id': entity.id }) }}" method="post">
    <input type="hidden" name="_method" value="DELETE" />
    {{ form_widget(delete_form) }}
    <a href="{{ url('entity_delete') }}" class="btn" onclick="document.getElementById('formDelete').submit();">
        <img src="{{ asset('bundles/acme/images/delete.png') }}" ... />
    </a>
</form>

但是这条线{{ form_widget(delete_form) }}是一个问题,因为indexAction()它没有任何参数,它需要这个代码:

$deleteForm = $this->createDeleteForm($id);
return $this->render('AcmeBundle:Demo:index.html.twig', array(
            'entities'      => $entities,
            'delete_form' => $deleteForm->createView(),
        ));

如您所见, $id 参数对于该方法是强制性的,createDeleteForm($id)但我无法从indexAction().

问题:

解决此问题的最佳方法是什么?

4

1 回答 1

24

如果您只想拥有与索引中的项目一样多的删除按钮,这里是如何轻松做到这一点。

在 indexAction 中,添加以下循环,不要忘记将参数传递给视图。

public function indexAction()
{
    $em = $this->getDoctrine()->getManager();

    $entities = $em->getRepository('FooBundle:Link')->findAll();

    $deleteForms = array();

    foreach ($entities as $entity) {
        $deleteForms[$entity->getId()] = $this->createDeleteForm($entity->getId())->createView();
    }

    return array(
        'entities' => $entities,
        'deleteForms' => $deleteForms,
    );
}

基本上,我只是遍历所有实体并使用 crud 生成的内置方法创建相应的删除表单,将每个表单存储在一个数组中并将其传递给视图。

然后在视图中,只需添加在edit.html.twig生成的视图中已经可用的表单并编辑form_widget的参数:

<form action="{{ path('foo_delete', { 'id': entity.id }) }}" method="post">
    <input type="hidden" name="_method" value="DELETE" />
    {{ form_widget(deleteForms[entity.id]) }}
    <button type="submit" class="btn btn-small">
        <i class="icon-trash"></i>
        {{ 'links.admin.form.delete' | trans({}, 'FooBundle') }}
    </button>
</form>
于 2013-09-17T08:11:36.707 回答