Перейти к содержанию

Шаблоны ядра

Grav поставляет небольшой набор Twig-шаблонов в system/templates, которые каждая тема получает бесплатно. Теме нужно предоставить собственный шаблон, только если она хочет чего-то другого, и начиная с Grav 2.1 она может строить его на основе шаблона ядра вместо хранения копии.

Что предоставляет ядро

Шаблон Назначение
partials/metadata.html.twig Теги <meta> для страницы из page.metadata, а также тег <link rel="alternate" type="text/markdown">, который сообщает о Markdown-версии страницы
partials/messages.html.twig Flash-сообщения из grav.messages
default.md.twig Markdown-вывод страницы
default.html.twig, modular/default.html.twig Заглушки, сообщающие об отсутствии шаблона в теме. Тема всегда предоставляет свой вариант
external.html.twig Тип страницы external
flex/… Отладочные представления для Flex-объектов и коллекций

base.html.twig темы включает фрагменты по имени:

<head>
    {% include 'partials/metadata.html.twig' %}
</head>

Twig сначала ищет шаблон в теме, затем в ядре Grav. Если у темы нет собственного partials/metadata.html.twig, используется шаблон ядра.

Переопределение или расширение

Файл с тем же именем в теме заменяет шаблон ядра. Это правильный инструмент, когда теме нужна совершенно другая разметка, как в большинстве тем для сообщений.

Но он не подходит для добавления одной строки. Скопированный фрагмент перестаёт получать исправления и дополнения ядра: тема, скопировавшая partials/metadata.html.twig до 2.1, так и не получила ссылку на Markdown-альтернативу, а тема, которая повторно экранировала meta.content поверх уже экранированного ядром, печатала &amp;amp; в описаниях.

Начиная с Grav 2.1 базовые шаблоны также зарегистрированы в пространстве имён Twig @grav, поэтому шаблон темы может обратиться к оригиналу ядра, даже если файл с таким же именем существует в теме:

{# user/themes/mytheme/templates/partials/metadata.html.twig #}
{% include '@grav/partials/metadata.html.twig' %}
<link rel="me" href="https://social.example/@me">

То же работает для {% extends %} любого базового шаблона, определяющего блоки, и для {% embed %}. Без пространства имён это невозможно: partials/metadata.html.twig темы затеняет шаблон ядра в основном пространстве имён Twig, и include 'partials/metadata.html.twig' изнутри этого файла включил бы сам себя.

Примечание

@grav всегда указывает только на system/templates. Шаблоны плагинов добавляются в основное пространство имён каждым плагином, и к ним обращаются обычным способом.

Проверка переопределений

Чтобы увидеть, какие базовые шаблоны заменяет тема, сравните две папки:

cd user/themes/mytheme/templates
for f in $(cd ../../../../system/templates && find . -name '*.twig'); do
  [ -f "$f" ] && echo "overrides $f"
done

Если переопределение оказалось копией с добавленной строкой или двумя, переключите его на include из @grav и оставьте только добавления.