0

我需要我的 symfony2/twig 表单遵守特定条件:所有表单行必须与此类似:

{% block form_row %}
<div class="CONSTANT_CLASS class_based_on_field_type class_based_on_error">
    {{ form_label(form) }}
    {{ form_widget(form) }}
    ...
</div>
{% endblock form_row %}

请注意,我需要在 form_row 块中获取字段类型。唉,字段类型仅在小部件级别定义。

我绝对需要一种方法让我的 form_row 知道它正在处理什么类型的字段。所以我想最好以某种方式覆盖form_row树枝功能。

在哪里可以覆盖默认的树枝功能?怎么可能做到这一点?

请记住,这与自定义表单无关。我需要知道如何为现有字段类型添加现有表单变量

@nifr:您的关键答案似乎是{% set typeClass ... %}. text但是模板的任何地方都没有定义变量。查看第 158 行的 form_div_layout.html.twig,我认为该类型实际上只在 form_widget 级别设置,因此被封装在那里。这意味着在 form_row 级别使用类型将导致给定的默认值(所以它在测试时发生在我身上)。如果您能证明这是错误的,我将很乐意接受您的回答。

4

2 回答 2

0

如何覆盖 Twig 中的 form_row 块,按字段类型添加属性?

尽管您说这与表单自定义无关,但可以通过它来实现...现在正在阅读本文的其他人的快速介绍。

默认的 symfony twig 表单扩展可以在这里找到。

默认的 twig 表单主题可以在Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig 找到

关于如何覆盖表单的一般信息可以在本书的“如何自定义表单渲染”一章中找到,但我将很快对此进行总结。

form_row 默认

{% block form_row %}
{% spaceless %}
    <div>
        {{ form_label(form) }}
        {{ form_errors(form) }}
        {{ form_widget(form) }}
    </div>
{% endspaceless %}
{% endblock form_row %}

覆盖表单级别

将此添加到您要自定义的表单模板中:

{% form_theme form _self %}

如果您想将 {% block form_row %} 放入另一个包/模板中,请使用:

{% form_theme form 'AcmeDemoBundle:Form:fields.html.twig' %}

现在在 form_theme 声明之后插入您的自定义 form_row 块或将其放入指定的模板中(在我们的例子中,这将是AcmeDemoBundle:Form:fields.html.twig)。

在我的示例中,如果表单行中有错误,我们将添加类“错误”和另一个类名,即当前字段类型的类型名称。

{% block form_row %}
{% spaceless %}

{# set class to 'error' if errors exist #}
{% set attr = attr|merge({'class': attr.class|default('') ~ (errors|length > 0 ? ' error' : '') }) %}

{% set typeClass = ' ' ~ type|default('text') %}     
{# 
    you could also implement a logic matching input types with an array of their 
    desired classname-representations here.
#} 
{% set attr = attr|merge({'class': attr.class|default('') ~ type) }) %}

    <div class="{% for class in attr.class %}{{ class }}{% endfor %}{{ typeClass }}">
        {{ form_label(form) }}
        {{ form_errors(form) }}
        {{ form_widget(form) }}
    </div>
{% endspaceless %}
{% endblock form_row %}

如果您想在系统范围内应用您的 form_row 块,请将您的AcmeDemoBundle:Form:fields.html.twig添加到您的 twig.templating.form.resources !

# app/config/config.yml
framework:
    templating:
        form:
            resources:
                - 'AcmeDemoBundle:Form'
于 2013-05-25T12:07:12.517 回答
0

在 form_row 块中,您可以使用:

{{ form.vars.block_prefixes[2] }}

form.vars.block_prefixes 为您提供了一个包含更多信息的数组,并且它可能会随版本而变化。但从我目前所见,它始终是索引 2

于 2013-06-12T00:58:33.557 回答