Symfony 2表单实体字段类型分组

Teo*_*.sk 8 php forms symfony

我正在使用映射到Reservation实体的data_class在Symfony2中呈现一个表单,并且此表单具有类的实体字段类型Service.ReservationService班级之间的关系是多对多的.然后ServiceType,服务具有另一个类,Service该类从类中映射为多个

我想要做的是在预订表格中显示所有服务作为复选框,按服务类型分组.到目前为止,我可以像这样显示所有服务(代码来自ReservationType类):

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

并以默认方式显示表单:

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

   <input type="submit" />
</form> 
Run Code Online (Sandbox Code Playgroud)

结果是这样的:

 ? servicetype1 option
 ? servicetype1 another option
 ? servicetype2 option
 ? servicetype2 another option
Run Code Online (Sandbox Code Playgroud)

我想要实现的是:

servicetype1:
  ? option
  ? another option
servicetype2:
  ? option
  ? another option
Run Code Online (Sandbox Code Playgroud)

我试图通过使用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);} ));
Run Code Online (Sandbox Code Playgroud)

这是错误的,因为:

  1. 我必须指定ServiceTypeid
  2. 'services'构建器添加两次,将覆盖第一个添加(这是合乎逻辑的,但如果不更改实体则无法解决)

处理这样的表格最好的选择是什么?ServiceType到目前为止只有2 -s,但我希望它保持动态,并且可以重复使用.

jku*_*vic 9

我想这样做的唯一方法是覆盖模板中的渲染.你应该传递给你的模板实体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 %}
Run Code Online (Sandbox Code Playgroud)


Jon*_*nny 2

这可以通过使用group_by 选项来解决:

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

  • 在这种情况下它不起作用 – 使用选项“expanded =&gt; true”。文档中指出:“它仅在呈现为选择标签时才有效”。 (4认同)