Ранее я уже рассматривал особенности использования Twig функции evaluate в Grav CMS. Напомню, что важной особенностью является отсутcвие прямого доступа к объекту текущей страницы page
, поэтому для обращения к нему необходимо использовать контейнер grav
. В текущей версии Grav CMS работа Twig функции evaluate
осталась без изменений, но я предлагаю рассмотреть решение, позволяющее обойти описанное ограничение.
Если переданная строка кода может содержать прямое обращение к объекту page
, то для её выполнения вместо Twig функции evaluate
следует использовать метод Twig::processString
, передав ему в качестве второго параметра массив, содержащий элемент с ключом page
, содержащий объект текущей страницы.
Для наглядности предлагаю рассмотреть следующий пример выполнения строки кода, содержащей прямое обращение к объекту page
:
{% set twig_string = '<strong>{{ page.header.title }}</strong>, <small class="text-muted">опубликовано: {{ page.date|date("d.m.Y") }}</small>' %}
{{ grav.twig.processString(twig_string, {'page': page}) }}
Данный код аналогичен следующему, использующему Twig функцию evaluate
:
{% set twig_string = '<strong>{{ grav.page.header.title }}</strong>, <small class="text-muted">опубликовано: {{ grav.page.date|date("d.m.Y") }}</small>' %}
{{ evaluate(twig_string) }}
Благодаря использованию метода Twig::processString
возможно упростить передаваемые строки кода, а самое главное - достичь единообразия при написании кода, используемого непосредственно в Twig файлах, и кода, заданного в строках, подлежащих выполнению.
Следует ещё раз отметить, что данное решение подходит для использования с текущей версией Grav CMS 1.1.17. Возможно, что в следующих версиях Grav CMS работа Twig функции evaluate
будет изменена.