2016-09-12 2 views
0

Symfony3 Формы: мне удалось построить и сделать форму, как показано ниже:Symfony3 Forms: Как узнать, какая кнопка была нажата в форме?

<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) и он может отображать значения отладки вместе с текстом "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())); 
} 

Я хочу знать, какая кнопка была нажата, что привел его сюда (блок или удалить здесь, но может быть больше кнопок в других местах). Я попытался с помощью методов:

$ форма-> GetData() => что дает массив (0) {} и
$ форма-> getClickedButton() => дает NULL, поэтому не помогает.

Как это можно достичь?

+1

Привет, Ren. Если бы мой ответ «разрешил» проблему, пожалуйста, нажмите галочку, кроме моего ответа, чтобы отметить ее как правильную. Благодаря! –

ответ

7

Это зависит от того, как вы добавили SubmitType в свою форму. Например, если вы использовали что-то вроде этого:

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

Тогда в контроллере вы можете использовать что-то вроде:

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

Смотрите эту ссылку для получения дополнительной информации: http://symfony.com/doc/current/form/multiple_buttons.html

+0

Возможно, потому, что я не создал все кнопки с одним объектом построения формы, '-> isClicked()' не вернул true в моем случае. Поэтому я попробовал нечто подобное, что сработало. – Ren

0

Поскольку I не создавали все кнопки одновременно с использованием нотации ->add(), но были созданы с использованием условий if-else-if-else и вызова соответствующих методов, как показано ниже:

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

$ addFriendForm = $ form-> createView();

, возможно, это было причиной того, что функционируют как $form->getData(), $form->getClickedButton(), $form->get('block')->isClicked() возвращаются пустые значения.

Но поскольку эта форма все еще прошла проверку и успешно прошла Опубликовано case; Я просто попытался использовать 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)

Смежные вопросы