【问题标题】:Two forms - two submit buttons. How the controller identify which button was clicked?两种形式 - 两个提交按钮。控制器如何识别单击了哪个按钮?
【发布时间】:2012-08-03 12:26:10
【问题描述】:

我有两个表单,一个页面上有两个提交按钮,一个视图和一个控制器应该管理它们。如果单击第一个动作,我希望它执行一个动作,如果是第二个动作,我希望它执行另一个动作。我试过这个,其中edit是表单的名称,但它不起作用:

if($this->getRequest()->get('edit'))

我也尝试为提交按钮设置值,但我也无法成功。请帮助我找到一种方法来识别按下了哪个按钮。 :)

【问题讨论】:

  • 如果你有两个表单,它们应该提交到两个不同的脚本。您的提交按钮将存在于它们各自的表单中,因此您将知道它提交到的脚本按下了哪个按钮。
  • 从今天的一些极好的论点到愚蠢的评论。为你感到羞耻,马特。为什么两个表单不能提交给一个脚本。例如添加、修改删除记录
  • @Matt 在一个form 标签中可以有更多submit 按钮。 @Faery:尝试在$_POST 上使用print_rvar_dump 来检查提交的内容(单击的提交按钮的名称与它一起发送)。
  • @Matt 非常蹩脚的例子。
  • @Sven 那里可以克隆恐龙在努布拉尔岛周围奔跑,但这并不意味着应该存在? :-P

标签: php symfony doctrine


【解决方案1】:

Symfony 2.3 自带解决方案。它支持表单中的按钮,并且您有 isClicked() 方法来检查按钮是否被单击。

http://symfony.com/blog/new-in-symfony-2-3-buttons-support-in-forms

【讨论】:

  • 很好的 symfony2 兼容答案,我不知道这种方法
  • $form->get('delete')->isClicked() 是 Symfony 2.3 的一个新特性。但请注意,如果该按钮不存在,而您使用此方法,则会出现错误。这似乎很明显,但在许多情况下,您可以有条件地包含一个按钮,例如删除按钮只会在编辑现有记录时出现,而不是创建新记录。所以你应该首先检查按钮是否存在,例如if($form->has('delete') && $form->get('delete')->isClicked()) {
【解决方案2】:

为按钮赋予不同的“名称”(而非“id”)属性

<form ...>
...
<input type="submit" name="btnA" value="ActionA">
<input type="submit" name="btnB" value="ActionB">
</form>

然后控制器应该分析 POST 数据中的变量,该变量的名称将是单击按钮的名称:

if (isset($_POST['btnA'])) { 
    /* do A */ 
} else if (isset($_POST['btnB'])) { 
   /* do B */ 
}

【讨论】:

  • 我觉得他们的名字不一样。
  • 这个网站是为了帮助,不是吗? :-) 那么,在这种情况下,我发布的解决方案仍然有效(假设您发布到同一个脚本),因为 isset() 函数将检查单击了哪个按钮来提交表单。
  • 各位,有人知道 Symfony 吗?
  • @Claudix 要从请求中获取提交的数据,只需执行以下操作:$request-&gt;get('your_value', null);。第二个参数 - 如果$_REQUEST 数组中的your_value 不存在,则返回值
  • 所以,$_REQUEST 应该包含被点击按钮的名称,不是吗?在这种情况下,@Faery 可以尝试将 $_REQUEST 的内容转储到日志文件中,以查看其中定义了哪些数据。
【解决方案3】:

您可以使用隐藏字段并检查它们的值:)

【讨论】:

    【解决方案4】:

    在您的控制器中创建两个表单,处理它们的输入,然后检查它们是否已提交且有效。

    $formOne = $this->formFactory->create();
    $formTwo = $this->formFactory->create();
    
    $formOne->handleRequest($request);
    $formTwo->handleRequest($request);
    
    if($formOne->isSubmitted() && $formOne->isValid()) {
        die('form one submitted');
    }
    if($formTwo->isSubmitted() && $formTwo->isValid()) {
        die('form two submitted');
    }
    
    return new Response($this->templating->render([template-name]), [
        'formOne' => $formOne->createView(),
        'formTwo' => $formTwo->createView(),
    ]));
    

    然后在您的模板中创建两个带有单独按钮的表单:

    form_start(formOne)
    form_rest(formOne)
        <button type="submit">one</button>
    form_end(formOne)
    
    
    form_start(formOne)
    form_rest(formOne)
        <button type="submit">one</button>
    form_end(formOne)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      • 1970-01-01
      • 2014-07-15
      • 2017-07-24
      相关资源
      最近更新 更多