Что связывает Drupal Hook с конкретным модулем? - PullRequest
4 голосов
/ 15 февраля 2011

Что связывает Drupal Hook с конкретным модулем?

В Drupal 7 каждый основной модуль имеет файл "api"

$ ls modules/*/*.api.php
modules/aggregator/aggregator.api.php   modules/openid/openid.api.php
modules/block/block.api.php             modules/overlay/overlay.api.php
modules/comment/comment.api.php         modules/path/path.api.php
modules/contextual/contextual.api.php   modules/rdf/rdf.api.php
modules/dashboard/dashboard.api.php     modules/search/search.api.php
modules/field/field.api.php             modules/shortcut/shortcut.api.php
modules/field_ui/field_ui.api.php       modules/simpletest/simpletest.api.php
modules/file/file.api.php               modules/system/system.api.php
modules/filter/filter.api.php           modules/system/theme.api.php
modules/help/help.api.php               modules/taxonomy/taxonomy.api.php
modules/image/image.api.php             modules/trigger/trigger.api.php
modules/locale/locale.api.php           modules/update/update.api.php
modules/menu/menu.api.php               modules/user/user.api.php
modules/node/node.api.php

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

File: modules/path/path.api.php
function hook_path_delete($path) {
  db_delete('mytable')
    ->condition('pid', $path['pid'])
    ->execute();
}

Мой вопрос: что связывает определенный хук с конкретным модулем?Почему хук path_delete включен в файл path.api.php?Почему хук entity_view включен в файл system.api.php?Это просто произвольно, после организации фактов, или в системе Drupal есть что-то, что связывает определенный хук с конкретным модулем?Или что-то еще?

Ответы [ 2 ]

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

Хуки вызываются с помощью module_invoke() и module_invoke_all(): если вы посмотрите на код для этих двух функций, вы сможете собрать воедино, как это работает, нов основном, если я добавлю это к коду моего модуля:

// Other code

$foo = module_invoke_all('foo_bar', $var1, $var2);

// More code

Drupal будет вызывать каждую реализацию hook_foo_bar($var1, $var2), найденную во включенных модулях.Исходя из этого, вы должны увидеть, что единственное, что связывает определенный хук с конкретным модулем, это соглашение об именах: если я вызываю мой модуль foo, мои функции перехвата должны начинаться с hook_foo_.

.в том, что *.api.php вызывается правильно, поскольку вызов модуля является просто вызовом функции, авторы модуля включают foo.api.php просто для целей документирования, чтобы сообщить разработчикам, как реализовать ловушку.

Например, вв приведенном выше случае foo.api.php будет включать в себя пример функции, такой как:

/**
 * Doxygen comments documenting the function goes here
 */
function hook_foo_bar($var1, $var2) {
  return $var1 + $var2;
}

Но в качестве разработчика модуля я мог бы реализовать hook_foo_bar() другим способом:

function mymodule_foo_bar($var1, $var2) {
  return $var1 - $var2;
}

Икогда вызывается module_invoke_all(), Drupal создаст функцию, используя короткое имя реализующего модуля (mymodule) и имя ловушки, переданное в module_invoke_all() (foo_bar), вызывая функцию mymodule_foo_bar(), которую я только что определил.

Модуль system в ядре немного универсален: одна задача для Drupal 8 состоит в том, чтобы убить его и делегировать его функциональность другим модулям.

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


Может быть, вы можете попробовать научиться ловле на друпал? это просто:
http://api.drupal.org/api/drupal/includes--module.inc/group/hooks/7

О hook_path_delete:
Посмотри path.module, где-то увидишь вызовы path_delete (...).
Например, в path_node_update () - эта функция вызывается, затем вы меняете текущий путь - она ​​удаляет старый путь раньше, чем создает новый путь для узла.
Теперь посмотрите, где определена функция path_delete () - она ​​находится в файле path.inc:
В этой функции вы увидите: module_invoke_all ('path_delete', $ path); - что делает эта функция?
Он перечисляет все модули (в drupal 7 он кешируется), где определен hook_path_delete (как я покажу ранее, для пользовательского модуля yiu он определен как YOURMODULENAME_path_delete, и он также будет включен здесь), и запускает все эти функции одну за другой (порядок выполнения определяется весом и именем файла модулей).
Итак, что вы можете сделать в пользовательском модуле? Вы можете ответить на эту реакцию удаления и выполнить некоторые другие действия - например, удалить другой путь, который можно использовать для дублирования пути этого узла (это только пример).

p.s. Хорошая точка для запуска пользовательских модулей: http://drupal.org/contributors-guide

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