Разница между настройкой темы формы и ссылочного блока в Symfony?

1

в чем разница между ссылкой на блок виджетов и его настройкой: документы говорят:

До сих пор, чтобы переопределить конкретный блок формы, лучший способ - скопировать блок по умолчанию из 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 %}

В чем разница?

Теги:

1 ответ

1
Лучший ответ

Первый пример в документации, на которую вы ссылаетесь, показывает, как переопределить весь виджет, отображающий ваш элемент формы.

Второй пример в документации, на которую вы ссылаетесь, показывает, как можно использовать повторное использование кода, чтобы вы не переписывали разделы шаблонов шаблонов, которые вы не изменяете. Итак, вместо того, чтобы объявлять

    {% 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' %}
  • 0
    Спасибо, у вас есть пример, где вы объявляете виджет снова и где вы используете parent ()?
  • 0
    Я отредактировал свой пост, добавив больше объяснений и пример кода.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню