function module_invoke

You are here

7 module.inc module_invoke($module, $hook)
4.6 module.inc module_invoke()
4.7 module.inc module_invoke()
5 module.inc module_invoke()
6 module.inc module_invoke()
8 bootstrap.inc module_invoke($module, $hook)

Invoke a hook in a particular module.

Parameters

$module: The name of the module (without the .module extension).

$hook: The name of the hook to invoke.

...: Arguments to pass to the hook implementation.

Return value

The return value of the hook implementation.

Related topics

53 calls to module_invoke()
block_admin_configure in modules/block/block.admin.inc
Menu callback; displays the block configuration form.
block_admin_configure_submit in modules/block/block.admin.inc
block_list in modules/block/block.module
Return all blocks in the specified region for the current user.
block_user in modules/block/block.module
Implementation of hook_user().
blogapi_metaweblog_get_category_list in modules/blogapi/blogapi.module
Blogging API callback. Returns a list of the taxonomy terms that can be associated with a blog node.

... See full list

1 string reference to 'module_invoke'
search_menu in modules/search/search.module
Implementation of hook_menu().

File

includes/module.inc, line 469
API for loading and interacting with Drupal modules.

Code

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);
  }
}

Comments

It is useful to realize that the args passed to invoked functions are not passed by reference with calls to module_invoke() (or to module_invoke_all(), for that matter).

PHP 5.3 (5.2?), changed the way that call_user_func_array() treats args passed by reference.

Here's how I've modified module_invoke() to deal with this:

<?php
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)) {
    if (
strnatcmp(phpversion(),'5.2') <= 0)
      return
call_user_func_array($function, $args);
    else {
     
$ref_args = array();
      foreach (
$args as $key => &$arg) {
       
$ref_args[$key] = &$arg;
      }
      return
call_user_func_array($function, $ref_args);
    }
  }
}
?>

The function module_invoke_all() needs a similar change.

[Follow-up:] This is not actually a good fix. See http://drupal.org/node/353494