You are here

menu.inc in Chaos Tool Suite (ctools) 7

Same filename and directory in other branches
  1. 6 includes/menu.inc

General menu helper functions.

File

includes/menu.inc
View source
<?php

/**
 * @file
 * General menu helper functions.
 */

/**
 * Dynamically add a tab to the current path.
 *
 * This function is a simplified interface for adding tabs to the current path.
 * Some considerations when doing this:
 *
 * - First, if there is only 1 tab, Drupal will not show it. Therefore, if
 *   you are only adding one tab, you should find a way to make sure there is
 *   already tab, or instead add 2.
 * - Second, the caller is responsible for providing access control to these
 *   links.
 *
 * @param $link
 *   An array describing this link. It must contain:
 *   - 'title': The printed title of the link.
 *   - 'href': The path of the link. This is an argument to l() so it has all
 *     of those features and limitations.
 *   - 'options': Any options that go to l, including query, fragment and html
 *     options necessary.
 *   - 'weight': The weight to use in ordering the tabs.
 *   - 'type': Optional. If set to MENU_DEFAULT_LOCAL_TASK this can be used to
 *     add a fake 'default' local task, which is useful if you have to add
 *     tabs to a page that has none.
 */
function ctools_menu_add_tab($link = NULL) {
  $links =& drupal_static(__FUNCTION__, array());
  if (isset($link)) {
    $links[$link['href']] = $link;
  }
  return $links;
}

/**
 * Re-sort menu items after we have modified them.
 */
function ctools_menu_sort($a, $b) {
  $a_weight = is_array($a) && isset($a['#link']['weight']) ? $a['#link']['weight'] : 0;
  $b_weight = is_array($b) && isset($b['#link']['weight']) ? $b['#link']['weight'] : 0;
  if ($a_weight == $b_weight) {
    $a_title = is_array($a) && isset($a['#link']['title']) ? $a['#link']['title'] : 0;
    $b_title = is_array($b) && isset($b['#link']['title']) ? $b['#link']['title'] : 0;
    if ($a_title == $b_title) {
      return 0;
    }
    return $a_title < $b_title ? -1 : 1;
  }
  return $a_weight < $b_weight ? -1 : 1;
}
function _ctools_menu_add_dynamic_items(&$data, &$router_item, &$root_path) {
  if ($additions = ctools_menu_add_tab()) {

    // If none of the static local tasks are active allow one of the dynamic
    // active tasks to be marked as such.
    $has_active = FALSE;
    if (!empty($data['tabs'][0]['output'])) {
      foreach ($data['tabs'][0]['output'] as $element) {
        if (!empty($element['#link']['#active'])) {
          $has_active = TRUE;
        }
      }
    }
    foreach ($additions as $addition) {
      $addition['localized_options'] = isset($addition['options']) ? $addition['options'] : array();
      if (isset($addition['type']) && $addition['type'] == MENU_LOCAL_ACTION) {
        $data['actions']['output'][] = array(
          '#theme' => 'menu_local_action',
          '#link' => $addition,
        );
      }
      else {
        $data['tabs'][0]['output'][] = array(
          '#theme' => 'menu_local_task',
          '#link' => $addition,
          '#active' => !$has_active && $root_path === $addition['href'],
        );
      }
    }
    if (!empty($data['tabs'][0]['output'])) {
      uasort($data['tabs'][0]['output'], 'ctools_menu_sort');
      $data['tabs'][0]['count'] = count($data['tabs'][0]['output']);
    }
    if (!empty($data['actions']['output'])) {
      uasort($data['actions']['output'], 'ctools_menu_sort');
      $data['actions']['count'] = count($data['actions']['output']);
    }
  }
}

Functions

Namesort descending Description
ctools_menu_add_tab Dynamically add a tab to the current path.
ctools_menu_sort Re-sort menu items after we have modified them.
_ctools_menu_add_dynamic_items