【问题标题】:Symfony 2 Forms entity Field Type groupingSymfony 2 Forms 实体字段类型分组
【发布时间】:2012-02-07 11:40:21
【问题描述】:

我正在 Symfony2 中渲染一个表单,其 data_class 映射到 Reservation 实体,并且该表单具有一个实体字段类型,类为 ServiceReservationService 类之间的关系是多对多的。然后一个服务有一个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-s,但我想保持它的动态性和可重复使用性。

【问题讨论】:

  • 我也有类似的问题。这是我的问题link。当你完成这个任务时,你会写一些例子吗?

标签: php forms symfony


【解决方案1】:

我想这样做的唯一方法是覆盖模板中的渲染。您应该传递给您的模板实体 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 %}

【讨论】:

  • 是的,你的意思是把它从控制器传递给模板,避免在这部分表单中使用FormType?这不会影响可重用性吗?
  • 最终还是使用了这个解决方案。谢谢/Díky :)
【解决方案2】:

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

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

【讨论】:

  • 太好了,很高兴看到他们添加了这个选项。重新接受这一点,因为它更简单。
  • 在这种情况下它不起作用 - 使用选项 expanded =&gt; true。在文档中声明:“它仅在呈现为选择标记时才有效”。
猜你喜欢
  • 2018-09-19
  • 2014-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
相关资源
最近更新 更多