我在 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
id - 将
'services'
添加到构建器两次,将覆盖第一次添加(这是合乎逻辑的,但如果不更改实体就无法解决)
处理这样的表单的最佳选择是什么?到目前为止只有 2 个 ServiceType
-s,但我希望它保持动态和可重用。
最佳答案
我想这样做的唯一方法是覆盖模板中的渲染。您应该传递给您的模板实体 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 %}
关于php - Symfony 2 Forms实体字段类型分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9175593/