Формы у 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’ов.