В первый раз когда я прочитал об этой функции, я был настроен в лучшем случае скептически. Зачем нужно иметь возможность настраивать кнопками в ваших формах, ведь все что мы може сделать с кнопкой — просто отобразить? Я был неправ, и более того, Бернхард сделал большую работу, реализовав эту новую функцию.
В Symfony 2.3, вы можете добавить кнопки в формы, как и любые другие поля:
$form = $this->createFormBuilder($task) ->add('name', 'text') ->add('save', 'submit') ->getForm();
Если мы генерируем форму стандартным методом {{form_widget (form)}}, кнопка будет также отображена. Но такой случай нам очень интересен. Так, в каком случае нам может пригодиться новый функционал?
Кнопка Submit в формах, не очень полезны за исключением случаев, когда кнопок две и больше, тогда логика, по которой обрабатывается форма, скорее всего, будет различаться в зависимости от той кнопки, которая была нажата пользователем:
$form = $this->createFormBuilder($task) ->add('name', 'text') ->add('save', 'submit') ->add('save_and_add', 'submit') ->getForm();
Это та ситуация, когда управление кнопками в фреймворке форм начинает иметь смысл. Теперь в вашем контроллере вы можете проверить, какая кнопка была нажата с помощью нового метода isClicked() и обрабатывать форму исходя из этого:
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 }
И более того: валидационные группы могут быть различными для каждой кнопки. Это очень удобно, при работе с мастером форм:
$form = $this->createFormBuilder($task) // ... ->add('nextStep', 'submit') ->add('previousStep', 'submit', array( // disable validation 'validation_groups' => false, )) ->getForm();
Конечно, эта функциональность является опциональной и формы, где только одна кнопка, вы можете продолжать создавать по старому.
Эта новая функция полностью описана в официальной документации; но, взглянув на documentation pull request мы подумали что это может быть полезным.