Можете ли вы создать свой собственный крюк в Drupal?

Возможно ли создать собственный крючок в модуле 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://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 } 

Например, предположим, что вы хотите создать 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 ().