Symfony2分组表单项

时间:2013-05-06 14:40:17

标签: forms symfony

我真的需要你帮助创建一个表单。我的实体包含$id$name$items属性。 $items是很多关系。然后我有两个其他实体。两者都具有$id$name属性。 实体有关。像这样:

Group 1                 Entity 1
 |- Item 1               |- Item 1
 '- Item 2               |- Item 2
                         '- Item 3

Group 2                 Entity 2
 |- Item 3               |- Item 2
 '- Item 4               |- Item 3
                         '- Item 4

使用分组项目为实体创建表单的最佳方法是什么?像这样:

----------------------------------------------------
Group 1
 ☑ Item 1              ☑ Item 2
----------------------------------------------------
Group 2
 ☑ Item 3              ☑ Item 4

尝试谷歌,但是,说实话,我不知道从哪里开始:/

2 个答案:

答案 0 :(得分:3)

好的......所以我发现,group_by用于在<select>中获取 optgroup 。我的EntityType有:

$builder->add('item', 'entity' array(
    'class' => 'MyBundle:Item',
    'property' => 'name',
    'multiple' => true,
    'expanded' => true,
    'group_by' => 'group.name',
);

在我的模板中:

{% form_theme form 'MyBundle::form_theme.html.twig' %}
{{ form_widget(form.item) }}
{{ form_rest(form) }}

在我的表单主题中,我只是尝试复制choice_widget_collapsed,但存在一些差异(例如:检查是否检查了值)。我不知道这是否是最佳方式,但它对我有用。也许是因为我只使用item实体选择而没有其他输入字段。 我的表格主题:

{% block choice_widget_expanded %}
{% spaceless %}
    <div {{ block('widget_container_attributes') }}>
        {% set options = choices %}
        {{ block('choice_widget_expanded_options') }}
    </div>
{% endspaceless %}
{% endblock choice_widget_expanded %}

{% block choice_widget_expanded_options %}
{% spaceless %}
    {% for group_label, choice in options %}
        {% if choice is iterable %}
            <fieldset>
                <legend>{{ group_label|trans({}, translation_domain) }}</legend>
                {% set options = choice %}
                {{ block('choice_widget_expanded_options') }}
            </fieldset>
        {% else %}
            <input type="checkbox" name="{{ full_name }}[]" value="{{ choice.value }}"{% if value[choice.value] %} checked="checked"{% endif %}/> {{ choice.label|trans({}, translation_domain) }}
        {% endif %}
    {% endfor %}
{% endspaceless %}
{% endblock choice_widget_expanded_options %}

欢迎任何改进。

答案 1 :(得分:0)

EntityType.php文件中(根据您的实体可以auto-generated),您需要entity field type,如下所示:

$builder->add('item', 'entity' array(
    'class' => 'YourNameSpace:Item',
    'property' => 'name',
    'multiple' => true,
    'expanded' => true,
    'query_builder' => function(\Doctrine\ORM\EntityRepository $er) {
        return $er->createQueryBuilder('i')
            ->where('i.group = 1');
    }
);

显然,你必须根据你的特定架构和变量名做一些调整。这还需要组和项之间的双向关联。这也只会为组1添加选择器。您必须为第二组添加另一个类似的东西。