2016-09-12 17 views
0

Symfony3フォーム: Iは以下に示すようにフォームを作成し、レンダリングするために管理している: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> 

Iが所望の位置(member_friend_actions)にボタン"Block John"又は"Remove from my friends"、コントローラルートそれをクリックするとまた、のデバッグダンプ値"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())); 
} 

私はそれをここに持っているクリックされたボタンを知りたい(ブロックまたはここで削除;しかし、より多くのボタンがあることができ他の場所で)。私は、メソッドを使用してみました:(0){}アレイを与え、
ます$ form-> getClickedButton()=>そう支援されていない、NULL与える

ます$ form->のgetData()=>。

これはどのように達成できますか?

+1

こんにちは。私の答えが問題を「解決」した場合は、私の答え以外のチェックマークをクリックして正しいものとしてマークしてください。ありがとう! –

答えて

7

フォームに送信タイプをどのように追加したかによって異なります。 I以来 http://symfony.com/doc/current/form/multiple_buttons.html

+0

私は、単一のフォームビルダーオブジェクトですべてのボタンを作成しなかったため、私のケースでは ' - > isClicked()'はtrueを返しませんでした。だから私は同じようなものを試しました。 – Ren

0

:詳細はこのリンクを参照してください

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

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

次に、あなたのコントローラであなたはその後のようなものを使用することができます。たとえば あなたはこのようなものを使用した場合一度にすべてのボタンを->add()表記を使用して作成しませんでしたが、if-else-if-else条件で生成され、以下に示すように対応するメソッドを呼び出しました:

$ form = $ this-> createCancelFriendForm($ user);

$ addFriendForm = $ form-> createView();

おそらくこれは$form->get('block')->isClicked()が空の値を返し、$form->getData()$form->getClickedButton()のように機能した理由でした。

しかし、このフォームはまだ検証を経て成功したため、提出ケース。必要に応じて、私のために働いた

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 
} 

...:私は単にそのようなsymfonyののif(isset($_POST["block"])) {}同等のものを使用してみました。 B)

関連する問題