Перекрытие блоков в составе шаблонов 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 %}
Ответы
Ответ 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 %}
Ответ 2
Проверьте тег embed:
http://twig.sensiolabs.org/doc/tags/embed.html
Не работает так, как вы хотите, но я думаю, что он как можно ближе к вам.
Ответ 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 %}
Единственное, что вам нужно обернуть все в блок, этот поддельный "основной" блок.