我想根据点击表单上的哪个按钮对提交的数据进行一些转换。这是场景:
chain
的文本字段,用于保存命令链。command
文本字段,用于保存最后一个命令。Send
和Send chain
。点击Send
后,chain
设置为command
,删除之前的内容。但是,当点击Send chain
时,command
的内容会在分隔符后添加到chain
的末尾,从而有效地创建一系列命令。
我需要检查以查看这两个按钮中的哪一个被点击,以便我可以将chain
设置为适当的值。
为什么我不在控制器中这样做?问题是我需要修改chain
的值。由于我无法修改已提交表单的值,因此我需要在一个事件中执行此操作。如上所述,我需要chain
等于command
或chain + [delimiter] + command
。
答案 0 :(得分:2)
如果我理解正确,你根本不需要参加活动。自@ 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
}
链接到chapter.
更新
通常,我展示的代码可以在事件中使用 - FormEvents::POST_SUBMIT
来确切,但正如您已经指出的那样,您无法在提交后修改表单数据。说实话,我不能提出完美的工作实例,所以我会分享一个想法,希望它会导致一些事情,或者至少在其他人提出别的建议之前。
如何向表单添加隐藏的非映射字段。然后(假设您可以在表单中使用javascript),您可以在提交表单时附加事件监听器,并根据单击的按钮,您可以使用特定值填充该隐藏字段。之后,您可以使用FormEvents::POST_SET_DATA
向FormType添加事件侦听器并读取此隐藏字段的值。
对不起,我现在无法提供帮助。如果我想出了一些东西,我会编辑我的帖子。
答案 1 :(得分:0)
以下是我需要做的事情:
POST_submit
事件,因为我无法在提交后转换数据。isClicked()
在其他事件中返回false
,因为该表单尚未提交。解决方案是这样的:
$data = $event->getData();
if (isset($data['send']) {
// transform the values here
}
换句话说,检查特定按钮是否被单击的唯一方法是检查其名称是否作为$event->getData()
返回的数组中的索引存在。