Можете ли вы создать свой собственный крюк в Drupal?
Можно ли создать собственный крючок в модуле Drupal для других модулей Drupal? Если нет, существует ли в Drupal механизм для сторонних разработчиков для обеспечения перехвата? Если все было до сих пор, где в основном список перехваченных перехватов?
Как я понимаю, модули Drupal работают над событием, подобным системе hooks. Когда вы создаете новый модуль, вы создаете функции, реализующие крючок. Например, есть hook_delete
hook. Если вы реализуете функцию в своем модуле
function mymodule_delete($node)
{
}
эта функция будет вызываться всякий раз, когда удаляется node.
Я хочу знать, есть ли способ или я, как разработчик стороннего модуля, создавать мои собственные. Скажем, что-то вроде hook_alanskickbutthook
, чтобы другие разработчики модулей могли подписаться на этот крючок.
Если это возможно, как вы это делаете? Я просмотрел официальные документы и не нашел много там, и у меня все еще немного головокружение, когда я начинаю копаться в исходном коде Drupal (я понимаю рекурсию, но не трачу достаточно времени на размышления о рекурсивных проблемах). Полные решения приветствуются, но я счастлив, что просто указал в правильном направлении.
Ответы
Ответ 1
Module_invoke_all() - ваш билет на создание собственных крючков:
см. API:
http://api.drupal.org/api/drupal/includes--module.inc/function/module_invoke_all
а затем посмотрите на эту замечательную запись:
http://web.archive.org/web/20101227170201/http://himerus.com/blog/himerus/creating-hooks-your-drupal-modules
(отредактировано: было http://himerus.com/blog/himerus/creating-hooks-your-drupal-modules, но это уже не так)
Как только вы сделали свой крючок, его можно вызвать в другом модуле, используя:
/**
* Implementation of hook_myhookname()
*/
function THISMODULENAME_myhookname(args){
//do stuff
}
Ответ 2
Например, предположим, что вы хотите создать hook_my_custom_goodness() для других пользователей. Затем просто поместите код, подобный этому, в ваш модуль в точке, где вы хотите, чтобы этот крюк произошел:
$variables['msg'] = 'foo';
// Make sure at least one module implements our hook.
if (sizeof(module_implements('my_custom_goodness')) > 0) {
// Call modules that implement the hook, and let them change $variables.
$variables = module_invoke_all('my_custom_goodness', $variables);
}
drupal_set_message($variables['msg']); // Will display 'bar' instead.
Теперь, если кто-то хотел использовать ваш крючок, тогда они могли сделать это в своем собственном модуле следующим образом:
/**
* Implements hook_my_custom_goodness().
*/
function SOME_OTHER_MODULE_my_custom_goodness($variables) {
$variables['msg'] = 'bar';
return $variables;
}
Здесь есть более полное объяснение:
http://tylerfrankenstein.com/code/drupal-create-custom-hook-for-other-modules
Ответ 3
Если я помню... http://api.drupal.org/api/drupal/modules--node--node.api.php/function/hook_delete/7
помогает? было некоторое время, так как я возился с Drupal.
Чтобы создать/предложить пользовательский крючок Drupal, вы должны реализовать таким образом, чтобы вызов hook с модулем_invoke или module_invoke_all не конфликтует с другими перехватами модуля. Имя крючка должно быть уникальным, и оно должно предлагать все/специфические функции таким образом, чтобы он не требовал каких-либо корректировок с кодом. Вся конфигурация должна идти на страницах администратора и должна хранить эти конфигурации в отдельной таблице или любые существующие таблицы, созданные Drupal или модули, от которых зависят ваши модули. Крючок должен быть легко внедрен другими модулями, и его реализация не должна быть сложной. Когда вы создаете пользовательские перехватчики, ваш модуль действует как поставщик API.
Ответ 4
Для Drupal 6 и 7, drupal_alter(), вероятно, лучший вариант.
Как указано в документации module_invoke_all(),
Все аргументы передаются по значению. Используйте drupal_alter(), если вам нужно передать аргументы по ссылке.
В Drupal 8 используйте ModuleHandler:: alter.
Передает переменные переменные конкретному hook_TYPE_alter() реализации.