如何在Symfony Twig渲染中检测窗口小部件类型?

guo*_*owy 3 symfony twig

为了渲染表单行,我需要检测正在呈现的窗口小部件的类型.例如,对于复选框,我想在输入之前输入标签,所以我这样做了:

{% block form_row %}
{% spaceless %}
    <div class="row">
        {% if form.vars.block_prefixes[1] == "checkbox" %}
            {{ form_widget(form) }}
            {{ form_label(form) }}
            {{ form_errors(form) }}
        {% else %}
            <div class="small-12 medium-3 columns">
                {{ form_label(form) }}
            </div>
            {{ form_widget(form) }}
            {{ form_errors(form) }}
        {% endif %}
    </div>
{% endspaceless %}
{% endblock form_row %}
Run Code Online (Sandbox Code Playgroud)

我使用form.vars.block_prefixes [1]来确定它要渲染的小部件.是对的吗?还是有更好的方法?我似乎无法在文档中找到它.

Dar*_*ova 7

如果你看到symfony cookbook,你会发现:

块名称是字段类型的组合,以及正在呈现字段的哪个部分(例如,小部件,标签,错误,行)

因此,要自定义复选框表单类型呈现,您可以为小部件顺序定义checkbox_widget块和checkbox_row:

{% block checkbox_widget %}
{% spaceless %}
        <label {% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>
            {{ label }}
        </label>
        <input type="checkbox" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />  
{% endspaceless %}
{% endblock checkbox_widget %}

{% block checkbox_row %}
{% spaceless %}
        {{ form_widget(form) }}
        {{ form_errors(form) }}
{% endspaceless %}
{% endblock checkbox_row %}
Run Code Online (Sandbox Code Playgroud)

  • 这非常有帮助.谢谢.但是对于任何读取它的Symfony开发者来说,`type`变量应该包含这些信息. (3认同)
  • 但是,如果我们想根据输入的“类型”向表单添加一个特殊的类,例如这有效但不是有效的方法:`{% block widget_attributes %} {% set formControlCss = ' inputType-' ~ form.vars.block_prefixes.1 %} {% set attr = attr|merge({'class': (attr.class|default('')}) %} {{ parent() }} {% endblock widget_attributes % }`. 在这种情况下,扩展块是行不通的,除非您为每种类型都创建了一个块... (2认同)