_menu_translate

6 menu.inc _menu_translate(&$router_item, $map, $to_arg = FALSE)
7 menu.inc _menu_translate(&$router_item, $map, $to_arg = FALSE)
8 menu.inc _menu_translate(&$router_item, $map, $to_arg = FALSE)

Handles dynamic path translation and menu access control.

When a user arrives on a page such as node/5, this function determines what "5" corresponds to, by inspecting the page's menu path definition, node/%node. This will call node_load(5) to load the corresponding node object.

It also works in reverse, to allow the display of tabs and menu items which contain these dynamic arguments, translating node/%node to node/5.

Translation of menu item titles and descriptions are done here to allow for storage of English strings in the database, and translation to the language required to generate the current page

Parameters

$router_item: A menu router item

$map: An array of path arguments (ex: array('node', '5'))

$to_arg: Execute $item['to_arg_functions'] or not. Use only if you want to render a path from the menu table, for example tabs.

Return value

Returns the map with objects loaded as defined in the $item['load_functions']. $item['access'] becomes TRUE if the item is accessible, FALSE otherwise. $item['href'] is set according to the map. If an error occurs during calling the load_functions (like trying to load a non existing node) then this function return FALSE.

Related topics

2 calls to _menu_translate()

File

includes/menu.inc, line 560
API for the Drupal menu system.

Code

function _menu_translate(&$router_item, $map, $to_arg = FALSE) {
  if ($to_arg) {
    // Fill in missing path elements, such as the current uid.
    _menu_link_map_translate($map, $router_item['to_arg_functions']);
  }
  // The $path_map saves the pieces of the path as strings, while elements in
  // $map may be replaced with loaded objects.
  $path_map = $map;
  if (!_menu_load_objects($router_item, $map)) {
    // An error occurred loading an object.
    $router_item['access'] = FALSE;
    return FALSE;
  }

  // Generate the link path for the page request or local tasks.
  $link_map = explode('/', $router_item['path']);
  for ($i = 0; $i < $router_item['number_parts']; $i++) {
    if ($link_map[$i] == '%') {
      $link_map[$i] = $path_map[$i];
    }
  }
  $router_item['href'] = implode('/', $link_map);
  $router_item['options'] = array();
  _menu_check_access($router_item, $map);

  // For performance, don't localize an item the user can't access.
  if ($router_item['access']) {
    _menu_item_localize($router_item, $map);
  }

  return $map;
}

Comments

Undefined index errors

If you have a menu item with a variable placeholder which is a child of another menu item with a variable placeholder, you will get PHP runtime errors when visiting the parent page.

For example, suppose your example.module contained the following code:

<?php
function example_menu() {
 
$items['user/%user/example/edit/%param'] = array(
   
'type' => MENU_LOCAL_TASK,
   
'title' => 'Edit example content',
  );
  return
$items;
}
?>

To render the tabs on a user profile page, the _menu_translate function would attempt to fill the %param placeholder above, which would fail because $path_map[4] is not defined.

Login or register to post comments