Я передаю форму в 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);} ));
Это неправильно, потому что:
ServiceType
'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 %}