Skip to content
Snippets Groups Projects
menu.inc 3.92 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

Dries Buytaert's avatar
 
Dries Buytaert committed
function menu($path, $title, $callback = NULL, $help = NULL, $weight = 0, $hidden = 0) {
  global $_gmenu;
Dries Buytaert's avatar
 
Dries Buytaert committed

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

    // find the best matching parent item:
    $parent = substr($path, 0, strrpos($path, "/"));
    while ($parent && !$_gmenu[$parent]) {
      $parent = substr($parent, 0, strrpos($parent, "/"));
Dries Buytaert's avatar
 
Dries Buytaert committed
    }

    // check if any items need to be lowered:
    if ($parent) {
      foreach ($_gmenu[$parent]["children"] as $key => $item) {
        if (strstr($item, $path)) {
          // remove the item from its parent:
          unset($_gmenu[$parent]["children"][$key]);

          // add the item to its new parent:
          $_gmenu[$path]["children"][] = $item;
        }
      }
Dries Buytaert's avatar
 
Dries Buytaert committed
    }

    // add the menu to the best matching parent:
    $_gmenu[$parent]["children"][] = $path;
  }
Dries Buytaert's avatar
 
Dries Buytaert committed
}
Dries Buytaert's avatar
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
function menu_item($in_path) {
  global $_gmenu;
Dries Buytaert's avatar
Dries Buytaert committed
  /*
  ** If you want to theme your links, or if you want to replace them
  ** by an image, this would be the function to customize.
  */
Dries Buytaert's avatar
 
Dries Buytaert committed
  $trail = menu_trail();
  if (end($trail) == $in_path) {
    $css = " class=\"current\"";
  }
Dries Buytaert's avatar
Dries Buytaert committed

  return "<a href=\"". url($in_path) ."\"$css>". t($_gmenu[$in_path]["title"]) ."</a>";
Dries Buytaert's avatar
Dries Buytaert committed
}

Dries Buytaert's avatar
 
Dries Buytaert committed
function menu_trail() {
Dries Buytaert's avatar
 
Dries Buytaert committed
  global $_gmenu;
  static $trail; // cache
Dries Buytaert's avatar
Dries Buytaert committed

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

    while ($path) {
      if ($_gmenu[$path]) {
        $trail[] = $path;
      }
Dries Buytaert's avatar
Dries Buytaert committed

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

    $trail = array_reverse($trail);
Dries Buytaert's avatar
Dries Buytaert committed
  }

Dries Buytaert's avatar
Dries Buytaert committed
}

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

Dries Buytaert's avatar
 
Dries Buytaert committed
  $trail = menu_trail();
Dries Buytaert's avatar
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
  $links = array();
Dries Buytaert's avatar
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
  foreach ($trail as $item) {
    $links[] = menu_item($item);
Dries Buytaert's avatar
Dries Buytaert committed
  }

  return implode(" &raquo; ", $links);
Dries Buytaert's avatar
Dries Buytaert committed
}

function menu_help() {
Dries Buytaert's avatar
 
Dries Buytaert committed
  global $_gmenu;
Dries Buytaert's avatar
Dries Buytaert committed
  $path = menu_trail();
  if ($path) {
    $item = array_pop($path);
Dries Buytaert's avatar
 
Dries Buytaert committed
    $output = $_gmenu[$item]["help"];
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
function _menu_sort($a, $b) {
  global $_gmenu;
  $a = &$_gmenu[$a];
  $b = &$_gmenu[$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 = "") {
  global $_gmenu;

  if ($_gmenu[$parent]["children"]) {
    $output = "\n<ul>\n";
    usort($_gmenu[$parent]["children"], "_menu_sort");
    foreach ($_gmenu[$parent]["children"] as $item) {
      if ($_gmenu[$item]["hidden"] == 0) {
Dries Buytaert's avatar
 
Dries Buytaert committed
        $trail = menu_trail($item);
        $style = ($_gmenu[$item]["children"] ? (in_array($item, $trail)  ? "expanded" : "collapsed") : "leaf");
        $output .= "<li class=\"$style\">";
Dries Buytaert's avatar
 
Dries Buytaert committed
        $output .= menu_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
function menu_map($parent = "") {
Dries Buytaert's avatar
 
Dries Buytaert committed
  global $_gmenu;
Dries Buytaert's avatar
 
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
  $output = "<ul>";
  usort($_gmenu[$parent]["children"], "_menu_sort");
  foreach ($_gmenu[$parent]["children"] as $item) {
    if ($_gmenu[$item]["hidden"] == 0) {
Dries Buytaert's avatar
 
Dries Buytaert committed
      $output .= "<li>";
      $output .= menu_item($item);
Dries Buytaert's avatar
 
Dries Buytaert committed
      $output .= menu_map($item);
Dries Buytaert's avatar
 
Dries Buytaert committed
      $output .= "</li>";
Dries Buytaert's avatar
 
Dries Buytaert committed
    }
  }
Dries Buytaert's avatar
 
Dries Buytaert committed
  $output .= "</ul>";
Dries Buytaert's avatar
 
Dries Buytaert committed

  return $output;
}

Dries Buytaert's avatar
 
Dries Buytaert committed
function menu_execute_action() {
Dries Buytaert's avatar
 
Dries Buytaert committed
  global $_gmenu;
Dries Buytaert's avatar
 
Dries Buytaert committed
  $trail = menu_trail();
  $selected_menu = array_pop($trail);
Dries Buytaert's avatar
 
Dries Buytaert committed

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

Dries Buytaert's avatar
 
Dries Buytaert committed
function menu_build($type) {

  // Empty the existing menu tree (if any):
  unset($GLOBALS["_gmenu"]);

  // Build the menu tree:
  module_invoke_all("link", $type);
}

Dries Buytaert's avatar
 
Dries Buytaert committed
?>