Задать приоритет выполения хука (hook) в модуле

18.12.2017

Если в модуле используется хук и он должен обрабатывать данные, которые добавляются или меняются другим модулем с помощью такого же хука, то нужно как-то задать приоритет (очерёдность) выполнения хуков, чтобы ваш хук сработал после хука в других модулях. Нужно установить приоритет выполнения хуков.

Решение:
Приоритет хуков зависит от приоритета модуля, в котором он описан.
По умолчанию этот приоритет равен 0 и, если вы специально не указали другое, то будет использовано именно это значение. Чтобы это изменить есть, как всегда, несколько путей.

Обратите внимание: Вес может быть отрицательным. Отрицательный вес считается более тяжёлым и срабатывает раньше. Положительный срабатывает позже (и после того, как сработает вес по умолчанию - нулевой). Если задан одинаковый вес, то используется сортировка по алфавиту.

Перед установкой веса своего модуля стоит проверить какой вес установлен в том модуле, после которого должен сработать ваш хук.

Варианты

* Изменить вес модуля в базе данных
* Изменить приоритет (вес) модуля в файле .install модуля
* Использовать модуль для изменения веса модуля в общем списке модулей

Изменить вес модуля в базе данных

Вес модулей хранится в таблице system.
Нужно найти в этой таблице запись, которая соответствует вашему модулю (по имени или по пути) и изменить приоритет.
Можно использовать SQL-сниппет:
UPDATE system SET weight=5 WHERE name='[имя модуля]';
Обратите внимание: имя таблицы может иметь префикс.
Также в этом запросе нужно изменить вес и имя модуля.
Изменить приоритет (вес) модуля в файле .install модуля

В файле [имя модуля].install добавить в hook_install SQL-запрос, который поменяет вес модуля при установке.
<?php
/**
* Implementation of hook_install().
*/
function [имя модуля]_install() {
db_query("UPDATE {system} SET weight=5 WHERE name='[имя модуля]'");
}
После внесения изменений нужно переустановить модуль, чтобы изменения вступили в силу. Лучше всего установить модуль Devel и использовать его возможность быстрой переустановки модуля.
Использовать модуль для изменения веса модуля в общем списке модулей

Для Drupal 5 можно использовать: Module Weight
Для Drupal 6 и выше: Utility

Оба модуля позволяют менять вес модуля.
Вывод:

Самый оптимальный (простой в реализации и производительный) способ - использовать hook_install(). Также этот метод позволяет сохранить веса модулей при переустановке или повторном использовании модуля. Использовать дополнительные модули стоит, когда нужно вес многих модулей или выстраивать сложные "цепочки" вызовов. Но всё же после этого стоит "закрепить" результат в коде модуля.
Использованные материалы:

* form_alter ()