在哪个Symfony事件中,我可以访问单击了哪个提交按钮?
我想对提交的数据进行一些转换,基于我表单上的哪个按钮被点击。以下是场景:在哪个Symfony事件中,我可以访问单击了哪个提交按钮?,symfony,symfony-forms,Symfony,Symfony Forms,我想对提交的数据进行一些转换,基于我表单上的哪个按钮被点击。以下是场景: 我有一个名为chain的文本字段,它保存命令链 我有一个保存最后一条命令的文本字段 我在表单上有两个按钮:发送和发送链 单击Send时,chain被设置为command,删除之前包含的内容。但是,当单击Send chain时,command的内容将添加到chain的末尾,位于分隔符之后,有效地创建了一个命令链 我需要能够检查这两个按钮中的哪一个被单击,以便我可以将chain设置为适当的值 为什么我不在控制器中执行此操作?问
chain
的文本字段,它保存命令链文本字段
发送
和发送链
Send
时,chain
被设置为command
,删除之前包含的内容。但是,当单击Send chain
时,command
的内容将添加到chain
的末尾,位于分隔符之后,有效地创建了一个命令链
我需要能够检查这两个按钮中的哪一个被单击,以便我可以将chain
设置为适当的值
为什么我不在控制器中执行此操作?问题是我需要修改
chain
的值。因为我不能修改已经提交表单的值,所以我假设我需要在事件中这样做。正如我上面提到的,我需要chain
等于command
,或者chain+[delimiter]+command
,如果我理解正确,您根本不需要事件。自@2.3以来,有一个内置方法isClicked()
。文档中的示例:
if ($form->isValid()) {
// ... do something
// the save_and_add button was clicked
if ($form->get('save_and_add')->isClicked()) {
// probably redirect to the add page again
}
// redirect to the show page for the just submitted item
}
链接到
更新
通常情况下,我显示的代码可以用于event-FormEvents::POST_SUBMIT
,但正如您已经指出的,您不能在提交后修改表单数据。老实说,我不能想出一个完美的例子,所以我会分享一个想法,希望它能带来一些东西,或者至少在其他人提出其他建议之前
不如在表单中添加一个隐藏的非映射字段。然后(假设允许您在表单中使用javascript),您可以在提交表单时附加事件侦听器,并根据单击的按钮,使用特定值填充隐藏字段。之后,您可以使用FormEvents::POST\u SET\u DATA
将事件侦听器添加到FormType并读取此隐藏字段的值
很抱歉,到目前为止我帮不了你什么忙。如果我有什么想法,我会编辑我的帖子。以下是我需要做的:
POST\u submit
事件,因为我无法在提交后转换数据isClicked()
返回false
,因为表单尚未提交$data = $event->getData();
if (isset($data['send']) {
// transform the values here
}
换句话说,检查某个特定按钮是否被单击的唯一方法是检查其名称是否作为索引存在于
$event->getData()
返回的数组中。谢谢您的快速回答。我编辑了我的问题,以便更好地解释我的意图。很抱歉第一次不够清楚。非常感谢。是的,我的问题是,当我单击send
按钮时,isClicked()
函数仍然返回false。是的,这是正常的行为,因为isClicked()
显示所选按钮是否提交了表单-因此它只对FormEvents::POST\u SUBMIT
有效。看看javascript的建议,javascript不是一个选项。即使在POST_SUBMIT
事件中,函数也会返回false。这不可能是对的,一定是您做错了什么。我用两个提交按钮对它进行了测试,事件的工作原理与预期的一样。