it-swarm-ru.tech

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

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

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

function mymodule_delete($node)
{
}

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

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

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

33
Alan Storm

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
}
37
jpstrikesback

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

6
tyler.frankenstein

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

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

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

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

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

0
colan

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

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

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

0
Brian