Формы у Symfony framework. Данные с нескольких таблиц. (Урок 13. Формы. Продолжение)
В предыдущем уроке мы уже научились создавать простенькие формы в Symfony framework, содержащие (и модифицирующие при необходимости) данные с таблиц. Как помните, для этого использовались модели (представления) этих таблиц (entity).
Но на практике приходится решать задачи посложнее. Например, отображать/изменять данные из нескольких таблиц в Symfony framework.
Грубый пример - одна таблица содержит статьи, есть поле задающее id раздела (для которых есть отдельная таблица). Нужно сделать возможность удобного выбора раздела для статьи. К счастью, это рутинная задача для Symfony framework. =)
Для этого есть тип поля формы - entity.
Модифицируем немного пример из предыдущего урока:
// 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')
->add('part', 'entity', array('class' => 'HarentiusPortalBundle:Parts',
'property' => 'name', 'label' => 'Раздел'))
->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(),
));
}
}
Рассмотрим подробнее строку
->add('part', 'entity', array('class' => 'HarentiusPortalBundle:Parts',
'property' => 'name', 'label' => 'Раздел'))
Как видим, массив параметров до типа entity, помимо прочего, содержит опцию class, определяющую класс модели, property - определяющую поле для отображения. В итоге получим selectbox с возможностью выбора раздела. Разделы отображаются по имени. В базу будет внесено в таблицу страниц id раздела.По умолчанию данные отображаются в виде selectbox. Ну как по умолчанию... =)
Выбрать то можно, между Select tag (или как было выше selectbox), Checkboxes и Radio Buttons, но не в явном виде. Выбор между типами отображения будет установлен автоматически в зависимости от комбинации значений опций expanded и multiple:
Тип поля ввода | expanded | multiple |
select tag | false | false |
select tag (with multiple attribute) |
false | true |
radio buttons | true | false |
checkboxes | true | true |
->add('part', 'entity', array('class' => 'HarentiusPortalBundle:Parts',
'property' => 'name', 'label' => 'Раздел', 'multiple' => false, 'expanded' => true))
Так получим выбор с помощью radio button’ов.