This whole example seems broken and bad. In short, a joke. First, let me answer your question, and then I will explain why you should not follow this example in practice.
From include / menu.inc:
if (!isset($item['access callback']) && isset($item['access arguments'])) {
$item['access callback'] = 'user_access';
}
Canceling access callbacks when you no longer need them (relying on a logical value now, after all) prevents step-by-step logic in Drupal's routing system user_access(), so it needs to do something.
Now about why this bad code.
hook_menu() hook_menu_alter() ( , ). , , , . .
, , . , , , , .
:
/**
* Implementation of hook_menu_alter().
*/
function joke_menu_alter(&$items) {
$items['node/add/joke']['access callback'] = 'user_access';
$items['node/add/joke']['access arguments'] = array('administer nodes');
}
, node/add/joke , , , - , administer nodes. , , , , , administer nodes.
, . Spaces:
/**
* Implementation of hook_menu_alter().
*/
function joke_menu_alter(&$items) {
$path = 'node/add/joke';
$items[$path]['access arguments'][] = $items[$path]['access callback'];
$items[$path]['access callback'] = 'joke_menu_access';
}
function joke_menu_access() {
$args = func_get_args();
$access_callback = array_pop($args);
$original_access = call_user_func_array($access_callback, $args);
return $original_access && user_access('administer nodes');
}
, , .
, $path, . $original_access , user_access(), , , .