Как запретить Twig добавлять класс управления формой в поля, которые он генерирует? - PullRequest
2 голосов
/ 07 ноября 2019

У меня есть этот код:

{% for key, customField in customFields %}
   {{ form_widget(formVirtualTerminal['cf_' ~ key], { 'attr': {'placeholder': customField['FieldDisplayName'], 'name': customField['FieldName'], 'class' : 'row no-gutters mb-3'} }) }} 
{% endfor %}

, который пересекает массив и выводит некоторые поля для него. Однако по неизвестным мне причинам во всех этих полях создается класс form-control, и это разрушает дизайн страницы.

В этом вопросе ( удалить контроль формы в symfony строки строки)/ twig ) упомянуто, что это часть темы Bootstrap по умолчанию, и они обсуждают, как эту тему можно деактивировать на уровне приложения.

Однако я предпочитаю не делать таких радикальных изменений, если это возможно. Я хотел бы попросить Twig не добавлять классы.

Ниже приведен взлом, который решает проблему путем удаления этого класса:

$("#custom-text-field-container .form-control").removeClass("form-control");

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

Есть ли способ сказать ветке не записывать form-control класс в эти текстовые поля?

1 Ответ

1 голос
/ 07 ноября 2019

Вы не можете предотвратить это, не внося изменения в тему

Вы не можете "запретить ветке не добавлять классы".

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

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

Например, для классов HTML обычный подход состоит в том, чтобы просто объединить любые классы, которые вы передаете, с классами, установленными в шаблоне по умолчанию.


Обходной путь при сохранении большинстватемы формы, которую вы используете

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

Вам нужно будет переписать только те части, которые вам мешают, оставив все остальное как есть.

Например, «полная» новая тема может быть такой короткой, как:

{# templates/form/your_theme.html.twig #}
{% use 'bootstrap_4_layout.html.twig' %}

{% block form_widget_simple -%}
    {% if type is not defined or type != 'hidden' %}
        {%- set attr = attr|merge({class: (attr.class|default('') ~ (type|default('') == 'file' ? ' custom-file-input' : ''))|trim}) -%}
    {% endif %}
    {%- if type is defined and (type == 'range' or type == 'color') %}
        {# Attribute "required" is not supported #}
        {%- set required = false -%}
    {% endif %}
    {{- parent() -}}
{%- endblock form_widget_simple %}

Это почти тот же form_widget_simple блок , что и исходный , я просто удалил класс form-control, который объединен с классами, через которые вы можете пройти.

Вы можете использовать эту форму только в шаблонах, для которых вы хотите эту пользовательскую тему, выполнив это в соответствующем шаблоне:

{% form_theme form 'form/your_theme.html.twig' %}

Или если вы хотите использовать ее по умолчанию во всех формах в вашем приложении:

# config/packages/twig.yaml
twig:
    form_themes: ['form/your_theme.html.twig']
    # ...
...