Вызов методов класса темы оформления в шаблоне Twig в Grav CMS

 

 Grav CMSPHPTwig

Работая над темами оформления для Grav CMS, у меня периодически возникает необходимость реализации логики, описание которой на языке шаблонизатора Twig не удобно, либо требует функций, недоступных в шаблонизаторе. Первое, что приходит в голову в таком случае – написание и использование собственных Twig функций. Однако есть способ проще.

Работая с Grav CMS, необязательно каждый раз писать новые Twig функции, тем более, если они необходимы только для конкретной темы оформления и предназначены для выполнения узкоспециализированной задачи. В этих случаях можно использовать публичные методы класса темы оформления, вызывая их в шаблонах Twig.

В качестве примера предлагаю рассмотреть класс темы оформления MyTheme, реализующий требуемые методы, а также их последующее использование в шаблонах оформления. Чтобы не усложнять пример, методы класса выполняют простые действия над переданными параметрами, что имеет смысл только для демонстрации рассматриваемой возможности.

<?php
namespace Grav\Theme;

use Grav\Common\Theme;

class MyTheme extends Theme
{

    public static function getSubscribedEvents()
    {
        return [
            'onThemeInitialized' => ['onThemeInitialized', 0]
        ];
    }

    public function onThemeInitialized()
    {
        if ($this->isAdmin()) {
            $this->active = false;
            return;
        }

        $this->enable([
            'onTwigSiteVariables' => ['onTwigSiteVariables', 0]
        ]);
    }

    public function onTwigSiteVariables()
    {
        $this->grav['assets']
            ->addCss('plugin://css/mytheme-core.css')
            ->addCss('plugin://css/mytheme-custom.css');

        $this->grav['assets']
            ->add('jquery', 101)
            ->addJs('theme://js/jquery.myscript.min.js');
    }

    public static function average()
    {
        $average = 0;
        $func_num_args = func_num_args();

        if ($func_num_args > 0) {
            $average = array_sum(func_get_args()) / $func_num_args;
        }

        return $average;
    }

    public static function arrayReverse($array)
    {
        if (is_array($array)) {
            return array_reverse($array);
        }

        return $array;
    }
}

Методы MyTheme::average(), возвращающий среднее арифметическое значений переданных параметров, и метод MyTheme::arrayReverse($array), возвращающий переданный массив с элементами в обратном порядке, могут быть вызваны и использованы в шаблоне оформления Twig следующим образом:

Среднее значение: {{ grav.theme.average(1, 3, 4, 4) }}

{% set array_original = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] %}
{% set array_reversed = grav.theme.arrayReverse(array_original) %}
{{ dump([array_original, array_reversed]) }}

Таким образом может быть вызван любой метод класса темы оформления, объявленный публичным. Аналогичный подход может быть применён и в случае разработки собственных плагинов. Однако использовать рассмотренную возможность или писать собственные Twig функции - выбор каждого разработчика, основанный на личных предпочтениях и особенностях решаемой задачи.