hiimnotwordy
@hiimnotwordy
full-stack

Как перекрыть атрибуты формы в FormBuilder?

Бутстрап из коробки установленный на симфонию выдает форму с помощью FormBuilder с div class="form-group" и со стандартным классом form-control-label и input с классом form-control-file.

Для улучшения внешнего вида кнопки загрузки файлов бутстрап предлагает использовать другие классы https://getbootstrap.com/docs/4.0/components/forms... Для div class="custom-file" и custom-file-label с custom-file-input для элементов этого контейнера.

Вопрос: есть ли возможность формбилдером выгонять форму сразу с нужными мне классами без классов по умолчанию?
Пробую так:
$builder
            ->add('imageFile', FileType::class, [
                'required' => true,
                'attr' => ['class' => 'custom-file-input'],
            ])

Получаю дописанный к стандартному класс: class="custom-file-input form-control-file", а нужен просто class="custom-file-input".

И как в формбилдере перезаписать класс div в данном контексте не нашел в доке: https://symfony.com/doc/4.0/best_practices/forms.html

Из этого:
<div class="form-group">
    <label class="form-control-label required" for="image_imageFile"></label>
    <input type="file" id="image_imageFile" name="image[imageFile]" required="required" class="form-control-file">
</div>

Мне надо получить это:
<div class="custom-file">
    <label class="custom-file-label required" for="image_imageFile">Choose file</label>
    <input type="file" id="image_imageFile" name="image[imageFile]" required="required" class="custom-file-input">
</div>


UPD: сделал так (готовое решение, вдруг кому понадобится)
form_div_layout_custom.html.twig

{# https://getbootstrap.com/docs/4.0/components/forms/?#file-browser #}

{%- block form_row -%}
    <div class="custom-file">
        {{- form_widget(form) -}}
        {{- form_label(form) -}}
        {{- form_errors(form) -}}
    </div>
{%- endblock form_row -%}


{%- block form_start -%}
    {%- do form.setMethodRendered() -%}
    {% set method = method|upper %}
    {%- if method in ["GET", "POST"] -%}
        {% set form_method = method %}
    {%- else -%}
        {% set form_method = "POST" %}
    {%- endif -%}
    <form name="{{ name }}" method="{{ form_method|lower }}"{% if action != '' %} action="{{ action }}"{% endif %}{% for attrname, attrvalue in attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}{% if multipart %} enctype="multipart/form-data"{% endif %}>
    {%- if form_method != method -%}
        <input type="hidden" name="_method" value="{{ method }}" />
    {%- endif -%}
{%- endblock form_start -%}


{%- block form_errors -%}
    {%- if errors|length > 0 -%}
    <div class="invalid-feedback">
            {%- for error in errors -%}
                {{ error.message }}
            {%- endfor -%}
    </div>
    {%- endif -%}
{%- endblock form_errors -%}


И в самом темплэйте:
image.html.twig

{# https://getbootstrap.com/docs/4.0/components/forms/?#file-browser #}
                {% form_theme form 'form/form_div_layout_custom.html.twig' %}

                {% if form_errors(form.imageFile) != '' %}
                    {{ form_start(form, { 'attr': {'class': 'was-validated'} }) }}
                {% else %}
                    {{ form_start(form) }}
                {% endif %}

                    {{ form_row(form.imageFile) }}

                <button type="submit" class="btn mt-3 mb-3 btn-default btn-primary btn-block" formnovalidate>{{ 'button.save'|trans }}</button>

                {{ form_end(form) }}


И вывод имени файла с помощью JS (jquery-3.2.1):
// Set file name for label file-browser {# https://getbootstrap.com/docs/4.0/components/forms/?#file-browser #}
$('.custom-file-input').on('change',function(){

var fileName = $(this).val().split('\\').pop();

    $("#original-file-name").text(fileName);
})
  • Вопрос задан
  • 117 просмотров
Пригласить эксперта
Ответы на вопрос 2
попробуй в в твиге переопределить виджет инпута типа файл
Ответ написан
Комментировать
hiimnotwordy
@hiimnotwordy Автор вопроса
full-stack
Спасибо, Денис - то что нужно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы