Symfony 2 Forms entity Поле Тип группировки - PullRequest
8 голосов
/ 07 февраля 2012

Я рендерил форму в 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 id
  2. Если дважды добавить 'services' в построитель, то первое дополнение будет перезаписано (что логично, но не может быть решено без изменения сущностей)

Что было бы лучшим вариантом для обработки подобных форм? Пока только 2 ServiceType, но я бы хотел, чтобы это было динамичным и многоразовым.

Ответы [ 2 ]

9 голосов
/ 07 февраля 2012

Полагаю, единственный способ сделать это - переопределить рендеринг в шаблоне.Вы должны перейти к вашей шаблонной сущности 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 %}
1 голос
/ 20 мая 2015

Эту проблему можно решить с помощью опции group_by :

$builder->add('services','entity', array(
    'class' => 'MyBundle:Service',
    'group_by' => 'serviceType',
    'multiple' => true,
    'expanded'  => true
));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...