Существует ли вообще «хороший» способ достичь этой функциональности? Я прочитал о теге «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 %}
Я нашел решение. Используйте функцию 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 %}
Единственное, что вам нужно обернуть все в блок, этот поддельный «основной» блок.