【问题标题】:How to confirm the deletion of enties submitted by a form in Symfony 3.4 without JS?如何在没有 JS 的 Symfony 3.4 中确认删除表单提交的实体?
【发布时间】:2019-11-14 16:44:00
【问题描述】:

我正在Symfony 3.4 中处理一个简单的表单,它允许在表单中选择任意数量的实体进行删除。

在不使用 JS 的情况下要求用户确认删除的最佳/正确方法是什么?

class SomeController {
    public function deleteUsersAction(Request request) {
        $users = $this->loadUsersFromDB();        

        $form = $this->creatFormBuilder()
            ->add('users', EntityType::class, [
                'class' => 'AppBundle:User',
                'choices' => $users,             
                'multiple' => true,
                'expanded' => true,
            ])
            ->getForm();

         $form->handleRequest($request);
         if ($form->isSubmitted() && $form->isValid()) {
             $users = $form->getData();

             // Add confirmation here...

             $this->deleteUsers($user);
         }

         return $this->render('AppBundle::user_list.html.twig', ['form' => $form->createView()]);
    }
}

当然,我可以使用一些 JS(或其他脚本代码)来拦截表单提交,显示确认对话框,然后才将数据提交给处理表单和删除的控制器。

但是,这不是我正在寻找的解决方案。必须首先检查提交的实体/用户,如果甚至可以删除。因此,控制器应该检查实体,然后将用户发送到确认页面。

如何将选定的实体传递给确认页面,然后最终传递给处理删除的控制器?

我的第一个意图是为确认页面创建一个表单,该表单可以包含所选实体的input hidden 字段。但是hidden 字段不能存储实体(或者它们可以),我将创建一个自定义表单类型来处理转换(实体到 id -> id 到实体)或在控制器中手动进行转换。

第二个猜测是像以前一样使用EntityType,但只是使用 CSS 隐藏表单字段。然而,这些似乎不是一个干净的解决方案。

我发现了一些来自 Symfony 2 的旧帖子,它们建议使用自定义表单类型。这仍然是 Symfony 3 中的最佳选择吗?

【问题讨论】:

    标签: php forms symfony


    【解决方案1】:

    创建一组已删除的用户 ID(或名称等)

    if ($form->isSubmitted() && $form->isValid()) {
        $users = $form->getData();
        // create an empty array
        $removed = [];
        foreach($users as $user) { // I assume you do this here?
            // Add confirmation here...
            $removed[] = $user->getId(); // add to array (or whatever, username, etc)
            $this->deleteUsers($user);
        }
        // now pass to your view
         return $this->render('AppBundle::user_list.html.twig', [
            'form' => $form->createView(),
            'removed' => $removed,
        ]);
    }
    

    然后您可以使用您希望显示的信息创建一个警报框或其他一些 div。

    希望这会有所帮助! :-)

    【讨论】:

    • 谢谢,但这会删除用户和删除的用户 ID 列表。所以实际上没有确认,是吗?
    【解决方案2】:

    我建议您为删除和删除确认设置单独的路径(单一责任)。然后,从删除路径中,将必须删除的实体的 ID 列表传递给删除确认路径。 检查此问题以了解更多详细信息:How to pass data/information between different forms on diffrent pages in Symfony 3?

    【讨论】:

      猜你喜欢
      • 2019-05-14
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多