我真的需要你帮助创建一个表单。我的实体包含$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
尝试谷歌,但是,说实话,我不知道从哪里开始:/
答案 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添加选择器。您必须为第二组添加另一个类似的东西。