в чем разница между ссылкой на блок виджетов и его настройкой: документы говорят:
До сих пор, чтобы переопределить конкретный блок формы, лучший способ - скопировать блок по умолчанию из form_div_layout.html.twig, вставить его в другой шаблон и затем настроить его. Во многих случаях вы можете избежать этого, указав базовый блок при его настройке
Но для меня это выглядит одинаково:
{# app/Resources/views/Form/fields.html.twig #}
{% extends 'form_div_layout.html.twig' %}
{% block integer_widget %}
<div class="integer_widget">
{{ parent() }}
</div>
{% endblock %}
{# app/Resources/views/form/fields.html.twig #}
{% block integer_widget %}
<div class="integer_widget">
{% set type = type|default('number') %}
{{ block('form_widget_simple') }}
</div>
{% endblock %}
В чем разница?
Первый пример в документации, на которую вы ссылаетесь, показывает, как переопределить весь виджет, отображающий ваш элемент формы.
Второй пример в документации, на которую вы ссылаетесь, показывает, как можно использовать повторное использование кода, чтобы вы не переписывали разделы шаблонов шаблонов, которые вы не изменяете. Итак, вместо того, чтобы объявлять
{% set type = type|default('number') %}
{{ block('form_widget_simple') }}
снова и снова в вашем главном виджете, вы можете вместо этого ссылаться на базовый блок, который уже имеет это. Если вы ссылаетесь на базовые блоки из внешнего шаблона, вы можете вызвать родительский блок через {{ parent() }}
, и если вы ссылаетесь на блоки из того же шаблона, что и форма, вы можете вызвать базовый блок через {{ block('base_integer_widget') }}
Если вы посмотрите на него с точки зрения PHP/Symfony с наследованием, что также поможет объяснить его. Скажем, у вас есть один класс PHP, который расширяет другой, и вы хотите переопределить функцию с именем doSomething()
- вы можете переписать всю функцию по мере необходимости. Но, скажем, doSomething()
имеет блок общего кода, который вы всегда хотите запустить, тогда вы можете выполнить свои действия и вызвать parent::doSomething()
в конце его. Или, если вы обращаетесь к другому сервису Symfony, вы можете называть $this->get('some.service')->doSomething()
.
В этой же концепции здесь вы можете либо переопределить весь виджет, либо вы можете переопределить его части - возможно, добавив окружение <div></div>
но вызвав {{ parent() }}
изнутри, поскольку вы ничего не меняете еще о виджетах.
У меня есть один пример, когда я переопределил стандартное поведение кнопок в Symfony и использовал оба случая. У меня есть отдельный файл шаблона в 'app/Resources/views/Form/navigationButton.html.twig' со следующим кодом:
{% use 'form_div_layout.html.twig' %}
{% block button_widget -%}
{% set attr = attr|merge({class: (attr.class|default(''))|trim}) %}
{{- parent() -}}
{%- endblock %}
{% block button_row -%}
{{- form_widget(form) -}}
{%- endblock button_row %}
Я переопределяю виджет кнопки, позволяя передавать дополнительные классы в качестве атрибутов, а затем вызывать родительский виджет для его создания как обычно. Затем я переопределяю виджет строки строки, чтобы не помещать окружающие теги <div></div>
так как я не хотел этого в своем шаблоне (см. Оригиналы здесь и здесь).
Затем для использования в одном из моих шаблонов я просто делаю:
{% form_theme form ':Form:navigationButton.html.twig' %}