使用Twig的Symfony 2表单:将表单变量添加到现有类型

时间:2013-05-25 02:42:22

标签: forms symfony twig theming

我需要我的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枝条功能。

默认树枝功能可以在哪里被覆盖?怎么可以这样做?

请记住,这不是customizing a form。我需要知道如何为现有字段类型添加现有form variables

@nifr: 你的关键答案似乎是{% set typeClass ... %}。但模板的任何位置都没有定义的变量text。看一下158ff行的form_div_layout.html.twig,我认为类型确实只在form_widget级别设置,因此封装在那里。这意味着使用form_row级别的类型将导致给定的默认值(因此在测试时我发生了这种情况)。如果你能证明这是错的,我会很乐意接受你的回答。

2 个答案:

答案 0 :(得分:0)

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

虽然你说这不是关于形式定制,但它可以通过它来实现...快速介绍其他人现在阅读。

可以找到默认的symfony twig表单扩展名here

可以在Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig找到默认的树枝形式主题。

有关如何覆盖表单的一般信息可以在本书的如何Customize Form Rendering章节中找到,但我将很快对此进行总结。

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'

答案 1 :(得分:0)

在form_row块中,您可以使用:

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

form.vars.block_prefixes为您提供了一个包含更多信息的数组,它可能随版本而变化。但是从我到目前为止看到的它总是索引2