Работа с формами у Symfony framework (Урок 12. Формы. Введение)

В этой заметке научимся создавать и обрабатывать формы у Symfony framework.

Формы можно как создавать "с нуля", так и использовать ORM (модели таблиц с баз данных). Для начала рассмотрим второй вариант. На практике чаще всего встречается именно такие формы. Ведь в большинстве случаев все, что вводится в форме где-то сохраняется (в БД).

В самом простом случае, необходимо сначала создать экземпляр модели, этот экземпляр понадобится конструктору билдера формы (Form Builder). Дальше надо будет перечислить поля. Выглядит это так (внутри контроллера):

// src/Acme/TaskBundle/Controller/DefaultController.php
namespace AcmeTaskBundleController;
use SymfonyBundleFrameworkBundleControllerController;
use AcmeTaskBundleEntityModel;
use SymfonyComponentHttpFoundationRequest;
class DefaultController extends Controller
{
  public function newAction(Request $request)
   {
    $model = new Model();
    $model->setField('Some value');
    $model->setDueDate(new DateTime('tomorrow'));
    $form = $this->createFormBuilder($model)
      ->add('field', 'text')
      ->add('dueDate', 'date')
      ->getForm();
   return $this->render('AcmeTaskBundle:Default:new.html.twig', array(
     'form' => $form->createView(),
     ));
  }
}
Дальше шаблон:
{# src/Acme/TaskBundle/Resources/views/Default/new.html.twig #}
<form action="{{ path('task_new') }}" method="post" {{ form_enctype(form) }}>
{{ form_widget(form) }}
 <input type="submit" />
</form>
Обратите внимание на аргументы метода add($field, $type). Первое - имя поля, второе - тип (все стандартные для html(text, textarea, password, ...) + некоторые специальные (date, email, birthday, и т.д. Полный перечень смотрите здесь)

Обработка формы в Symfony framework требует минимального добавления кода:

// src/Acme/TaskBundle/Controller/DefaultController.php
namespace AcmeTaskBundleController;
use SymfonyBundleFrameworkBundleControllerController;
use AcmeTaskBundleEntityModel;
use SymfonyComponentHttpFoundationRequest;
class DefaultController extends Controller
{
  public function newAction(Request $request)
   {
    $model = new Model();
    $model->setField('Some value');
    $model->setDueDate(new DateTime('tomorrow'));
    $form = $this->createFormBuilder($model)
      ->add('field', 'text')
      ->add('dueDate', 'date')
      ->getForm();

if ($request->isMethod('POST')) { $form->bind($request); if ($form->isValid()) { // Здесь осуществляется обработка данных, например, отправка в БД:    $em = $this->getDoctrine()->getManager();        $em->flush(); } return $this->render('AcmeTaskBundle:Default:new.html.twig', array( 'form' => $form->createView(), )); } }

Чтобы кастомизировать форму в Symfony framework, можно добавить атрибут class (или id):
add('position', 'number', array('label' => 'Позиция',
                    'attr' => array('class' => 'class_name')))
Заодно изменили метку (по умолчанию, меткой есть имя поля таблицы в БД).

Итак, с самым простым случаем разобрались. Теперь мы умеем создавать простенькую форму, которая позволит модифицировать значения в соответствующих полях таблицы в БД.