Можете ли вы создать свой собственный крюк в Drupal? - PullRequest
33 голосов
/ 14 февраля 2011

Можно ли создать свой собственный хук в модуле Drupal для использования другими модулями Drupal?Если нет, то есть ли в Drupal механизм для сторонних разработчиков, обеспечивающий хуки?Если до сих пор все было не так, то где в основном реализован список хуков?

Как я понимаю, модули Drupal работают с таким событием, как система, называемая hooks .Когда вы создаете новый модуль, вы создаете функции, которые реализуют хук.Например, есть hook_delete крючок.Если вы реализуете функцию в своем модуле

function mymodule_delete($node)
{
}

, эта функция будет вызываться всякий раз, когда удаляется узел.

Я хочу знать, есть ли способ или я, каксторонний разработчик модулей, для создания моих собственных хуков.Скажем, что-то вроде hook_alanskickbutthook, чтобы другие разработчики модулей могли подписаться на этот хук.

Если это возможно, как вы это сделаете?Я просмотрел официальные документы и не нашел там много, и у меня все еще кружится голова, когда я начинаю ковыряться в исходном коде Drupal (я понимаю рекурсию, но не трачу достаточно времени на размышления о рекурсивных проблемах).Полные решения приветствуются, но я рад, что меня укажут в правильном направлении.

Ответы [ 4 ]

37 голосов
/ 14 февраля 2011

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
}
6 голосов
/ 02 апреля 2013

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

0 голосов
/ 04 мая 2016

Для Drupal 6 и 7, drupal_alter () , вероятно, лучший вариант.

Как указано в документации module_invoke_all () ,

Все аргументы передаются по значению.Используйте drupal_alter (), если вам нужно передать аргументы по ссылке.

В Drupal 8 используйте ModuleHandler :: alter .

Передача изменяемых переменныхк конкретным реализациям hook_TYPE_alter ().

0 голосов
/ 14 февраля 2011

Если я вспомню ... http://api.drupal.org/api/drupal/modules--node--node.api.php/function/hook_delete/7

это поможет?Прошло много времени с тех пор, как я связался с Drupal.

Чтобы создать / предложить пользовательский хук Drupal, вы должны реализовать его таким образом, чтобы вызов хука с module_invoke или module_invoke_all не создавал конфликтов с другими хуками модулей.Имя хука должно быть уникальным, и оно должно предлагать все / специфические функции таким общим образом, чтобы не требовалось никаких корректировок кода.Вся конфигурация должна идти на страницах администратора и должна хранить эти конфигурации в отдельной таблице или любых существующих таблицах, созданных Drupal или модулями, от которых зависят ваши модули.Крюк должен быть легко реализован другими модулями и не должен быть слишком сложным для реализации.При создании пользовательских хуков ваши модули выступают в качестве поставщика API.

...