跳转到主要内容
rabphito 提交于 10 September 2015
原文链接https://www.drupal.org/node/2302845

Drupal 7 钩子概念

Drupal 的钩子系统允许模块与其他模块进行交互,还可以修改其他模块的数据 (甚至是Drupal 核心本身)。更多...

你可以通过使用钩子系统来创建(调用方法(回调))和实现。

通过阅读本页内容你会初步了解钩子的概念,并看到一些基本的例子。

创建Drupal 7钩子(回调)

通过使用以下方法(不包括全部)来完成钩子的创建和回调: drupal_alter(), module_invoke_all(), module_invoke()

实现Drupal 7 钩子

要实现Drupal 7 钩子,你需要去调用它。

如果模块文件名为 example.module,那么在该模块中通过定义example_help()来实现hook_help()。

Drupal 7 钩子类型:

在通常实践中,你想要创建的钩子有以下二种类型:

1. 修改钩子:

是一种通过获取引用钩子的变量来修改特定对象内容或变量的常用方式,如使用 drupal_alter()

2. 拦截钩子:

允许外部模块在执行过程中运行操作,但无法通过引用得到变量,如使用 module_invoke_all(),module_invoke()

例:

#1 (简单调用)

<?php // Calling all modules implementing 'hook_name': module_invoke_all('name'); ?>

#2(调用特定的钩子)

<?php // Calling a particular module's 'hook_name' implementation: module_invoke('module_name', 'name'); // @note: module_name comes without '.module' ?>

#3(获得数组结果)

<?php $result = array(); foreach (module_implements('hook_name') as $module) { // Calling all modules implementing hook_hook_name and // Returning results than pushing them into the $result array: $result[] = module_invoke($module, 'hook_name'); } ?>

#4(使用drupal_alter()修改数据)

<?php $data = array( 'key1' => 'value1', 'key2' => 'value2', ); // Calling all modules implementing hook_my_data_alter(): drupal_alter('my_data', $data); // You should implement hook_my_data_alter() in all other modules in which you want to alter $data ?>

#5(引用传递:不使用module_invoke()

<?php // @see user_module_invoke() foreach (module_implements('hook_name') as $module) { $function = $module . '_hook_name'; // will call all modules implementing hook_hook_name // and can pass each argument as reference determined // by the function declaration $function($arg1, $arg2); } ?>