Symfony 2 Forms entity Тип поля Тип

Я передаю форму в Symfony2 с именем data_class, сопоставленным с объектом Reservation , и эта форма имеет тип поля сущности класса Service . Соотношение между классом Reservation и Service много для многих. Затем служба имеет ServiceType , который является другим классом, который сопоставлен как можно больше от класса Service

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

 $builder->add('services','entity', array( 'class' => 'MyBundle:Service', 'multiple' => true, 'expanded' => true )); 

И отображение формы по умолчанию:

 <form action="{{ path('reservations', {'step': 2}) }}" method="post" {{ form_enctype(form) }}> {{ form_widget(form) }} <input type="submit" /> </form> 

Результат выглядит примерно так:

  □ servicetype1 option □ servicetype1 another option □ servicetype2 option □ servicetype2 another option 

Я бы хотел достичь:

 servicetype1: □ option □ another option servicetype2: □ option □ another option 

Я пытался указать только подмножества служб, используя параметр query_builder следующим образом:

  $builder->add('services','entity', array( 'class' => 'MyBundle:Service', 'multiple' => true, 'expanded' => true, 'query_builder' => function (\My\Bundle\Entity\ServiceRepository $repository) {return $repository->createQueryBuilder('s')->where('s.serviceType = ?1')->setParameter(1, 1);} )); $builder->add('services','entity', array( 'class' => 'MyBundle:Service', 'multiple' => true, 'expanded' => true, 'query_builder' => function (\My\Bundle\Entity\ServiceRepository $repository) {return $repository->createQueryBuilder('s')->where('s.serviceType = ?1')->setParameter(1, 2);} )); 

Это неправильно, потому что:

  1. Я должен указать идентификатор ServiceType
  2. Добавляя 'services' к строителю дважды, перезапишет первое дополнение (которое является логическим, но не может быть разрешено без изменения сущностей)

Какой был бы лучший вариант для обработки таких форм? До сих пор только 2 ServiceType -s, но я хотел бы сохранить его динамичным и многоразовым.

Это можно решить, используя параметр group_by :

 $builder->add('services','entity', array( 'class' => 'MyBundle:Service', 'group_by' => 'serviceType', 'multiple' => true, 'expanded' => true )); 

Я полагаю, что единственный способ сделать это – переопределить рендеринг в шаблоне. Вы должны передать свой объект шаблона MyBundle:Service и сделать его, например, следующим образом:

 {% for service in services %} <b>{{ service.name }}</b><br> {% for option in service.options %} <label> <input type="checkbox" name="form_type_name[options][{{ option.id }}]" value="{{ option.id }}" {% if option in user.services.options %}checked="checked"{% endif %}> {{ option.name }} </label> {% endfor %} {% endfor %}