Макеты определяют каркас страницы , то есть все, что повторяется на странице, например заголовок и нижний колонтитул. Макеты часто содержат тег HTML, а также теги HEAD, TITLE и BODY.

Введение

Шаблоны компоновки находятся в подкаталоге /layouts каталога theme. Файлы шаблонов макетов должны иметь расширение htm. Внутри файла макета вы должны использовать тег {% page %} для вывода содержимого страницы. Простейший пример макета:

<html>
    <body>
        {% page %}
    </body>
</html>

Чтобы использовать макет страницы, страница должна указывать имя файла макета (без расширения) в разделе «Конфигурация».  Помните, что если вы ссылаетесь на макет из подкаталога, вы должны указать имя подкаталога. Пример шаблона страницы с использованием макета default.md:

url = "/"
layout = "default"
==
<p>Hello, world!</p>

Когда запрашивается эта страница, ее содержимое объединяется с макетом, или, точнее, - тег {% page %} макета заменяется содержимым страницы. Предыдущие примеры генерировали бы следующую разметку:

<html>
    <body>
        <p>Hello, world!</p>
    </body>
</html>

Обратите внимание, что вы можете визуализировать чанки в макетах. Это позволяет вам совместно использовать общие элементы разметки между различными макетами. Например, у вас может быть часть, которая выводит ссылки CSS и JavaScript на сайте. Этот подход упрощает управление ресурсами - если вы хотите добавить ссылку на JavaScript, вы должны изменить один частный, а не редактировать все макеты.

Раздел «Конфигурация» является необязательным для макетов. Поддерживаемые параметры конфигурации - это имя (name) и описание (description). Параметры являются необязательными и используются в пользовательском интерфейсе. Пример шаблона макета с описанием:

description = "Basic layout example"
==
<html>
    <body>
        {% page %}
    </body>
</html>

Заполнители

Заполнители позволяет страницам вводить контент в макет. Заполнители определяются в шаблонах макета с тегом {% placeholder name %}. В следующем примере показан шаблон макета с заполнителем head, определяющий  HTML раздел HEAD.

<html>
    <head>
        {% placeholder head %}
    </head>
    ...

Страницы могут добавлять контент к заполнителям с тегами {% put %} и {% endput %} . В следующем примере демонстрируется простой шаблон страницы, который вставляет ссылку CSS на место заполнителя head, определенного в предыдущем примере

url = "/my-page"
layout = "default"
==
{% put head %}
    <link href="/themes/demo/assets/css/page.css" rel="stylesheet">
{% endput %}

<p>The page content goes here.</p>

У заполнителей может быть содержание по умолчанию (default), которое может быть заменено или дополнено страницей. Пример определения заполнителя в шаблоне макета:

{% placeholder sidebar default %}
    <p><a href="/contacts">Contact us</a></p>
{% endplaceholder %}

На странице может быть добавлено больше содержимого для заполнителя. Тег {% default %} указывает место, где должно отображаться содержимое заполнителя по умолчанию. Если тег не используется, содержимое заполнителя полностью заменяется.

{% put sidebar %}
    <p><a href="/services">Services</a></p>
    {% default %}
{% endput %}

Проверка наличия заполнителя

В шаблоне макета вы можете проверить наличие содержимого заполнителя с помощью функции placeholder() . Это позволяет генерировать разную разметку в зависимости от того, получает ли страница контент на место заполнителя. Пример:

{% if placeholder('sidemenu') %}
    <!-- Markup for a page with a sidebar -->
    <div class="row">
        <div class="col-md-3">
            {% placeholder sidemenu %}
        </div>
        <div class="col-md-9">
            {% page %}
        </div>
    </div>
{% else %}
    <!-- Markup for a page without a sidebar -->
    {% page %}
{% endif %}

Динамические макеты

Макеты, например страницы, могут использовать любые функции Twig. Подробную информацию см. В документации по динамическим страницам. В разделе PHP макета вы можете определить следующие функции для обработки жизненного цикла выполнения страницы: onStart(), onBeforePageStart() и onEnd(). Функция onStart() выполняется в начале обработки страницы. Функция onBeforePageStart() выполняется после запуска  компонентов макета, но до выполнения функции onStart() страницы. Функция onEnd() выполняется после отображения страницы. Последовательность, выполняемая обработчиками, следующая:

  • Функция onStart() шаблона.
  • Функция onRun() компонентов шаблона.
  • Функция onBeforePageStart() шаблона.
  • Функция onStart() страницы.
  • Функция onRun() компонентов страницы.
  • Функция onEnd() страницы.
  • Функция onEnd() шаблона.