=== modified file 'includes/menu.inc' --- includes/menu.inc 2009-12-17 13:10:18 +0000 +++ includes/menu.inc 2010-01-01 22:40:55 +0000 @@ -118,6 +118,11 @@ define('MENU_IS_LOCAL_TASK', 0x0080); define('MENU_IS_LOCAL_ACTION', 0x0100); /** + * Internal menu flag -- menu item is a grouping page. + */ +define('MENU_IS_GROUP', 0x0200); + +/** * @} End of "Menu flags". */ @@ -181,6 +186,14 @@ define('MENU_DEFAULT_LOCAL_TASK', MENU_I define('MENU_LOCAL_ACTION', MENU_IS_LOCAL_TASK | MENU_IS_LOCAL_ACTION | MENU_VISIBLE_IN_BREADCRUMB); /** + * Menu type -- a groupping page. + * + * A groupping page is only visible if there are immediate children with the + * same permissions. + */ +define('MENU_GROUP', MENU_VISIBLE_IN_TREE | MENU_VISIBLE_IN_BREADCRUMB | MENU_IS_GROUP); + +/** * @} End of "Menu item types". */ @@ -3071,6 +3084,7 @@ function _menu_router_build($callbacks) } array_multisort($sort, SORT_NUMERIC, $menu); // Apply inheritance rules. + $group_items = array(); foreach ($menu as $path => $v) { $item = &$menu[$path]; if (!$item['_tab']) { @@ -3082,6 +3096,10 @@ function _menu_router_build($callbacks) elseif (!isset($item['context'])) { $item['context'] = MENU_CONTEXT_PAGE; } + if ($item['type'] == MENU_IS_GROUP) { + $group_items[$path] = &$item; + } + $had_parent = FALSE; for ($i = $item['_number_parts'] - 1; $i; $i--) { $parent_path = implode('/', array_slice($item['_parts'], 0, $i)); if (isset($menu[$parent_path])) { @@ -3144,18 +3162,16 @@ function _menu_router_build($callbacks) $item['theme arguments'] = $parent['theme arguments']; } } + if ($parent['type'] == 'MENU_GROUP' && !$had_parent) { + _menu_router_build_add_access_callback($item); + if ($item['access callback'] === $parent['access callback'] && $item['access arguments'] == $parent['access arguments']) { + $parent['_visible'] = TRUE; + } + } + $had_parent = TRUE; } } - if (!isset($item['access callback']) && isset($item['access arguments'])) { - // Default callback. - $item['access callback'] = 'user_access'; - } - if (!isset($item['access callback']) || empty($item['page callback'])) { - $item['access callback'] = 0; - } - if (is_bool($item['access callback'])) { - $item['access callback'] = intval($item['access callback']); - } + _menu_router_build_add_access_callback($item); $item += array( 'access arguments' => array(), @@ -3186,6 +3202,11 @@ function _menu_router_build($callbacks) $item['include file'] = $file_path . '/' . $item['file']; } } + foreach ($group_items as $path => $group_item) { + if (empty($group_item['_visible'])) { + $group_items[$path]['access callback'] = 0; + } + } // Sort the masks so they are in order of descending fit. $masks = array_keys($masks); @@ -3194,6 +3215,19 @@ function _menu_router_build($callbacks) return array($menu, $masks); } +function _menu_router_build_add_access_callback(&$item) { + if (!isset($item['access callback']) && isset($item['access arguments'])) { + // Default callback. + $item['access callback'] = 'user_access'; + } + if (!isset($item['access callback']) || empty($item['page callback'])) { + $item['access callback'] = 0; + } + if (is_bool($item['access callback'])) { + $item['access callback'] = intval($item['access callback']); + } +} + /** * Helper function to save data from menu_router_build() to the router table. */