Same name and namespace in other branches
  1. 7.x includes/menu.inc \menu_set_active_trail()

Sets or gets the active trail (path to root menu root) of the current page.

Parameters

$new_trail: Menu trail to set, or NULL to use previously-set or calculated trail. If supplying a trail, use the same format as the return value (see below).

Return value

Path to menu root of the current page, as an array of menu link items, starting with the site's home page. Each link item is an associative array with the following components:

  • title: Title of the item.
  • href: Drupal path of the item.
  • localized_options: Options for passing into the l() function.
  • type: A menu type constant, such as MENU_DEFAULT_LOCAL_TASK, or 0 to indicate it's not really in the menu (used for the home page item).

If $new_trail is supplied, the value is saved in a static variable and returned. If $new_trail is not supplied, and there is a saved value from a previous call, the saved value is returned. If $new_trail is not supplied and there is no saved value, the path to the current page is calculated, saved as the static value, and returned.

Related topics

1 call to menu_set_active_trail()
menu_get_active_trail in includes/menu.inc
Gets the active trail (path to root menu root) of the current page.

File

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

Code

function menu_set_active_trail($new_trail = NULL) {
  static $trail;
  if (isset($new_trail)) {
    $trail = $new_trail;
  }
  elseif (!isset($trail)) {
    $trail = array();
    $trail[] = array(
      'title' => t('Home'),
      'href' => '<front>',
      'localized_options' => array(),
      'type' => 0,
    );
    $item = menu_get_item();

    // Check whether the current item is a local task (displayed as a tab).
    if ($item['tab_parent']) {

      // The title of a local task is used for the tab, never the page title.
      // Thus, replace it with the item corresponding to the root path to get
      // the relevant href and title.  For example, the menu item corresponding
      // to 'admin' is used when on the 'By module' tab at 'admin/by-module'.
      $parts = explode('/', $item['tab_root']);
      $args = arg();

      // Replace wildcards in the root path using the current path.
      foreach ($parts as $index => $part) {
        if ($part == '%') {
          $parts[$index] = $args[$index];
        }
      }

      // Retrieve the menu item using the root path after wildcard replacement.
      $root_item = menu_get_item(implode('/', $parts));
      if ($root_item && $root_item['access']) {
        $item = $root_item;
      }
    }
    $tree = menu_tree_page_data(menu_get_active_menu_name());
    list($key, $curr) = each($tree);
    while ($curr) {

      // Terminate the loop when we find the current path in the active trail.
      if ($curr['link']['href'] == $item['href']) {
        $trail[] = $curr['link'];
        $curr = FALSE;
      }
      else {

        // Add the link if it's in the active trail, then move to the link below.
        if ($curr['link']['in_active_trail']) {
          $trail[] = $curr['link'];
          $tree = $curr['below'] ? $curr['below'] : array();
        }
        list($key, $curr) = each($tree);
      }
    }

    // Make sure the current page is in the trail (needed for the page title),
    // but exclude tabs and the front page.
    $last = count($trail) - 1;
    if ($trail[$last]['href'] != $item['href'] && !(bool) ($item['type'] & MENU_IS_LOCAL_TASK) && !drupal_is_front_page()) {
      $trail[] = $item;
    }
  }
  return $trail;
}