两个表单 - 两个提交按钮。控制器如何识别哪个按钮被点击?

4

我在页面上有两个表单,每个表单都有一个提交按钮。我想让一个视图和一个控制器管理它们。如果点击第一个按钮,它应该执行一个操作,如果点击第二个按钮,则执行另一个操作。我尝试了以下代码,其中“edit”是表单的名称,但它无法正常工作:

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

我还尝试将值设置为提交按钮,但是它也无法工作。请帮助我找到一种方法来识别哪个按钮被按下了。 :)


如果你有两个表单,它们应该分别提交到两个不同的脚本。你的提交按钮将存在于各自的表单中,因此你将知道哪个按钮被按下,并由相应的脚本进行提交。 - Matt
从今天的一些优秀论点到一个愚蠢的评论。真丢人,马特。为什么不能让两个表单提交到一个脚本呢?例如,添加、修改、删除记录。 - Waygood
1
@Matt 一个form标签中可以有多个submit按钮。@Faery:尝试在$_POST上使用print_rvar_dump检查提交了什么内容(点击的submit按钮的名称也会被发送)。 - Sven van Zoelen
@Matt 很糟糕的例子。 - Sven van Zoelen
@Sven,伊斯拉努布拉岛上可能会有克隆恐龙奔跑,但这并不意味着应该这样做,是吧?:-P - Matt
事实上,一个按钮更新一个表中的数据,而另一个按钮将数据添加到另一个表中。 - Faery
4个回答

13

很棒的symfony2兼容答案,我不知道这种方法。 - Paul Andrieux
5
$form->get('delete')->isClicked()是Symfony 2.3的一个新功能。但要注意,如果按钮不存在,并且您使用此方法,将会出现错误。这似乎是显而易见的,但在许多情况下,您可能会根据条件包含一个按钮,例如仅在编辑现有记录时显示删除按钮,而不是创建新记录。因此,您应该首先检查按钮是否存在,例如:if($form->has('delete') && $form->get('delete')->isClicked()) { - Chadwick Meyer

5
给按钮不同的“name”属性(而非“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 */ 
}

我非常感激你的帮助 :) - Faery
2
这个网站是用来帮助的,不是吗? :-) 那么,在这种情况下,我发布的解决方案仍然有效(假设您正在发布到相同的脚本),因为isset()函数将检查已单击哪个按钮以提交表单。 - Claudi
2
大家好,有人了解Symfony吗? - Claudi
2
@Claudix 要从请求中获取提交的数据,只需执行:$request->get('your_value', null);。第二个参数 - 是在 $_REQUEST 数组中不存在 your_value 的情况下返回的值。 - Vitalii Zurian
1
那么,$_REQUEST应该包含所点击按钮的名称,不是吗?在这种情况下,@Faery可以尝试将$_REQUEST的内容转储到日志文件中,以查看其中定义了哪些数据。 - Claudi
显示剩余5条评论

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

0
在你的控制器内创建两个表单,处理它们的输入,然后检查它们是否已提交并且有效。
$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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接