Symfony2如何呈现复选框?

Symfony2如何呈现复选框?,symfony,choice,formbuilder,Symfony,Choice,Formbuilder,我有一个formbuilder表单,上面有国家的多选列表。当我将它们呈现在我的表单上时,如下所示: {{ form_widget(edit_form.countries) }} <input type="checkbox" name="..." value="AD" /><label for="...">Andorra</label> <input type="checkbox" name="..." value="AE" /><label

我有一个formbuilder表单,上面有国家的多选列表。当我将它们呈现在我的表单上时,如下所示:

{{ form_widget(edit_form.countries) }}
<input type="checkbox" name="..." value="AD" /><label for="...">Andorra</label>
<input type="checkbox" name="..." value="AE" /><label for="...">United Arab Emirates</label>
<input type="checkbox" name="..." value="AF" /><label for="...">Afghanistan</label>
它们看起来是这样的:

{{ form_widget(edit_form.countries) }}
<input type="checkbox" name="..." value="AD" /><label for="...">Andorra</label>
<input type="checkbox" name="..." value="AE" /><label for="...">United Arab Emirates</label>
<input type="checkbox" name="..." value="AF" /><label for="...">Afghanistan</label>
安道尔 阿拉伯联合酋长国 阿富汗 我希望每个选项都显示在浏览器中自己的行上,而不是全部显示在一行中。如何在选项周围或选项之间插入html?还是有一种CSS方法可以实现这一点

谢谢。

来自Symfony文档

您基本上需要做的是重载checkbox\u小部件

{% form_theme form _self %}

{% block checkbox_widget %}
{% spaceless %}
    <input type="checkbox" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />
{% endspaceless %}
{% endblock checkbox_widget %}
{%form\u主题表单\u self%}
{%block复选框\小部件%}
{%spaceless%}
{%endspaceless%}
{%endblock复选框\小部件%}

当然,您可以将您的小部件与CSS放在同一行中(但这不是一个Symfony2问题)。

正如Kuba在回答中所说,这听起来部分像是一个CSS问题。从语义上讲,注入类似于

标记的东西没有多大意义,但是如果您愿意,可以按照库巴回答中的文档进行操作

如果您希望编写一些CSS以使这些元素逐行显示,您可以对symfony的默认输出使用以下内容:

input, label {
    float: left;
}

input {
    clear: left;
}
当然,这实际上会导致所有输入和标签标签向左浮动,这可能不适合您,因此您可以a)将您的复选框包装到另一个div中,并使用css子选择器,如
.checkboxes input、.checkboxes label
b)使用以下命令将自定义css类应用到您的小部件:

{{ form_widget(form.name, { 'attr': {'class': 'foo'} }) }}

CSS也是一样的,但不是
input
,而是
.foo

我发现一种更懒惰的方法是迭代表单/选择数组

在最简单的情况下,呈现一个表单可能需要执行以下操作:

{{ form_widget(form) }}
{{ form_row(form.itemA) }}
{{ form_row(form.itemB) }}
{{ form_row(form.itemC) }}
要获得更高的粒度,您可以执行以下操作:

{{ form_widget(form) }}
{{ form_row(form.itemA) }}
{{ form_row(form.itemB) }}
{{ form_row(form.itemC) }}
但是如果“itemA”是一个多选项,那么您将不得不在同一行上呈现整个列表。如果在开始主题化之前,您希望获得更高的粒度,可以这样做:

{% for t in form.itemA %}
{{ form_row(t) }}
{% endfor %}

这将使每个复选框在其自己的行上,或者给您一个机会在每个项目之间执行任何您想执行的操作。

谢谢,我觉得文档中没有明确说明这一点。感谢您的回答。我发现另一种呈现复选框的方法也很有用:@JasonSwett取决于您试图实现的目标。在由您链接的答案中显示单独建议的字段会强制您将相同的html片段复制到要使用复选框的任何位置。在某些情况下,例如,当您没有一致的方式显示复选框时,它可能很有用。大多数情况下,最好只定义一次这个块,尤其是如果它总是相同的。在某些情况下,这个答案可能有用,而在其他情况下,我链接的答案可能有用。扩展小部件时标签的行为是什么?我还想将标签添加到一个环境中