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

Теги Twig⚓︎

Grav также предоставляет множество пользовательских тегов Twig, которые расширяют уже очень способные возможности шаблона Twig с помощью некоторых новых тегов, которые мы нашли полезными.

markdown⚓︎

Тэг markdown предоставляет новый мощный способ для встраивания Markdown в шаблон Twig. Можно использовать переменную и выводить её с помощью фильтра |markdown, но синтаксис {% markdown %} делает создание блоков текста ещё более простым.

{% markdown %}
This is **bold** and this _underlined_

1. This is a bullet list
2. This is another item in that same list
{% endmarkdown %}

script⚓︎

Тег script - это действительно удобный тег, который делает ваш Twig более читабельным по сравнению с обычным подходом {% do assets...%}. Это чисто альтернативный способ написания вещей.

Файл JS⚓︎

{% script 'theme://js/something.js' in 'bottom' priority: 20 with { defer: true, async: true } %}

В Grav 1.7.28 также добавлена поддержка модулей:

{% script module 'theme://js/module.mjs' %}

Внутренний JS⚓︎

{% script in 'bottom' priority: 20 %}
    alert('Warning!');
{% endscript %}

style⚓︎

Файл CSS⚓︎

{% style 'theme://css/foo.css' priority: 20 %}

Внутренний CSS⚓︎

{% style priority: 20 with { media: 'screen' } %}
    a { color: red; }
{% endstyle %}
{% link icon 'theme://images/favicon.png' priority: 20 with { type: 'image/png' } %}
{% link modulepreload 'plugin://grav-plugin/build/js/vendor.js' %}

switch⚓︎

В большинстве языков программирования использование switch утверждений является обычным способом сделать кучу if else утверждений более чистыми и читабельными. Также они могут оказаться немного быстрее. Мы просто предоставляем простой способ их создания, так как они отсутствовали в базовой функциональности Twig.

{% switch type %}
  {% case 'foo' %}
     {{ my_data.foo }}
  {% case 'bar' %}
     {{ my_data.bar }}
  {% default %}
     {{ my_data.default }}
{% endswitch %}

deferred⚓︎

Большой новой особенностью Grav 1.6 является мощность отложенных блоков. С традиционными блоками, после того, как блок отрисован, им нельзя манипулировать. Возьмем пример {% block scripts %}, который может содержать некоторые записи для JavaScript включает в себя. Если у вас есть дочерний шаблон Twig, и вы расширяете базовый шаблон, где определяется этот блок, вы можете расширить блок, и добавить свои собственные записи JavaScript. Тем не менее, шаблоны частичных веток, которые включены в эту страницу, не могут достигать блока или взаимодействовать с ним.

Атрибут отложенного на блоке, который питается от расширения Deferred, означает, что вы можете определить этот блок в любом шаблоне Twig, но его отрисовка отложена, так что он отрисовывает после всего остального. Это означает, что вы можете добавить ссылки на JavaScript с помощью вызова {% do assets.addJs() %} из любой точки вашей страницы, и поскольку рендеринг отложен, вывод будет содержать все активы, о которых Grav знает, независимо от того, когда вы их добавили.

{% block myblock deferred %}
    This will be rendered after everything else.
{% endblock %}

Также можно объединить содержимое родительского блока с отложенным блоком с помощью {{ parent() }}. Это может быть особенно полезно для тем, если добавлены дополнительные файлы CSS или JavaScript.

{% block stylesheets %}
    <!-- Additional css library -->
    {% do assets.addCss('theme://libraries/leaflet/dist/leaflet.css') %}
    {{ parent() }}
{% endblock %}

throw⚓︎

Есть определённые ситуации, когда нужно вручную бросить исключение, поэтому у нас тоже есть тэг для этого.

{% throw 404 'Not Found' %}

try & catch⚓︎

Также полезно иметь более мощную обработку ошибок в PHP-стиле в ваших Twig-шаблонах, так что у нас есть новый тег try/catch.

{% try %}
   <li>{{ user.get('name') }}</li>
{% catch %}
   User Error: {{ e.message }}
{% endcatch %}

render⚓︎

Гибкие объекты медленно проникают во все новые и новые элементы Grav. Это самонаблюдающие объекты, которые имеют соответствующую структуру шаблонов Twig, так что они знают, как рендерить себя. Для того, чтобы использовать их, мы реализовали новый тег render, который принимает опциональный макет, который в свою очередь управляет тем, с каким из макетов шаблонов должен быть визуализирован объект.

{% render collection layout: 'list' %}
{% render object layout: 'default' with { variable: 'value' } %}

cache⚓︎

Иногда вам может понадобиться кэшировать части страницы, которые требуют много времени для рендеринга. Это можно сделать с помощью тега cache.

{% cache 600 %}
  {{ some_complex_work() }}
{% endcache %}

В примере 600 - это необязательное время жизни в секундах. Если параметр не передан, будет использоваться время жизни кэша по умолчанию.