Перекрытие блоков в составе шаблонов 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 %} 

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

Я нашел решение. Используйте функцию 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 %} 

Проверьте тег embed: http://twig.sensiolabs.org/doc/tags/embed.html

Не работает точно так, как вы хотите, но я думаю, что он как можно ближе к вам.

Это может быть сделано. Вот мое решение проблемы, передав переменную виду.

 #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 и т. Д.

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

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

Итак, давайте продолжим … ничего:

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

Это ничто действительно не просто 1 блок:

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

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