Skip to content
Snippets Groups Projects
menu.inc 3.45 KiB
Newer Older
Dries Buytaert's avatar
Dries Buytaert committed
<?php
Kjartan Mannes's avatar
Kjartan Mannes committed
// $Id$
Dries Buytaert's avatar
Dries Buytaert committed

/**
 * Register a menu item to the menu system.
 */
Dries Buytaert's avatar
 
Dries Buytaert committed
function menu($path, $title, $callback = NULL, $help = NULL, $weight = 0, $hidden = 0) {
Dries Buytaert's avatar
 
Dries Buytaert committed

  // add the menu to the flat list of menu items:
  $_list[$path] = array("title" => $title, "callback" => $callback, "help" => $help, "weight" => $weight, "hidden" => $hidden);
Dries Buytaert's avatar
 
Dries Buytaert committed
}
Dries Buytaert's avatar
Dries Buytaert committed

/**
 * Returns the path of the active menu item.
 */
function menu_get_active() {
  global $_list;
  static $path;
Dries Buytaert's avatar
Dries Buytaert committed

  if (empty($path)) {
    $path = $_GET["q"];
Dries Buytaert's avatar
 
Dries Buytaert committed

    while ($path && !$_list[$path]) {
      $path = substr($path, 0, strrpos($path, "/"));
    }
Dries Buytaert's avatar
 
Dries Buytaert committed
  }

Dries Buytaert's avatar
 
Dries Buytaert committed
}

function menu_get_path($path) {
  global $_list;
  static $trail; // cache
Dries Buytaert's avatar
Dries Buytaert committed

  if (empty($trail)) {
    $trail = array();
Dries Buytaert's avatar
Dries Buytaert committed

    while ($path) {
      if ($_list[$path]) {
        array_unshift($trail, $path);
Dries Buytaert's avatar
Dries Buytaert committed

      $path = substr($path, 0, strrpos($path, "/"));
Dries Buytaert's avatar
 
Dries Buytaert committed
    }
Dries Buytaert's avatar
Dries Buytaert committed
  }

Dries Buytaert's avatar
Dries Buytaert committed
}

function menu_get_active_title() {
  global $_list;
Dries Buytaert's avatar
Dries Buytaert committed

  if ($path = menu_get_active()) {
    return ucfirst($_list[$path]["title"]);
  }
}
Dries Buytaert's avatar
Dries Buytaert committed

function menu_get_active_help() {
  global $_list;
Dries Buytaert's avatar
Dries Buytaert committed

  if ($path = menu_get_active()) {
    return $_list[$path]["help"];
Dries Buytaert's avatar
Dries Buytaert committed
  }
Dries Buytaert's avatar
Dries Buytaert committed

}

function menu_render_item($path) {
  global $_list;

  if ($path == $_GET["q"]) {
    $css = " class=\"active\"";
Dries Buytaert's avatar
Dries Buytaert committed
  }

  return "<a href=\"". url($path) ."\"$css>". t($_list[$path]["title"]) ."</a>";
}

function menu_active_breadcrumb() {

  $links[] = l(t("Home"), "");

  $trail = menu_get_path($_GET["q"]);
  foreach ($trail as $item) {
    $links[] = menu_render_item($item);
  }

  return $links;
Dries Buytaert's avatar
Dries Buytaert committed
}

Dries Buytaert's avatar
 
Dries Buytaert committed
function _menu_sort($a, $b) {
  global $_list;

  $a = &$_list[$a];
  $b = &$_list[$b];

Dries Buytaert's avatar
 
Dries Buytaert committed
  return $a["weight"] < $b["weight"] ? -1 : ($a["weight"] > $b["weight"] ? 1 : ($a["title"] < $b["title"] ? -1 : 1));
Dries Buytaert's avatar
 
Dries Buytaert committed
}
Dries Buytaert's avatar
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
function menu_tree($parent = "") {
Dries Buytaert's avatar
 
Dries Buytaert committed

  if (empty($tail)) {
    $trail = menu_get_path($_GET["q"]);
  }

  if ($_list[$parent]["children"]) {
Dries Buytaert's avatar
 
Dries Buytaert committed
    $output = "\n<ul>\n";
    usort($_list[$parent]["children"], "_menu_sort");
    foreach ($_list[$parent]["children"] as $item) {
      if ($_list[$item]["hidden"] == 0) {
        $style = ($_list[$item]["children"] ? (in_array($item, $trail)  ? "expanded" : "collapsed") : "leaf");
Dries Buytaert's avatar
 
Dries Buytaert committed
        $output .= "<li class=\"$style\">";
        $output .= menu_render_item($item);
Dries Buytaert's avatar
 
Dries Buytaert committed
        if (in_array($item, $trail)) {
Dries Buytaert's avatar
 
Dries Buytaert committed
          $output .= menu_tree($item);
        }
        $output .= "</li>\n";
      }
Dries Buytaert's avatar
 
Dries Buytaert committed
    }
Dries Buytaert's avatar
 
Dries Buytaert committed
    $output .= "</ul>\n";
Dries Buytaert's avatar
Dries Buytaert committed
  }

Dries Buytaert's avatar
 
Dries Buytaert committed
  return $output;
Dries Buytaert's avatar
Dries Buytaert committed
}

Dries Buytaert's avatar
 
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
function menu_execute_action() {
Dries Buytaert's avatar
 
Dries Buytaert committed

  $path = menu_get_active();

  if ($_list[$path]["callback"]) {
    $arg = substr($_GET["q"], strlen($path) + 1);
Dries Buytaert's avatar
 
Dries Buytaert committed
    if (empty($arg)) {
      return call_user_func($_list[$path]["callback"]);
Dries Buytaert's avatar
 
Dries Buytaert committed
    }
    else {
      return call_user_func_array($_list[$path]["callback"], explode("/", $arg));
Dries Buytaert's avatar
 
Dries Buytaert committed
    }
Dries Buytaert's avatar
Dries Buytaert committed
  }
}

Dries Buytaert's avatar
 
Dries Buytaert committed
function menu_build($type) {
  /*
  ** Build a sequential list of all menus items.
  */
Dries Buytaert's avatar
 
Dries Buytaert committed

  module_invoke_all("link", $type);

  /*
  ** Tree-ify the sequential list of menu items by adding each
  ** menu item to the 'children' array of their direct parent.
  */

  global $_list;

  foreach ($_list as $path => $data) {

    /*
    ** Find $path's direct parent:
    */
    $parent = $path;
    do {
      $parent = substr($parent, 0, strrpos($parent, "/"));
    }
    while ($parent && !$_list[$parent]);

    if ($path) {
      $_list[$parent]["children"][] = $path;
    }
  }
Dries Buytaert's avatar
 
Dries Buytaert committed
}

Dries Buytaert's avatar
 
Dries Buytaert committed
?>