By admin |

在接触drupal之初,就对drupal的hook机制有点迷糊,但是又想弄清楚.
今天总算明白了,其实很简单.
核心就是module_invoke_all
怎么理解呢
比如在模块module_a有一个函数module_a_test,模块module_b有一个函数module_b_test.当然,里面可以带参数.

在一个地方,执行

$str = module_invoke_all('test')

.
那么$str里面,就是两个模块里面,hook_test的返回值了.

下面,就可以foreach($str as $v)进行处理hook_test的返回值了.
就这最后一步一直犯迷糊.总算想通了.纪念一下.

PS: 突然之间,想明白了.所谓的hook,就是可以批量获得特定函数返回值的一个函数.

比如

$menus = module_invoke_all('menu');

,$menus就是s所有函数名以_menu结尾function的的返回值.当然,前提是这个module要激活.

下面,就可以写程序对$menus进行各种处理了.

下面顺便说说module_invoke.其实就是调用函数.
比如module_invoke('kk','ss',$str);
这个执行的结果,跟下面的函数一样.
kk_ss($str);

下面附上module_invoke函数原型

function module_invoke() {
  $args = func_get_args();
  $module = $args[0];
  $hook = $args[1];
  unset($args[0], $args[1]);
  $function = $module . '_' . $hook;
  if (module_hook($module, $hook)) {
    return call_user_func_array($function, $args);
  }
}