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,所以没有帮助。
如何实现这一目标?
答案 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)