关于symfony2表单组件及其模板的问题:
我有一堆复选框用于样式(在一个表单行中大约10个)。通常我会以这种方式使用<label>
标记:<label><input/> some text</label>
但我找不到在表单模板中更改它的方法(form_div_layout.html.twig)。我甚至找不到一种方法来包装输入小部件及其标签周围的任何标记,我总是最终得到这样的标记:<input/> <some_tag><label>some text</label></some_tag>
或<some_tag><input/></some_tag> <label>some text</label>
,这至少可以说是非常有用的。 ..
用Google搜索了一下,但找不到答案。
答案 0 :(得分:5)
Whistlegreg是正确的,您需要覆盖树枝表单模板。但是,您无需删除{% block generic_label %}
块。如果您需要有关如何覆盖模板的帮助,请参阅他的答案。
为了使用标签包装复选框输入标签,第一步是覆盖{% block choice_widget %}
块并从打印出来的{{ form_label(child) }}
部分中删除{% if expanded %}
行单独的标签。
{% block choice_widget %}
{% spaceless %}
{% if expanded %}
<div {{ block('widget_container_attributes') }}>
{% for child in form %}
{{ form_widget(child) }}
{# {{ form_label(child) }} <--------------------- remove this line #}
{% endfor %}
</div>
{% else %}
<select {{ block('widget_attributes') }}{% if multiple %} multiple="multiple"{% endif %}>
{% if empty_value is not none %}
<option value="">{{ empty_value|trans }}</option>
{% endif %}
{% if preferred_choices|length > 0 %}
{% set options = preferred_choices %}
{{ block('widget_choice_options') }}
{% if choices|length > 0 and separator is not none %}
<option disabled="disabled">{{ separator }}</option>
{% endif %}
{% endif %}
{% set options = choices %}
{{ block('widget_choice_options') }}
</select>
{% endif %}
{% endspaceless %}
{% endblock choice_widget %}
现在您只需处理{% block checkbox_widget %}
块中的标签打印。
{% block checkbox_widget %}
{% spaceless %}
<label for="{{ id }}"><input type="checkbox" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />{{ label|trans }}</label>
{% endspaceless %}
{% endblock checkbox_widget %}
您需要对{% block radio_widget %}
执行相同的操作,因为它现在不会有标签。
{% block radio_widget %}
{% spaceless %}
<label for="{{ id }}"><input type="radio" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />{{ label|trans }}</label>
{% endspaceless %}
{% endblock radio_widget %}
答案 1 :(得分:4)
我认为这就是你要找的东西: http://symfony.com/doc/current/book/templating.html#overriding-bundle-templates
您可以通过在app / resources文件夹中创建具有相同名称的其他文件来覆盖任何默认树枝模板。
在你的情况下你要覆盖form_div_layout.html.twig模板,将它从包中复制到app / Resources / TwigBundle / views / Form / form_div_layout.html.twig,自定义,symfony将使用它而不是默认。
编辑:覆盖模板后,您可以修改{% block checkbox_widget %}
以使用树枝变量将输入包装为标签标记
<label{% for attrname,attrvalue in attr %} {{attrname}}="{{attrvalue}}"{% endfor %}>
{{label|trans }}
<input type="checkbox" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />
</label>
您还需要删除'generic_label'定义,这意味着每个其他块都需要修改。
答案 2 :(得分:1)
可以为特定表单窗口小部件类型的行定义块,例如{% block checkbox_row %}
。我在这里发现了这个:http://forum.symfony-project.org/viewtopic.php?f=23&t=57986#p153546
然后,需要将小部件周围的标签包装为复选框的所有内容如下:
{% block checkbox_row %}
{% spaceless %}
<div>
{% if not compound %}
{% set label_attr = label_attr|merge({'for': id}) %}
{% endif %}
{% if required %}
{% set label_attr = label_attr|merge({'class': (label_attr.class|default('') ~ ' required')|trim}) %}
{% endif %}
<label{% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>{{ label|trans({}, translation_domain) }}
{{ form_widget(form) }}
{% if label is empty %}
{% set label = name|humanize %}
{% endif %}
</label>
{{ form_errors(form) }}
</div>
{% endspaceless %}
{% endblock checkbox_row %}
标签代码已从{% block form_label %}
复制并粘贴。当我使用Zurb的Foundation框架时,我将窗体错误放在窗口小部件下面。
单选按钮的代码更复杂,因为{% block radio_row %}
似乎不存在,所以你必须采用Whistlegreg的建议并编辑{% block choice_widget %}
块,在Symfony 2.1中,实际上现在是{ {1}}。这是我的代码:
{% block choice_widget_expanded %}
在Symfony 2.1.9 DEV中测试并使用。
答案 3 :(得分:0)
我认为您可以通过更改form_row块来实现。
尝试这样的事情:
{% block form_row %}
{% spaceless %}
<label>
{{ form_widget(form) }}
</label>
{% endspaceless %}
{% endblock form_row %}
但要小心,这绝对不是一个非常灵活的解决方案......
您应该仅将其用于特定类型,而不是所有类型
无论如何,您必须使用form_row
才能使其正常工作。