Выполнение строки кода, содержащего прямое обращение к объекту текущей страницы, в Grav CMS

 

Grav CMSTwigразработка

Ранее я уже рассматривал особенности использования 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 будет изменена.