How to use hook_menu_alter () to control path access

/**
 * Implementation of hook_menu_alter().
 */
function joke_menu_alter(&$callbacks) {
  // If the user does not have 'administer nodes' permission,
  // disable the joke menu item by setting its access callback to FALSE.
  if (!user_access('administer nodes')) {
    $callbacks['node/add/joke']['access callback'] = FALSE;
    // Must unset access arguments or Drupal will use user_access()
    // as a default access callback.
    unset($callbacks['node/add/joke']['access arguments']);
  }
}

The above function applies to pro drupal. I can’t understand it well. Why should I disable access arguments (unset($callbacks['node/add/joke']['access arguments']);)?

Thank.

+3
source share
2 answers

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'])) {
  // Default callback.
  $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(), , , .

+19

?

- , ( TRUE/FALSE), - , . false .

, , , Drupal user_access() ( ).

+2

Source: https://habr.com/ru/post/1794860/


All Articles