Как добавить класс css в" строку формы " в шаблоне twig

Я хотел бы знать, как я могу добавить класс css на "{{ form_row() }}" в twig. На данный момент, у меня есть этот код :

{{ form_row(form.username, {'label' : "Login", 'attr': {'class': 'loginForm'}}) }}

... Но класс CSS "loginForm" не используется в HTML-коде.

спасибо :) !

4 ответов


Если вы хотите общий класс для form_row (это означает один класс для form_label, form_widget и form_errors), вы должны настроить блок field_row.

в этой статье объясняется, как настроить поля в форме: как настроить рендеринг формы. Для этого есть несколько методов.

например, я использую метод 2 (как настроить рендеринг формы: Метод 2):

{% extends 'form_div_layout.html.twig' %}

{% block field_row %}
{% spaceless %}
    {% set class='' %}
    {% if attr.class is defined %}
    {% set class = 'class="' ~ attr.class ~ '"' %}
    {% endif %}

    <div {{ class }} >
        {{ form_label(form, label|default(null)) }}
        {{ form_errors(form) }}
        {{ form_widget(form) }}
    </div>
{% endspaceless %}
{% endblock field_row %}

мой ответ очень похож на nni6, но он позволяет вам пройти через весь массив attr.

моя структура HTML предназначена для загрузки Twitter, но вы можете иметь все, что хотите. В этом примере также помещается класс ошибки на оболочке div, если есть какие - либо ошибки-эта часть не требуется, но полезна, если вы используете Bootstrap:

{% extends 'form_div_layout.html.twig' %}

{% block field_row %}
{% spaceless %}
    {% set field_row_classes = ['control-group'] %}
    {% if errors|length > 0 %}
        {% set field_row_classes = field_row_classes|merge(['error']) %}    
    {% endif %}

    <div class="{{ field_row_classes|join(' ') }}">
        {{ form_label(form, label|default(null)) }}
        <div class="controls">
            {{ form_widget(form, { 'attr' : attr|default({}) }) }}
            {{ form_errors(form) }}
            {% if help is defined %}
                <p class="help-block">{{ help }}</p>
            {% endif %}
        </div>
    </div>
{% endspaceless %}
{% endblock field_row %}

разница в том, что я называю form_widget С attr array (если он был указан, по умолчанию {})

теперь вы можете настроить свою форму как обычно, но пройти через пользовательский класс:

{{ form_row(myentity.myproperty, { 'label' : 'mylabel', 'attr' : { 'class' : 'myclass' }}) }}

Я использую этот код для настройки bootstrap в symfony

{% block field_row %}
{% spaceless %}
    <div class="control-group {% if errors|length > 0 %}error{% endif %}">
        {{ form_label(form, label, { 'attr': { 'class': 'control-label' } }) }}
        <div class="controls">
            {{ form_widget(form, { 'attr' : attr|default({}) }) }}
            {{ form_errors(form) }}
        </div>
    </div>
{% endspaceless %}
{% endblock field_row %}

самый простой способ выполнить это без перезаписи блоков:

{% set attr = {'class' : form.myElement.vars.attr.class ~ ' addedClasses...', 'style' : form.myElement.vars.attr.style ~ '; addedStyles...'} %}
{{- form_row(form.myElement, {'attr' : attr}) -}}