Какие функции Core Drupal можно использовать для вызова хуков? - PullRequest
2 голосов
/ 14 февраля 2011

Это продолжение к другому вопросу, который я задал о создании ваших собственных хуков.

В ответе и комментариях были упомянуты две функции

module_invoke_all(...)
drupal_alter(...)

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

Функция drupal_alter, кажется, вызывает ловушку для любого модуля, который ее реализует , и передает постоянную структуру данных между всеми функциями ловушки.

Копая код, я также нашел

module_invoke(...)

, который позволяет вам вызывать определенный хук в определенном модуле.

Итак, мой вопрос - это действительно два вопроса.Во-первых, правильно ли я понимаю вышеперечисленные пункты.Во-вторых, есть ли другие основные функции Drupal, которые можно использовать для вызова хуков, реализованных в модуле?

Моя конечная цель - лучшее понимание того, как части архитектуры Drupal объединяются в Drupal,приложение, как большинство людей используют его.Я начинаю с попытки понять систему модулей в отдельности.Любые поправки к вопиющим заблуждениям приветствуются

1 Ответ

4 голосов
/ 15 февраля 2011

Первый вопрос: Да.

Второй вопрос: Помимо использования этих функций, вы также можете вызвать module_implements () напрямую и вызвать их вручную. Пример использования - это когда вы хотите передать аргументы по ссылке, но не хотите использовать схему именования hook_something_alter (), в которую вас заставляет drupal_alter ().

module_implements () возвращает массив модулей, которые реализовали данный хук. В Drupal 6 это просто цикл по всем модулям, а затем проверка функции $ module. '_'. $ hook существует.

В Drupal 7, например, можно определить, что ваш hook_yourmodule_something может находиться в anothermodule.yourmodule.inc, и Drupal будет автоматически искать этот файл и включать его при необходимости. См. hook_hook_info . Кроме того, также можно изменить список модулей, которые реализуют ловушку, что является довольно сумасшедшим и должно использоваться с осторожностью. См. hook_module_implements_alter .

Поскольку эти функции делают обнаружение немного медленнее, чем в D6, к этому был добавлен кэш. Это в основном означает, что всякий раз, когда вы добавляете реализацию ловушки в D7, вам необходимо очистить кеш.

Пример ручной реализации:

<?php
// Custom hooks should always be prefixed with your module name to avoid naming conflicts.
$hook_name = 'yourmodule_something';
// Get a list of all modules implementing the hook.
foreach (module_implements($hook_name) as $module) {
  // Build the actual function name.
  $function = $module . '_' . $hook_name;
  // Call the function. Anything passed in to the function can be by-reference if the
  // hook_implementation defines it so. If you don't want that, you might want to give them
  // only a copy of the data to prevent abuse.
  $function($arg1, $arg2, $arg3, $arg4);
}
?>

Если вы посмотрите на код функций, которые вы связали в своем вопросе, вы увидите, что они в основном просто вспомогательные функции для той же процедуры, так что это также должно помочь улучшить общее понимание вызова ловушек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...