我正在使用映射到Reservation
实体的data_class在Symfony2中呈现一个表单,并且此表单具有类的实体字段类型Service
.Reservation
和Service
班级之间的关系是多对多的.然后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)
这是错误的,因为:
ServiceType
id'services'
构建器添加两次,将覆盖第一个添加(这是合乎逻辑的,但如果不更改实体则无法解决)处理这样的表格最好的选择是什么?ServiceType
到目前为止只有2 -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 %}
Run Code Online (Sandbox Code Playgroud)
$builder->add('services','entity', array(
'class' => 'MyBundle:Service',
'group_by' => 'serviceType',
'multiple' => true,
'expanded' => true
));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7746 次 |
最近记录: |