Рецепты Twig¶
На этой странице собраны задачи и их решения, связанные с шаблонизатором Twig.
Вывод 5 последних записей блога¶
Проблема:
Вы хотите показывать в боковой панели сайта последние 5 записей блога, чтобы читатель видел свежую активность.
Решение:
Найдите страницу /blog, получите её дочерние страницы, отсортируйте их по дате по убыванию, а затем возьмите первые 5 для вывода в списке:
при использовании внутри страниц не забудьте добавить в заголовки страницы такую конфигурацию:
Добавление ссылок навигации для немодульных страниц¶
Проблема:
Вы хотите выводить ссылки навигации для немодульных страниц.
Решение:
Список записей блога за год¶
Проблема:
Вы хотите показать все записи блога, опубликованные в текущем календарном году.
Решение:
Найдите страницу /blog, получите её дочерние страницы, отфильтруйте подходящим dateRange() и отсортируйте их по дате по убыванию:
Вывод названия месяца на нужном языке¶
Проблема:
В некоторых шаблонах страниц используется фильтр Twig date, а он не учитывает локали и многоязычность. Поэтому даже если страница на языке, отличном от английского, месяц может выводиться по-английски, если шаблон показывает его название.
Решение:
У этой проблемы есть два решения.
Первый способ¶
Первый — использовать расширение Twig intl.
Установите https://github.com/Perlkonig/grav-plugin-twig-extensions. Убедитесь, что у вас установлено расширение PHP intl.
В шаблоне Twig вместо, например, {{ page.date|date("M") }} (как в теме Antimatter) используйте {{ page.date|localizeddate('long', 'none', 'it', 'Europe/Rome', 'MMM') }} (здесь укажите свой язык и часовой пояс).
Второй способ¶
Предположим, у вас в папке user/languages/ есть файлы переводов, и в en.yaml есть запись:
MONTHS_OF_THE_YEAR: [January, February, March, April, May, June, July, August, September, October, November, December]
А в fr.yaml:
MONTHS_OF_THE_YEAR: [Janvier, Février, Mars, Avril, Mai, Juin, Juillet, Août, Septembre, Octobre, Novembre, Décembre]
Тогда в Twig:
Здесь используется пользовательский фильтр Twig |ta из Grav, что означает Translate Array. В английской версии вывод может выглядеть примерно так:
А во французской:
Вывод содержимого страницы без аннотации¶
Проблема:
Вы хотите вывести содержимое страницы без аннотации в начале.
Решение:
Используйте фильтр slice, чтобы убрать аннотацию из содержимого страницы:
Как спрятать email от спам-ботов¶
Проблема:
Вы хотите спрятать email от спам-ботов.
Решение:
Включите обработку Twig в заголовках страницы:
Затем используйте фильтр Twig safe_email:
Выбор случайного элемента из переведённого массива¶
Проблема:
Вы хотите выбрать случайный элемент из массива, переведённого на определённый язык. Предполагается, что у вас настроен и сконфигурирован многоязычный сайт, как описано в документации.
Решение:
Также предположим, что у вас в папке user/languages/ есть файлы переводов, и в en.yaml есть запись:
А в fr.yaml:
Тогда в Twig:
Вывод изображения, загруженного через поле file¶
Проблема:
Вы добавили поле file в свою схему и хотите вывести изображение, добавленное в это поле.
Решение:
Поскольку поле file позволяет загружать несколько изображений, оно создаёт в метаданных страницы два вложенных объекта: первый — список загруженных изображений, а вложенный в него объект — набор свойств и значений для конкретного изображения.
Учтите: если нужно, чтобы пользователь выбрал только одно изображение, проще использовать поле filepicker, которое хранит один объект со свойствами выбранного изображения.
Если изображение одно, вывести его в шаблоне можно так:
Если вы разрешили загружать несколько изображений, Twig может выглядеть так:
Вывод изображения, выбранного в поле mediapicker¶
Проблема:
Вы добавили поле mediapicker в свою схему и хотите вывести выбранное изображение.
Решение:
Поле mediapicker можно добавить в схему так:
Поле mediapicker хранит путь к изображению строкой, например /home/background.jpg.
Чтобы обратиться к этому изображению через возможности работы с медиафайлами страницы, нужно разбить строку и получить:
- путь к странице, где хранится изображение;
- имя изображения.
Сделать это в Twig можно так:
Пользовательский фильтр/функция Twig¶
Проблема:
Иногда в Twig нужна логика, которую можно реализовать только на PHP, и тогда лучшее решение — создать пользовательский фильтр или функцию Twig. Фильтр обычно применяется к строке в формате "some string"|custom_filter, а функция может принимать строку или переменную любого другого типа: custom_function("some string"). По сути они очень похожи.
Можно также передавать дополнительные параметры: "some string"|custom_filter('foo', 'bar'), где эти параметры используются внутри фильтра. Вариант с функцией будет таким: custom_function("some string", 'foo', 'bar').
В этом примере мы создадим простой фильтр Twig, который принимает строку и разбивает её на части через разделитель. Это особенно удобно для номеров банковских карт, лицензионных ключей и т. п.
Решение:
Лучший способ добавить такую функциональность — реализовать логику в своём плагине, хотя можно добавить её и в PHP-файл темы. Для простоты в этом примере мы используем плагин. Сначала установите плагин devtools, чтобы создавать плагины в простом мастер-режиме:
Затем создайте свой плагин и заполните данные, которые мастер запросит.
bin/plugin devtools new-plugin
Enter Plugin Name: ACME Twig Filters
Enter Plugin Description: Plugin for custom Twig filters
Enter Developer Name: ACME, Inc.
Enter GitHub ID (can be blank):
Enter Developer Email: hello@acme.com
SUCCESS plugin ACME Twig Filters -> Created Successfully
Path: /Users/joe/grav/user/plugins/acme-twig-filters
По умолчанию этот каркас нового плагина добавляет на страницу немного тестового кода через событие onPageContentRaw(). Сначала замените эту функциональность кодом, который слушает событие onTwigInitialized():
Сначала зарегистрируем фильтр в методе onTwigInitialized():
Первый параметр метода регистрирует chunker как имя фильтра, а chunkString — как PHP-метод, где выполняется логика. Значит, дальше нужно создать этот метод:
Теперь можно попробовать в шаблонах Twig:
В результате получится:
или можно передать дополнительные параметры:
и тогда получится:
Наконец, если вы хотите, чтобы это было доступно не только как фильтр, но и как функция, просто зарегистрируйте функцию Twig с тем же именем в методе onTwigInitialized():
И тогда можно использовать синтаксис функции:
Расширение базового шаблона унаследованной темы¶
Проблема:
Иногда нужно расширить сам базовый шаблон. Это бывает, когда нет простого и очевидного способа расширить уже имеющиеся в шаблоне блоки. Возьмём Quark как пример родительской темы, и вы хотите расширить themes/quark/templates/partials/base.html.twig в своей теме myTheme.
Решение:
Вы можете добавить Quark как пространство имён Twig: в файле темы my-theme.php слушайте событие onTwigLoader и добавьте папку шаблонов темы Quark. Содержимое класса должно быть примерно таким:
Теперь в themes/my-theme/templates/partials/base.html.twig можно расширить базовый шаблон Quark так: