Подтвердить что ты не робот

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

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

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

function mymodule_delete($node)
{
}

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

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

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

4b9b3361

Ответ 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() реализации.