Возможно ли создать собственный крючок в модуле Drupal для использования других модулей Drupal? Если нет, существует ли в Drupal механизм для сторонних разработчиков для обеспечения перехвата? Если все еще не было, где в основном список перехваченных крючков?
Как я понимаю, модули Drupal работают над таким событием, как система с именем hooks . Когда вы создаете новый модуль, вы создаете функции, реализующие крючок. Например, есть крючок hook_delete
. Если вы реализуете функцию в своем модуле
function mymodule_delete($node) { }
эта функция будет вызываться всякий раз, когда удаляется узел.
Я хочу знать, есть ли способ или я, как разработчик стороннего модуля, создавать собственные крючки. Скажем, что-то вроде hook_alanskickbutthook
чтобы другие разработчики модулей могли подписаться на этот крючок.
Если это возможно, как вы это делаете? Я просмотрел официальные документы и не нашел много там, и у меня все еще немного головокружение, когда я начинаю копаться в исходном коде Drupal (я понимаю рекурсию, но не трачу достаточно времени на размышления о рекурсивных проблемах). Полные решения приветствуются, но я счастлив, что вас просто направляют в правильном направлении.
Module_invoke_all () – ваш билет на создание собственных крючков:
см. API:
http://api.drupal.org/api/drupal/includes–module.inc/function/module_invoke_all
а затем посмотрите на эту замечательную запись:
(отредактировано: было на http://himerus.com/blog/himerus/creating-hooks-your-drupal-modules, но это уже не так)
После того, как вы сделали свой крючок, его можно вызвать в другом модуле, используя:
/** * Implementation of hook_myhookname() */ function THISMODULENAME_myhookname(args){ //do stuff }
Например, предположим, что вы хотите создать 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
Если я помню … http://api.drupal.org/api/drupal/modules–node–node.api.php/function/hook_delete/7
Помогает? прошло некоторое время, так как я возился с Drupal.
Чтобы создать / предложить пользовательский крючок Drupal, вы должны реализовать так, чтобы вызов hook с модулем_invoke или module_invoke_all не приводил к конфликтам с другими перехватами модуля. Имя крючка должно быть уникальным, и оно должно предлагать все / специфические функции таким образом, чтобы он не требовал каких-либо корректировок с кодом. Вся конфигурация должна идти на страницах администратора и должна хранить эти конфигурации в отдельной таблице или любые существующие таблицы, созданные Drupal или модули, от которых зависят ваши модули. Крючок должен быть легко внедрен другими модулями, и его реализация не должна быть сложной. Когда вы создаете пользовательские перехватчики, ваш модуль (ы) действует как поставщик API.
Для Drupal 6 & 7, drupal_alter () , вероятно, лучший вариант.
Как указано в документации module_invoke_all ()
Все аргументы передаются по значению. Используйте drupal_alter (), если вам нужно передать аргументы по ссылке.
В Drupal 8 используйте ModuleHandler :: alter .
Пропускает переменные переменные к определенным реализациям hook_TYPE_alter ().