在哪个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。这不可能是对的,一定是您做错了什么。我用两个提交按钮对它进行了测试,事件的工作原理与预期的一样。