Подтвердить что ты не робот

Перекрытие блоков в составе шаблонов Twig

Существует ли вообще "хороший" способ достичь этой функциональности? Я прочитал о теге "use", который покажется лучшим вариантом, но мне все еще не нравится, что он не позволит мне вносить какие-либо внешние html, только блоки.

Я использую тег 'include' в приведенном ниже примере, чтобы продемонстрировать намерение, которое я пытаюсь описать.

#base.html.twig
{% include 'elements/header.html.twig' %}
{% block content %}{% endblock %}
{% include 'elements/footer.html.twig' %}

#header.html.twig
<h1>This is my header</h1>
{% block page_title %} Default Page Title {% endblock %}

#index.html.twig
{% extends 'layouts/base.html.twig' %}
{# I want to be able to do this somehow #}
{% block page_title %} This is my overridden page title {% endblock %}
{% block content %} here is the index page content {% endblock %}
4b9b3361

Ответ 1

Я нашел решение. Используйте функцию block(), чтобы получить содержимое дочернего блока и передать его в header.html.twig как переменную в заявлении include:

#base.html.twig
{% include 'elements/header.html.twig' with {page_title: block('page_title')} %}
{% block content %}{% endblock %}
{% include 'elements/footer.html.twig' %}

#header.html.twig
<h1>This is my header</h1>
{% if page_title is empty %}
Default Page Title
{% else %}
{{ page_title }}
{% endif %}

#index.html.twig
{% extends 'layouts/base.html.twig' %}
{% block page_title %} This is my overridden page title {% endblock %}
{% block content %} here is the index page content {% endblock %}

Ответ 3

Это можно сделать. Здесь мое решение проблемы путем передачи переменной в представление.

#layout.twig
{% if sidebar is empty %}
    This is the default sidebar text.
{% else %}
    {% block sidebar %}{% endblock %}
{% endif %}
{% block content %}{% endblock %}

#index.twig
{% extends "layout.twig" %}
{% block sidebar %}
    This is the sidebar. It will override the default text.
{% endblock %}

{% block content %}
    This is the content.
{% endblock %}

#index.php (SlimPHP)
$app->render('index.twig', ['sidebar' => true]);

Так как я использую SlimPHP, я называю это передачей переменной sidebar в представление. Это можно продолжить, используя различные переменные, переданные в представление, поэтому вы можете выбрать sidebar1, sidebar2 и т.д.

Ответ 4

Я получил его для работы с очень простым взломом:

В основном это ведет себя так, потому что без {% extends "foo.html.twig" %} он не понимает блоки и просто делает их на месте.

Итак, пусть расширяется... ничего:

{% extends "nothing.html.twig" %}

На самом деле это всего лишь 1 блок:

# nothing.html.twig
{% block main %}
{% endblock %}

Единственное, что вам нужно обернуть все в блок, этот поддельный "основной" блок.