Я разрабатываю модуль, но добавляемые мной хуки не вызываются из Drupal. Это происходит с более чем одним крючком.
Я прочитал документацию по хукам и не могу найти ничего, что объясняло бы, почему это происходит. Я подтвердил, что использую правильные параметры и возвращаю правильное значение.
Что я делаю неправильно? Есть что-то, что я пропускаю?
Ответы:
При разработке модуля вы должны учитывать следующие замечания.
Реализация ловушки, выполняемой из модуля, представляет собой функцию, имя которой начинается с короткого имени модуля (также называемого именем машины ); от имени крюка, снимите часть крюка и замените его именем машины модуля. Например, реализация
hook_menu()
делается из example.moduleexample_menu()
. Если модуль - example_menu.module, а функция -example_menu()
то, это не считаетсяhook_menu()
реализацией для example_menu.module.Это также означает, например, что
hook_form_alter()
реализация в example_form.module нетexample_form_alter()
, ноexample_form_form_alter()
. В качестве другого примера, реализацияhook_form_FORM_ID_alter()
done для изменения формы, возвращаемойuser_register_form()
из example.moduleexample_form_user_register_alter()
, ноexample_form_user_register_form_alter()
, (Идентификатор формы - user_register_form .)Вообще говоря, использование заглавных символов в имени компьютера модуля не создает проблем: PHP не делает различий между
myModule_get_value()
иmymodule_get_value()
, и$value = myModule_get_value()
будет вызывать либоmyModule_get_value()
, либоmymodule_get_value()
.Хотя есть случай, когда использование символов верхнего регистра в имени компьютера модуля может вызвать проблемы: при определении хуков обновления для модуля.
drupal_get_schema_versions()
, функция, которая возвращает список доступных обновлений, содержит следующий код.Последняя строка, выполненная из,
drupal_get_schema_versions()
является следующей.Если имя модуля - myModule.module,
drupal_get_schema_versions('myModule')
он вернет только те функции, имя которых начинается с myModule_update и заканчивается числом; функции likemymodule_update_7120()
не будут включены, потому что используемое регулярное выражение сdrupal_get_schema_versions()
учетом регистра. Это все еще относится к Drupal 8, так как регулярное выражение все равно используется в Drupal 7.Некоторые крючки вызываются в определенные моменты. Например,
hook_menu()
иhook_menu_alter()
вызываются из Drupal 7 после того, как модуль был включен / отключен, или когда очищен кэш для информации маршрутизатора;hook_init()
не вызывается для кэшированных страниц.Как только перехваты вызваны, потому что произошло определенное событие, они не будут вызываться снова, пока подобное событие не произойдет. Они не вызываются в двух последовательных запросах страницы.
Drupal кэширует список хуков, реализованных из модуля. Если вы редактируете код активированного модуля для добавления новых хуков, сначала нужно отключить и снова включить модуль, иначе Drupal не заметит, что появились новые хуки.
Убедитесь, что
return
оператор не проник в одну из ваших функций ловушки во время рефакторинга. Он может сломать не только тот крючок, в котором он появляется, но и вызвать цепную реакцию, которая сломает и другие крючки, затрудняя поиск проблемы.источник