Я пытаюсь переопределить некоторые поля bootstrap_4_layout.html.twig, но обнаружил некоторые проблемы с блоком radio_widget. Мне нужно изменить элемент div на метку, но когда я отменяю блок, радиоэлемент дублируется при просмотре. Рассматриваемый div - это то, что с классом custom-control
{% block radio_widget %}
{% set parent_label_class = parent_label_class|default(label_attr.class|default('')) %}
{% if 'radio-custom' in parent_label_class %}
{% set attr = attr|merge({class: (attr.class|default('') ~ ' custom-control-input')|trim}) %}
<div class = "custom-control custom-radio{{ 'radio-inline' in parent_label_class ? ' custom-control-inline' }}">
{{ form_label(form, null, { widget: parent() }) }}
</div>
{% else %}
{% set attr = attr|merge({class: (attr.class|default('') ~ ' form-check-input')|trim}) %}
<div class = "form-check{{ 'radio-inline' in parent_label_class ? ' form-check-inline' }}">
{{ form_label(form, null, { widget: parent() }) }}
</div>
{% endif %}
{% endblock radio_widget %}
Анализируя дом с консолью, я вижу, что создаются два элемента с классом custom-control. Почему?




Я нашел решение. Я переопределил блок radio_widget и изменил элемент div меткой:
{% block radio_widget %}
{% set parent_label_class = parent_label_class|default(label_attr.class|default('')) %}
{% if 'radio-custom' in parent_label_class %}
{% set attr = attr|merge({class: (attr.class|default('') ~ ' custom-control-input')|trim}) %}
<label class = "custom-control custom-radio{{ 'radio-inline' in parent_label_class ? ' custom-control-inline' }}">
{{ form_label(form, null, { widget: parent() }) }}
</label>
{% else %}
{% set attr = attr|merge({class: (attr.class|default('') ~ ' form-check-input')|trim}) %}
<div class = "form-check{{ 'radio-inline' in parent_label_class ? ' form-check-inline' }}">
{{ form_label(form, null, { widget: parent() }) }}
</div>
{% endif %}
{% endblock radio_widget %}
Затем я отменяю также блок checkbox_radio_label. Внутри я подставил базовый код:
// ...
{{ widget|raw }}
// ...
С участием:
{% set attr = attr|merge({class: (attr.class|default('') ~ ' custom-control-input')|trim}) %}
<input type = "radio" {{ block('widget_attributes') }}{% if value is defined %} value = "{{ value }}"{% endif %}{% if checked %} checked = "checked"{% endif %} />
Для справки о блоках bootstrap 4 twig см. Эту ссылку: https://github.com/symfony/symfony/blob/master/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_layout.html.twig
imho SelectType - монстр, когда дело доходит до генерации html-кода.