Symfony 2 Forms с Twig: добавляем переменную формы к существующим типам

Мне нужно, чтобы мои формы 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 twig.

Где можно переопределить функции ветки по умолчанию? А как это можно было сделать?

Помните, что речь идет не об настройке формы . Мне нужно знать, как добавить к существующим переменные формы для существующих типов полей.

@nifr: Кажется, ключевым ответом для вас будет {% set typeClass ... %}. Но нигде нет определенной переменной text для шаблона. Посмотрите на form_div_layout.html.twig в строке 158ff, я думаю, что тип действительно устанавливается только на уровне form_widget и, таким образом, заключен в капсулу, чтобы быть там. Это означает, что использование типа на уровне form_row всегда приведет к заданному по умолчанию (так мне пришло в голову во время тестирования). Если вы докажете, что это не так, я с радостью приму ваш ответ.


person marc    schedule 25.05.2013    source источник
comment
пожалуйста, просмотрите мой ответ и прокомментируйте, если что-то неясно - в противном случае примите, пожалуйста :)   -  person Nicolai Fröhlich    schedule 25.05.2013


Ответы (2)


Как переопределить блок form_row в Twig, добавляя атрибуты по типу поля?

Хотя вы говорите, что речь идет не о настройке формы, это может быть достигнуто с ее помощью ... Краткое введение для других, читающих это сейчас.

Расширения формы ветки symfony по умолчанию можно найти здесь.

Тему формы веточки по умолчанию можно найти по адресу 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_row после объявления form_theme или поместите его в указанный шаблон (в нашем случае это будет AcmeDemoBundle: Form: fields.html.twig).

В моем примере мы добавим класс error, если есть ошибка в строке формы, и другое имя класса, а именно имя типа текущего типа поля.

{% 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'
person Nicolai Fröhlich    schedule 25.05.2013
comment
Извините, что не ответил вам раньше. Я только что вернулся к работе над этим проектом. - person marc; 28.05.2013
comment
Спасибо за отличный и подробный ответ, но это не решает мою проблему. Вы довольно хорошо подытожили все, что необходимо для формирования тем, но у меня уже было что-то подобное. @nifr, посмотрите на исходный вопрос для уточнения. - person marc; 28.05.2013

В блоке form_row вы можете использовать:

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

form.vars.block_prefixes дает вам массив с дополнительной информацией, который может меняться с версиями. Но из того, что я видел до сих пор, это всегда индекс 2.

person Stéphan Champagne    schedule 12.06.2013