diff --git a/includes/menu.inc b/includes/menu.inc index 2fee91a30ab..d2cc3ef63c4 100644 --- a/includes/menu.inc +++ b/includes/menu.inc @@ -544,6 +544,16 @@ function menu_rebuild() { $vancode = ''; $link = ''; } + $tab = ($item['type'] & MENU_IS_LOCAL_TASK) ? 1 : 0; + $default_tab = $item['type'] == MENU_DEFAULT_LOCAL_TASK; + if (!isset($item['parent'])) { + if ($tab) { + $item['parent'] = implode('/', array_slice($item['_parts'], 0, $item['_number_parts'] - 1)); + } + else { + $item['parent'] = $path; + } + } $insert_item = $item + array( 'access arguments' => array(), 'access callback' => '', @@ -552,8 +562,18 @@ function menu_rebuild() { 'map arguments' => array(), 'map callback' => '', ); - db_query("INSERT INTO {menu} (mid, pid, path, access_callback, access_arguments, page_callback, page_arguments, map_callback, map_arguments, fit, number_parts, vancode, menu_link, visible, parents, depth, has_children) VALUES (%d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', %d, '%s', %d, %d)", $insert_item['_mid'], $insert_item['_pid'], $path, $insert_item['access callback'], serialize($insert_item['access arguments']), $insert_item['page callback'], serialize($insert_item['page arguments']), $insert_item['map callback'], serialize($insert_item['map arguments']), $insert_item['_fit'], $insert_item['_number_parts'], $vancode .'+', $link, $insert_item['_visible'], $insert_item['_parents'], $insert_item['_depth'], $insert_item['_has_children']); - // $item needs to be unset because of the reference above. + db_query("INSERT INTO {menu} ( + mid, pid, path, + access_callback, access_arguments, page_callback, page_arguments, map_callback, map_arguments, fit, + number_parts, vancode, menu_link, visible, parents, depth, has_children, tab, default_tab, title, parent) + VALUES (%d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', %d, '%s', %d, %d, %d, %d, '%s', '%s')", + $insert_item['_mid'], $insert_item['_pid'], $path, $insert_item['access callback'], + serialize($insert_item['access arguments']), $insert_item['page callback'], + serialize($insert_item['page arguments']), $insert_item['map callback'], + serialize($insert_item['map arguments']), $insert_item['_fit'], + $insert_item['_number_parts'], $vancode .'+', $link, $insert_item['_visible'], + $insert_item['_parents'], $insert_item['_depth'], $insert_item['_has_children'], + $tab, $default_tab, $insert_item['title'], $insert_item['parent']); unset($item); } } @@ -571,6 +591,28 @@ function menu_secondary_links() { } function menu_primary_local_tasks() { + $router_item = menu_get_item(); + $result = db_query("SELECT * FROM {menu} WHERE parent = '%s' AND tab = 1 ORDER BY vancode", $router_item->parent); + $tabs = array(); + while ($item = db_fetch_object($result)) { + $map = explode('/', $item->path); + foreach ($map as $key => $value) { + if ($value == '%') { + $map[$key] = arg($key); + } + } + $path = implode('/', $map); + if (_menu_access($item, $map, TRUE)) { + $link = l($item->title, $path); + if ((!$router_item->tab && $item->default_tab) || ($path == $_GET['q'])) { + $tabs[] = array('class' => 'active', 'data' => $link); + } + else { + $tabs[] = $link; + } + } + } + return theme('item_list', $tabs, NULL, 'ul', array('class' => 'tabs primary')); } function menu_secondary_local_tasks() { diff --git a/modules/aggregator/aggregator.module b/modules/aggregator/aggregator.module index ca9b693fb79..6648ff9bdfd 100644 --- a/modules/aggregator/aggregator.module +++ b/modules/aggregator/aggregator.module @@ -41,6 +41,7 @@ function aggregator_menu() { 'page arguments' => array('aggregator_form_feed'), 'access arguments' => array('administer news feeds'), 'type' => MENU_LOCAL_TASK, + 'parent' => 'admin/content/aggregator', ); $items['admin/content/aggregator/add/category'] = array( 'title' => t('Add category'), @@ -48,6 +49,7 @@ function aggregator_menu() { 'page arguments' => array('aggregator_form_category'), 'access arguments' => array('administer news feeds'), 'type' => MENU_LOCAL_TASK, + 'parent' => 'admin/content/aggregator', ); $items['admin/content/aggregator/remove/%'] = array( 'title' => t('Remove items'), diff --git a/modules/forum/forum.module b/modules/forum/forum.module index b191bcc61ea..534adcf9700 100644 --- a/modules/forum/forum.module +++ b/modules/forum/forum.module @@ -58,12 +58,14 @@ function forum_menu() { 'page callback' => 'forum_form_main', 'page arguments' => array('container'), 'type' => MENU_LOCAL_TASK, + 'parent' => 'admin/content/forum', ); $items['admin/content/forum/add/forum'] = array( 'title' => t('Add forum'), 'page callback' => 'forum_form_main', 'page arguments' => array('forum'), 'type' => MENU_LOCAL_TASK, + 'parent' => 'admin/content/forum', ); $items['admin/content/forum/settings'] = array( 'title' => t('Settings'), @@ -71,6 +73,7 @@ function forum_menu() { 'page arguments' => array('forum_admin_settings'), 'weight' => 5, 'type' => MENU_LOCAL_TASK, + 'parent' => 'admin/content/forum', ); $items['admin/content/forum/edit'] = array( 'page callback' => 'forum_form_main', diff --git a/modules/locale/locale.module b/modules/locale/locale.module index dd4c88093ee..71fd03902b1 100644 --- a/modules/locale/locale.module +++ b/modules/locale/locale.module @@ -61,6 +61,7 @@ function locale_menu() { 'page callback' => 'locale_string_search', 'weight' => 10, 'type' => MENU_LOCAL_TASK, + 'parent' => 'admin/settings/locale', ); // Manage languages subtabs diff --git a/modules/search/search.module b/modules/search/search.module index 7e8d21d44a0..282aef95d0d 100644 --- a/modules/search/search.module +++ b/modules/search/search.module @@ -168,30 +168,19 @@ function search_menu() { foreach (module_implements('search') as $name) { $items['search/'. $name] = array( + 'title' => module_invoke($name, 'search', 'name', TRUE), 'page callback' => 'search_view', 'page arguments' => array($name), - 'access callback' => FALSE, - 'type' => MENU_LOCAL_TASK, + 'access callback' => '_search_menu', + 'access arguments' => array($name), + 'type' => $name == 'node' ? MENU_DEFAULT_LOCAL_TASK : MENU_LOCAL_TASK, ); } return $items; } -function search_init() { - // To remember the user's search keywords when switching across tabs, - // we dynamically add the keywords to the search tabs' paths. - if (arg(0) == 'search') { - $keys = search_get_keys(); - $keys = strlen($keys) ? '/'. $keys : ''; - foreach (module_implements('search') as $name) { - $title = module_invoke($name, 'search', 'name'); - $item = menu_get_item('search/'. $name); - $item->title = $title; - $item->access = user_access('search content') && $title; - menu_set_item('search/'. $name, $item); - menu_set_item('search/'. $name . $keys, $item); - } - } +function _search_menu($name) { + return user_access('search content') && module_invoke($name, 'search', 'name'); } /** diff --git a/modules/system/system.install b/modules/system/system.install index bf65b3fea14..30de39ba0b9 100644 --- a/modules/system/system.install +++ b/modules/system/system.install @@ -344,6 +344,10 @@ function system_install() { parents varchar(255) NOT NULL default '', depth int NOT NULL default '0', has_children int NOT NULL default '0', + tab int NOT NULL default 0, + title varchar(255) NOT NULL default '', + default_tab int NOT NULL default '0', + parent varchar(255) NOT NULL default '', PRIMARY KEY (path), KEY vancode (vancode), KEY fit (fit), @@ -812,6 +816,10 @@ function system_install() { parents varchar(255) NOT NULL default '', depth int NOT NULL default '0', has_children int NOT NULL default '0', + tab int NOT NULL default '0', + title varchar(255) NOT NULL default '', + default_tab int NOT NULL default '0', + parent varchar(255) NOT NULL default '', PRIMARY KEY (path) )"); diff --git a/modules/taxonomy/taxonomy.module b/modules/taxonomy/taxonomy.module index ed05eb8bb6d..9eac0968e99 100644 --- a/modules/taxonomy/taxonomy.module +++ b/modules/taxonomy/taxonomy.module @@ -88,6 +88,7 @@ function taxonomy_menu() { 'page callback' => 'drupal_get_form', 'page arguments' => array('taxonomy_form_vocabulary'), 'type' => MENU_LOCAL_TASK, + 'parent' => 'admin/content/taxonomy', ); $items['admin/content/taxonomy/edit/vocabulary/%'] = array( @@ -136,6 +137,7 @@ function taxonomy_menu() { 'page callback' => 'drupal_get_form', 'page arguments' => array('taxonomy_form_term', 3), 'type' => MENU_LOCAL_TASK, + 'parent' => 'admin/content/taxonomy/%', ); return $items; diff --git a/modules/user/user.module b/modules/user/user.module index 3bab8cd3ac4..1da91f50569 100644 --- a/modules/user/user.module +++ b/modules/user/user.module @@ -427,10 +427,10 @@ function user_file_download($file) { /** * Implementation of hook_search(). */ -function user_search($op = 'search', $keys = NULL) { +function user_search($op = 'search', $keys = NULL, $skip_access_check = FALSE) { switch ($op) { case 'name': - if (user_access('access user profiles')) { + if ($skip_access_check || user_access('access user profiles')) { return t('Users'); } case 'search':