Подтвердить что ты не робот

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' ) )
–

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

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

Любая помощь будет большой,

Большое спасибо, Philipp

4b9b3361

Ответ 1

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

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

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

EDIT: настройте только поле:

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

Это подробно описано в cookbook

Ответ 2

Вы можете сделать это следующим образом:

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

Ответ 3

Формирование Theming


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

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

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

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

Чтобы понять, как это работает, настройте фрагмент form_row и добавьте атрибут class в элемент 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 (в Twig) "импортирует" фрагменты, определенные в данном шаблоне, и использует их при рендеринге формы. Другими словами, когда функция 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

Глобальная форма Theming


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

Twig

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

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

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