Symfony2-FormBuilder-добавление класса в поле и ввод

Я хочу добавить класс в определенные поля ввода или метки из symfony2.

Я могу сделать что-то подобное в своей форме в Twig:

<div class="row">
    {{ form_label(form.subject) }}
    {{ form_widget(form.subject, { 'attr': {'class': 'c4'} }) }}
</div>

работает нормально. Но я должен настроить шаблон для каждой формы. И я должен разбить его на минимально возможный выходной уровень. Я действительно хочу использовать:

 {{ form_widget(form) }}

Итак, я думал, как я могу добавить класс css для l где-то в:

class SystemNotificationType extends AbstractType {
    public function buildForm(FormBuilder $builder, array $options) {
        $builder    ->add('subject', 'text', array( 'label'  => 'Subject' ) )
–

Я думал, что это может быть полезно, Так как мне нужно внести изменения только в одном месте.

Итак, как это можно сделать,или, может быть, я думаю неправильно.

любая помощь была бы большой,

большое спасибо, Филипп!--4-->

3 ответов


класс поля является частью слоя презентации вашего приложения, поэтому лучше всего создать тему веточки для ваших форм:

создайте файл fields.html.twig на Resources/views/Form вашего пакета и определите, как будет сформирована строка формы, например:

{% block field_row %}
<div class="row">
    {{ form_errors(form) }}
    {{ form_label(form) }}
    {{ form_widget(form, { 'attr': {'class': 'c4'} }) }}
</div>
{% endblock field_row %}

если вы хотите настроить только определенное поле, например поле fieldName формы formName, настройка строки:

{% block _formName_fieldName_row %}
<div class="row">
    {{ form_label(form) }}
    {{ form_errors(form) }}
    {{ form_widget(form, { 'attr': {'class': 'c4'} }) }}
</div>
{% endblock %}

редактировать настройка только поле:

{% block _formName_fieldName_widget %}
    {% set type = type|default('text') %}
    <input type="{{ type }}" {{ block('widget_attributes') }} value="{{ value }}" class="c4" />
{% endblock %}

затем во всех шаблонах форм вы хотите использовать эту тему добавить:

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

это подробно объясняется в книги


вы можете сделать это так:

class SystemNotificationType extends AbstractType {
    public function buildForm(FormBuilder $builder, array $options) {
        $builder->add('subject', 'text', array( 
            'label'  => 'Subject',
            'attr'   =>  array(
                'class'   => 'c4')
            )
        );
    }
}

Форма Тематизации


каждая часть того, как отображается форма, может быть настроена. Вы можете изменить способ отображения каждой формы "строка", изменить разметку, используемую для отображения ошибок, или даже настроить способ отображения тега textarea. Ничто не запрещено, и различные настройки могут использоваться в разных местах.

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

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

в PHP каждая форма "фрагмент" отображается через отдельный файл шаблона. Чтобы настроить любую часть отображения формы, вам просто нужно переопределить существующий шаблон, создав новый.

чтобы понять, как это работает, настройте фрагмент form_row и добавьте атрибут класса в div элемент, который окружает каждую строку. Для этого создайте новый файл шаблона, в котором будет храниться новая разметка:

{# src/Acme/TaskBundle/Resources/views/Form/fields.html.twig #}
{% block form_row %}
{% spaceless %}
<div class="form_row">
{{ form_label(form) }}
{{ form_errors(form) }}
{{ form_widget(form) }}
</div>
{% endspaceless %}
{% endblock form_row %}

фрагмент формы form_row используется при отрисовке большинства полей с помощью функции form_row. Чтобы сообщить компоненту формы использовать новый фрагмент form_row, определенный выше, добавьте в верхнюю часть шаблона, отображающего форму, следующее:

{# src/Acme/TaskBundle/Resources/views/Default/new.html.twig #}
{% form_theme form 'AcmeTaskBundle:Form:fields.html.twig' %}
{% form_theme form 'AcmeTaskBundle:Form:fields.html.twig'
'AcmeTaskBundle:Form:fields2.html.twig' %}
{{ form(form) }}

тег form_theme (в веточке) "импортирует" фрагменты, определенные в данном шаблоне, и использует их, когда рендеринг формы. Другими словами, когда функция form_row вызывается позже в этом шаблоне, она будет использовать блок form_row из вашей пользовательской темы (вместо блока form_row по умолчанию, который поставляется с Symfony).

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

если несколько пользовательских тем при условии, что они будут искать в указанном порядке, прежде чем вернуться к глобальной теме.

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

{# src/Acme/TaskBundle/Resources/views/Default/new.html.twig #}

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

{% form_theme form with ['AcmeTaskBundle:Form:fields.html.twig',
'AcmeTaskBundle:Form:fields2.html.twig'] %}

для получения дополнительной информации см. как настроить рендеринг на Symfony поваренная книга

Глобальная Форма Теминг


в приведенном выше примере вы использовали помощник form_theme (в Twig) для" импорта " пользовательских фрагментов формы в эту форму. Вы также можете сказать Symfony импортировать настройки формы по всему проекту.

веточка

для автоматического включения настраиваемых блоков из полей.формат html.шаблон twig, созданный ранее во всех шаблонах, измените файл конфигурации приложения:

# app/config/config.yml
  twig:
    form:
      resources:
        - 'AcmeTaskBundle:Form:fields.html.twig'

любой блоки внутри полей.формат html.шаблон twig теперь используется глобально для определения выходных данных формы.