Шаблоны ядра¶
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 темы включает фрагменты по имени:
Twig сначала ищет шаблон в теме, затем в ядре Grav. Если у темы нет собственного partials/metadata.html.twig, используется шаблон ядра.
Переопределение или расширение¶
Файл с тем же именем в теме заменяет шаблон ядра. Это правильный инструмент, когда теме нужна совершенно другая разметка, как в большинстве тем для сообщений.
Но он не подходит для добавления одной строки. Скопированный фрагмент перестаёт получать исправления и дополнения ядра: тема, скопировавшая partials/metadata.html.twig до 2.1, так и не получила ссылку на Markdown-альтернативу, а тема, которая повторно экранировала meta.content поверх уже экранированного ядром, печатала &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 и оставьте только добавления.