среда, 10 октября 2012 г.

Кастомизация вывода форм в Symfony2

В официальном кукбуке, есть статья How to customize form rendering, в которой описано, как создать свою тему для форм в Symfony2 (свои шаблоны). Этот пост - пересказ моментов, которые я не понял с первого раза.

Итак, symfony2 из коробки использует шаблонизатор Twig, с ним и будем работать.

Шаблон форм, по умолчанию, лежит в файле:

[project_dir]/vendor/symfony/symfony/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig (посмотреть содержимое на github)

Есть еще один шаблон (form_table_layout.html.twig, из той же папки), подключить его можно сразу для всего приложения:

# app/config/config.yml
twig:
    form:
        resources: ['form_table_layout.html.twig']

...или для отдельного шаблона:

# some_template_file.html.twig
{% form_theme form 'form_table_layout.html.twig' %}


Существует два пути для переопределения блоков.

1. Переопределить блоки форм в шаблоне с текущей формой (переопределенные блоки будут использоваться только в текущем файле)

# some_template_file.html.twig
{% form_theme form _self %}

2. Переопределить блоки в отдельном шаблоне (позволяет использовать переопределенные блоки во многих местах)

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

По тэгу form_theme Twig ищет переопределенные блоки для форм. В первом случае - в текущем файле, во втором - в отдельном шаблоне.

И, наконец, то, к чему мы и стремились - копируем нужный блок из дефолного шаблона и кастомизируем его под свои нужды. Например переопределим блок form_widget_simple, добавив в конец <input> тег <span> с классом valid:

# some_template_file.html.twig
{% block form_widget_simple %}
{% spaceless %}
    {% set type = type|default('text') %}
    <input block="block" empty="empty" endif="endif" if="if" is="is" not="not" type="{{ type }}" value="{{ value }}" widget_attributes="widget_attributes" /><span class="valid">&nbsp;</span>
{% endspaceless %}
{% endblock form_widget_simple %}

Комментариев нет:

Отправить комментарий