Генерация кастомизированых наименований для шаблонов Twig-a с помощью hook_theme_suggestions _HOOK_alter. Дмитрий Селенцов

В рамках внутренних образовательных вечеров DEWEB Studio, сегодня выступал Дмитрий Селенцов. Заметки по докладу найдете ниже.

​**********​**********​**********

Для того, чтобы манипулировать именами темплейтов Twiga мы можем использовать один из трех хуков:

hook_theme_suggestions_alter

hook_theme_suggestions_HOOK_alter

hook_theme_suggestions_HOOK

 

Для начала рассмотрим последовательность вызовов hookов.

 

Сначала каждый hook отрабатывает для модулей, согласно системному весу, затем в алфавитном порядке.

 

Далее, цикл повторяется, но уже для всех базовых тем ( сохраняя иерархию наследования ).

 

В последнюю очередь hookи отрабатывают в кастомной теме.

 

Внутри каждого модуля или темы сначала отрабатывает hook_theme_suggestions_alter, затем hook_theme_suggestions_HOOK_alter

 

hook_theme_suggestions_HOOK_alter является, что называется "более специфичным хуком" , он позволяет альтерить конкретные элементы - ноды, пейдж, блок и т.д.

 

hook_theme_suggestions_alter - соответственно, "базовый" hook, который будет отрабатывать для каждого элемента в отдельности. В общем и целом иерархическая цепочка вызова hookов построена таким образом, что чем более специфичным является hook - тем позже он будет вызван системой.

 

Из вышеизложенного мы можем сделать вывод, что для разящего большинства задач связанных с изменением имен темплейтов нам нужен hook_theme_suggestions_HOOK_alter

 

То есть возвращаясь к проблеме для того чтобы манипулировать именами темплейтов Twiga мы используем hook_theme_suggestions_HOOK_alter:

 

function hook_theme_suggestions_HOOK_alter(array &$suggestions, array $variables)

 

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

 

Аргументы. Как видим, функция принимает два аргумента - массив существующих suggestions (передается по ссылке), и массив variables, в котором содержатся переменные попадающие в шаблон.

 

Далее все просто - мы размещаем нашу кастомную логику, с помощью которой формируем suggestions, в теле функции и записываем результат в массив $suggestions. Несколько примеров:

 

/**

* Implements hook_theme_suggestions_HOOK_alter

*/

function my_module_theme_suggestions_block_alter(array &$suggestions, array $variables) {

// get view_id from current route object

$view_id = \Drupal::routeMatch()->getRouteObject()->getDefault('view_id');

if (!empty($view_id)) {

  $suggestions[] = 'my_module' . '__' . $view_id;

}

 

// Add an interface-language specific suggestion for current theme hook.

$suggestions[] = 'my_module' . '__' . 'block' . '__' . \Drupal::languageManager()->getCurrentLanguage()->getId();

// add suggestion for auth. users

if (\Drupal::currentUser()->isAuthenticated()) {

  $suggestions[] = 'my_module' . '__' . 'block' . '__' . 'logged';

}

}

 

​**********​**********​*********

Надеемся, вам была полезна наша статья. Мы всегда рады Вашему фидбеку!
Social activity
21.02.2017