Генерація кастомізованих найменувань для шаблонів 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