Работая над темами оформления для 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 функции - выбор каждого разработчика, основанный на личных предпочтениях и особенностях решаемой задачи.