Symfony 2 Forms with Twig: add form variable to existing types

[亡魂溺海] 提交于 2019-12-12 01:44:50

问题


I need my symfony2/twig forms to adhere to a certain condition: All form rows must look similar to this:

{% 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 %}

Notice that I need to get the field type within the form_row block. Alas, the field type is only defined at the widget level.

I definitely need a way to let my form_row know what type of field it is dealing with. So i suppose it would be best to somehow override the form_row twig function.

Where can the default twig functions be overridden? And how could this be done?

Remember, this is not about customizing a form. I need to know how to add to existing form variables for existing field types.

@nifr: The key answer for you seems to be the {% set typeClass ... %}. But there is not a defined variable text anywhere for the template. Look at form_div_layout.html.twig at line 158ff, I think the type really gets set only at the form_widget level and is thus capsulated to be there. That means using the type at the form_row level will aways result in the given default (So it occurred to me while testing). If you can prove this wrong I will happily accept your answer.


回答1:


How to override the form_row block in Twig adding attributes by field-type?

Though you say this is not about form customization it can be achieved with it ... Quick Introduction for others reading this now.

The default symfony twig form extensions can be found here.

The default twig form theme can be found at Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig.

General information on how to override forms can be found in the How to Customize Form Rendering chapter of the Book but i will sum this up shortly.

form_row Default

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

Overriding Form Level

Add this to the form template you want to customize:

{% form_theme form _self %}

If you want to put the {% block form_row %} into another bundle/template use this:

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

Now insert your custom form_row block after the form_theme declaration or put it into the specified template (in our case this would be AcmeDemoBundle:Form:fields.html.twig).

In my example we will add the class 'error' if there is an error in the form row and a another classname nameely the type name of the current field-type.

{% 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 %}

if you want to apply your form_row block system-wide add your AcmeDemoBundle:Form:fields.html.twig to your twig.templating.form.resources !

# app/config/config.yml
framework:
    templating:
        form:
            resources:
                - 'AcmeDemoBundle:Form'



回答2:


In the form_row block you can use :

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

form.vars.block_prefixes gives you an array with more information and it might change with versions. But from what I have seen so far it is always index 2



来源:https://stackoverflow.com/questions/16745908/symfony-2-forms-with-twig-add-form-variable-to-existing-types

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!