php - Symfony 2 Forms实体字段类型分组

标签 php forms symfony

我在 Symfony2 中呈现一个表单,其中 data_class 映射到 Reservation 实体,并且此表单有一个实体字段类型,属于 Service 类。 ReservationService 类之间的关系是多对多的。然后服务有一个 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,但我希望它保持动态和可重用。

最佳答案

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

相关文章:

php - MySQL 选择时间戳是否过去

php - 高效有效的表单验证

ruby-on-rails - Rails,带有嵌套 HTML 的标签,使用 FormBuilder 和 Devise,带有 Bootstrap 标记

symfony - 带前缀的 FOSUserBundle 注销不起作用

php - 无法使用运行 MAMP/PHP 5.6.1/Mac OS X El Capitan 的 putenv() 修改 PATH

php - 将具有默认值的行插入包含日期的数组中,以便日期之间没有间隙

forms - symfony2文本字段自定义标签

symfony - 在 symfony2 中动态修改表单预设选项以通过验证

php - PHP 中的曲线拟合

python - 属性错误: 'NoneType' object has no attribute 'check_password' error in django allauth