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

Php Symfony 2表单实体字段类型分组,php,forms,symfony,Php,Forms,Symfony,我正在Symfony2中呈现一个表单,其中的数据类映射到Reservation实体,该表单具有一个实体字段类型,即classService。预订和服务类之间的关系是多对多的。然后,一个服务有一个ServiceType,它是另一个类,映射到service类中的一个 我要做的是在预订表单中将所有服务显示为复选框,并按服务类型分组。到目前为止,我可以这样显示所有服务(代码来自ReservationTypeclass): 并以默认方式显示表单: <form action="{{ path('res

我正在Symfony2中呈现一个表单,其中的数据类映射到
Reservation
实体,该表单具有一个实体字段类型,即class
Service
预订
服务
类之间的关系是多对多的。然后,一个服务有一个
ServiceType
,它是另一个类,映射到
service
类中的一个

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

并以默认方式显示表单:

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

   <input type="submit" />
</form> 
我希望达到的目标是:

servicetype1:
  □ option
  □ another option
servicetype2:
  □ option
  □ another option
我试图通过使用查询生成器选项指定服务的子集,如下所示:

 □ servicetype1 option
 □ servicetype1 another option
 □ servicetype2 option
 □ servicetype2 another option
    $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);} ));
{% 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 %}
这是错误的,因为:

  • 我必须指定
    ServiceType
    id
  • 'services'
    添加到构建器两次将覆盖第一次添加(这是合乎逻辑的,但在不更改实体的情况下无法解决)

  • 处理此类表单的最佳选择是什么?到目前为止,只有2个
    ServiceType
    -s,但我希望保持它的动态性和可重用性。

    我认为唯一的方法是覆盖模板中的呈现。您应该传递到模板实体
    MyBundle:Service
    ,并将其呈现如下示例:

     □ servicetype1 option
     □ servicetype1 another option
     □ servicetype2 option
     □ servicetype2 another option
    
        $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);} ));
    
    {% 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 %}
    
    {%用于服务中的服务%}
    {{service.name}}
    {%for service.options%中的选项} {{option.name} {%endfor%} {%endfor%}
    这可以通过以下方法解决:


    我有类似的问题。这是我的问题。当你要完成这个任务时,你会写一些例子吗?是的,你的意思是像将它从控制器传递到模板一样,避免对表单的这一部分使用FormType?这不是有点扼杀了可重用性吗?最终还是使用了这个解决方案。谢谢/Díky:)太好了,很高兴看到他们添加了这个选项。我们接受它,因为它简单得多。在这种情况下,它不起作用–使用选项
    expanded=>true
    。文档中指出:“它仅在作为选择标记呈现时有效”。