Работа с формами у 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')))
Заодно изменили метку (по умолчанию, меткой есть имя поля таблицы в БД).Итак, с самым простым случаем разобрались. Теперь мы умеем создавать простенькую форму, которая позволит модифицировать значения в соответствующих полях таблицы в БД.