Symfony3表单:如何知道在表单中单击了哪个按钮?

时间:2016-09-12 00:21:05

标签: php controller symfony symfony-forms

Symfony3表单:我已设法构建并呈现如下所示的表单:

<form action="/member/john/actions" method="post" name="form">
    <input type="submit" value="Block John" name="block">
    <input type="submit" value="Remove from my friends" name="remove">
    <input type="hidden" value="LeiajURspTa9c8JEUYtvepki0b_CdL9dMWqEZxOYvfk" name="form[_token]" id="form__token">
</form>

当我单击按钮"Block John""Remove from my friends"时,控制器将其路由到所需的位置(member_friend_actions),并且能够显示 debug在死亡之前转储值"Submitted!"文本。

我的路由器“member_friend_actions”的控制器设置如下:

/**
 * A common post location to catch all operations like add/remove/cancel/block friends
 *
 * @Route("/{username}/actions", name="member_friend_actions")
 * @Method("POST")
 */
public function allActionsFriendAction(Request $request, User $friend)
{
    $form = $this->createAllActionsFriendForm($friend);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {

        //$clicked = $form->getData();
        $clicked = $form->getClickedButton()
        \Doctrine\Common\Util\Debug::dump($clicked);            
        die("Submitted!");

    }

    return $this->redirectToRoute('member_profile', array("username" => $friend->getUsername()));
}

我想知道点击了哪个按钮(在此处阻止或删除;但在其他地方可以有更多按钮)。我尝试使用这些方法:

  

$ form-&gt; getData()=&gt;给出数组(0){}和
  $ form-&gt; getClickedButton()=&gt;给出NULL,所以没有帮助。

如何实现这一目标?

2 个答案:

答案 0 :(得分:8)

这取决于您如何将SubmitType添加到表单中。 例如,如果你使用这样的东西:

->add('block_john', SubmitType::class, array(
        'label' => 'Block John'
))

然后在您的控制器中,您可以使用以下内容:

$form->get('block_john')->isClicked()

有关详细信息,请参阅此链接: http://symfony.com/doc/current/form/multiple_buttons.html

答案 1 :(得分:-1)

由于我没有使用->add()表示法一次创建所有按钮,而是使用if-else-if-else条件生成并调用相应的方法,如下所示:

  

$ form = $ this-&gt; createCancelFriendForm($ user);

     

$ addFriendForm = $ form-&gt; createView();

也许这就是$form->getData()$form->getClickedButton()$form->get('block')->isClicked()这样的函数返回空值的原因。

但是因为这个表单仍然通过验证并成功已提交案例;我只是尝试使用if(isset($_POST["block"])) {}等效的Symfony,如下所示:

if ($form->isSubmitted() && $form->isValid()) {

    if ($request->request->get("block")) {
            // Pass it over to corresponding block handler
            $response = $this->forward('AppBundle:Member:blockFriend', array(
                   'friend'  => $friend,
            ));
        return $response;
    }

    if ($request->request->get("unblock")) {
        // Pass it over to corresponding unblock handler
        $response = $this->forward('AppBundle:Member:unBlockFriend',
            array(
                    'friend'  => $friend,
            ));
        return $response;
    }

    // I can add n number of other checks ( eg: add, remove, accept)
    // here and add their handlers as above
}

......这对我有用。 B)