Форма Symfony 2 с двумя кнопками отправки

Итак, у меня есть таблица с флажком в каждой строке, например:

<form name="" action={{ path('mypath') }}" method="post">
 <button name="print">Print</button>
 <button name="delete">Delete</button>
 <table>
  {% for client in clienti %}
   <tr>
       <td><input type="checkbox" name="action[]" value="{{ client.id }}" /></td>
   </tr>

     .
     .
     .
  {% endfor %}
 </table>
</form>

Теперь, в моем контроллере, я хочу проверить, какая кнопка была нажата. Как это сделать?

В моих других формах, генерируемых symfony, легко, потому что у меня есть объект формы и очень полезный метод:

if ($form->get('delete')->isClicked()) {
    // delete ...
}

Я хочу знать правильный метод для этого.

Спасибо.

Ответ 1

Вы можете использовать, например,

    $request = $this->get('request');
    if ($request->request->has('delete'))
    {
        ...
    }

Ответ 2

С Symfony 2.3 вы можете сделать:

Форма:

$form = $this->createFormBuilder($task)
->add('name', 'text')
->add('save', 'submit')
->add('save_and_add', 'submit')
->getForm();

контроллер:

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
}

см. здесь: http://symfony.com/blog/new-in-symfony-2-3-buttons-support-in-forms

Ответ 3

Просто создайте кнопки в построителе форм, визуализируйте их в представлении и используйте тот же метод, который вы уже использовали в других формах:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('delete', 'button')
        ->add('print', 'button')
}

На ваш взгляд:

<form name="" action="{{ path('mypath') }}" method="post">
    {{ form_widget(form.print) }}
    {{ form_widget(form.delete) }}

    ...
</form>

Ответ 4

Обновление для Symfony3:

use Symfony\Component\HttpFoundation\Request;

public function myAction(Request $request)
{
    if ($request->query->has('delete')) // For GET form
    {
        // ...
    }
    if ($request->request->get('delete')) // For POST form
    {
        // ...
    }
}