我可以在哪个Symfony事件中访问单击了哪个提交按钮?

时间:2015-04-23 13:12:21

标签: symfony symfony-forms

我想根据点击表单上的哪个按钮对提交的数据进行一些转换。这是场景:

  1. 我有一个名为chain的文本字段,用于保存命令链。
  2. 我有一个command文本字段,用于保存最后一个命令。
  3. 表单上有两个按钮:SendSend chain
  4. 点击Send后,chain设置为command,删除之前的内容。但是,当点击Send chain时,command的内容会在分隔符后添加到chain的末尾,从而有效地创建一系列命令。

    我需要检查以查看这两个按钮中的哪一个被点击,以便我可以将chain设置为适当的值。

    为什么我不在控制器中这样做?问题是我需要修改chain的值。由于我无法修改已提交表单的值,因此我需要在一个事件中执行此操作。如上所述,我需要chain等于commandchain + [delimiter] + command

2 个答案:

答案 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)

以下是我需要做的事情:

  1. 我无法使用POST_submit事件,因为我无法在提交后转换数据。
  2. 两个按钮的isClicked()在其他事件中返回false,因为该表单尚未提交。
  3. 解决方案是这样的:

    $data = $event->getData();
    
    if (isset($data['send']) {
        // transform the values here
    }    
    

    换句话说,检查特定按钮是否被单击的唯一方法是检查其名称是否作为$event->getData()返回的数组中的索引存在。