Index: navigation.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/navigation/navigation.module,v retrieving revision 1.24 diff -u -r1.24 navigation.module --- navigation.module 30 May 2004 22:00:21 -0000 1.24 +++ navigation.module 30 May 2004 22:34:12 -0000 @@ -6,13 +6,17 @@ */ // API: -function navigation_display_tabs($mid) { +function navigation_display_tabs($mid, $fulltabs = 0) { $output = ""; if(navigation_menu_allowed($mid) && ($menu = navigation_load_menu($mid))) { - $output = "
\n"; $selected = navigation_load_selected_items($mid); - $output .= navigation_build_tabs($menu, 0, 0, $selected); - $output .= "
\n"; + if ($fulltabs) + { + $output .= navigation_build_fulltabs($menu, 0, 0, $selected); + } + else { + $output .= navigation_build_tabs($menu, 0, 0, $selected); + } } return $output; } @@ -76,6 +80,51 @@ } } +/** + * navigation_build_tabs: Builds collapsed menu structure - ideal for use with + * DHTML/CSS for dropdown menus. + */ +function navigation_build_fulltabs($menu, $row, $active_parent, $selected) { + + // Pretty-print mini-macro + for ($i = 0; $i < $row; $i++) + { + $spaces .= " "; + } + + if($menu[$row]) { + unset($tabrow); + unset($children); + foreach ($menu[$row] as $item) { + unset($rowOutput); + if (navigation_item_allowed($menu[mid], $item->iid) && (in_array($active_parent, $item->parents) || !$active_parent)) { + $children = $item->iid; + + // Output the item. + if ($selected[$item->iid]) { + $menuOutput .= "\n$spaces
  • iid\">". navigation_l($item->name, $item->url, array("title" => $item->description, "class" => "active-tab")); + } + else { + $menuOutput .= "\n$spaces
  • iid\">". navigation_l($item->name, $item->url, array("title" => $item->description)); + } + + // Check: item has children + $rowOutput = navigation_build_fulltabs($menu, $row + 1, $children, $selected); + if ($rowOutput) { + // Output submenu + $menuOutput .= "\n$rowOutput\n$spaces
  • "; + } + } + } + if ($menuOutput) { + $output = "$spaces\n"; + } + } + + return $output; +} + +/* Original Algorithm - build selected row only. */ function navigation_build_tabs($menu, $row, $active_parent, $selected) { // only try and build the next row if it exists if($menu[$row]) { @@ -92,17 +141,16 @@ $tabrow .= "
  • iid\">". navigation_l($item->name, $item->url, array("title" => $item->description)) ."
  • \n"; } } - } - if($tabrow) { - $output .= "\n\n"; - } - if ($children) { - foreach($children as $child) { - $output .= navigation_build_tabs($menu, $row + 1, $child, $selected); + if($tabrow) { + $output .= "\n\n"; + } + if ($children) { + foreach($children as $child) { + $output .= navigation_build_tabs($menu, $row + 1, $child, $selected); + } } } } - return $output; } @@ -116,7 +164,7 @@ if ($selected[$item->iid]) { if(navigation_get_tree($menu[mid], $item->iid)) { // this item has children, display expanded icon - $output .= "
  • iid\">". navigation_l($item->name, $item->url, array("title" => $item->description)) ."\n"; + $output .= "
  • iid\">". navigation_l($item->name, $item->name, $item->url, array("title" => $item->description)) ."\n"; // display children of active items $output .= navigation_build_menu($menu, $row + 1, $item->iid, $selected); $output .= "
  • \n";