12.2. Что такое hook в Drupal 8?

Главные вкладки

levmyshkin 7 августа 2019 в 18:17

Эта статья предназначена для ознакомления с друпалом, примеры кода мы будем писать дальше, после добавления нашего кастомного модуля.

Drupal 8 это не монолитная система, в которой все идеально и ничего не нужно менять. Очень часто клиенты просят добавить ту или иную фичу на сайт. Для того чтобы можно было обслуживать код ядра друпала и наших дополнительных хотелок, в друпале мы используем модули. Модульная система позволяет расширять возможности друпала. Но что если нам нужно расширить возможности уже готового контрибного модуля? Мы, конечно, можем отправить запрос на доработку нужного нам функционала, создав issue на drupal.org и возможно через месяц, два.. год, два мы получим нужный нам функционал в том или ином модуле. Но мы можем поступить по другому и написать нужный нам код сами. Для того чтобы расширять возможности дополнительных модулей друпала, а также самого друпала мы будем применять hook'и и plugin'ы в своих собственных модулях.

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

Для взаимосвязи модулей и ядра Друпала, а также модулей между собой, в Друпале есть система хуков. Хук это обратный вызов функции, то есть когда выполнение кода доходит до хука, то происходит добавление кода нашей функции, которую мы дописываем в своем модуле. Таким образом мы можем обработать данные пользователя, меню, таксономии, нод различных контент типов в каждый момент из изменения, добавления, удаления или просто загрузки и отображения. Хуков для 8го друпала довольно много, но уже меньше по сравнению с 7ым друпалом, очень многие хуки были реализованы через сторонние компоненты symfony:

https://api.drupal.org/api/drupal/core%21core.api.php/group/hooks/8.2.x

Если посмотрите 7ую версию, то просто устанешь листать страницу хуков вниз:

https://api.drupal.org/api/drupal/includes%21module.inc/group/hooks/7.x

Но это не значит что 8ой Drupal стал менее мощным, просто все то что реализуется в 7ом друпале хуком, в 8ом нужно добавить для этого соответствующий плагин.

Если вы внимательно посмотрите на список хуков в 8ом друпале, то увидет в их название _alter на конце, это означает что этот хук предназначен для изменения значений переменных, например:

hook_form_alter() - позволяет изменить массив формы в процессе ее обработки в друпале. Позже мы разберем как генерируются формы из массивов в друпале. Чтобы применить этот хук в модуле, как и остальные хуки, мы просто пишем функцию:

function mymodule_form_alter() {
  // меняем массив формы
}

Я упростил пример, не написал аргументы функции, namespaces, с этим мы еще разберемся, пока мы должны вникнуть как в общем случае работают хуки. Mymodule это наш модуль, мы пишем вместо слова hook название нашего модуля и функция автоматически подхватается и изменяет массивы формы. Как это работает? В методе prepareForm вызывается другой метод alter():

$this->moduleHandler->alter($hooks, $form, $form_state, $form_id);

Это значит, что каждый модуль в друпале реализующий hook_form_alter(), вставляет свой код в это место. Таким образом если мы добавим код в какое-то место в друпале, то первым делом мы должны это делать через hook, потом через plugin и если уже совсем невозможно не изменить контрибный модуль, то мы патчим/хакаем/изменяем модуль (к сожалению, приходится делать и так). Пока перед нами не стоит задач, которые требуют изменять контрибные модули, поэтому давайте научимся писать свои модули.

Атрибуция

Абраменко Иван

Автор