Commit a2694498 authored by webchick's avatar webchick

#542658 by Gábor Hojtsy, sun, pwolanin: Move action 'tabs' out of local tasks.

parent d71ffc5a
......@@ -4343,6 +4343,9 @@ function drupal_common_theme() {
'menu_local_task' => array(
'arguments' => array('link' => NULL, 'active' => FALSE),
),
'menu_local_action' => array(
'arguments' => array('link' => NULL),
),
'menu_local_tasks' => array(
'arguments' => array(),
),
......
......@@ -112,6 +112,11 @@
*/
define('MENU_IS_LOCAL_TASK', 0x0080);
/**
* Internal menu flag -- menu item is a local action.
*/
define('MENU_IS_LOCAL_ACTION', 0x0100);
/**
* @} End of "Menu flags".
*/
......@@ -167,6 +172,14 @@
*/
define('MENU_DEFAULT_LOCAL_TASK', MENU_IS_LOCAL_TASK | MENU_LINKS_TO_PARENT);
/**
* Menu type -- An action specific to the parent, usually rendered as a link.
*
* Local actions are menu items that describe actions on the parent item such
* as adding a new user, taxonomy term, etc.
*/
define('MENU_LOCAL_ACTION', MENU_IS_LOCAL_TASK | MENU_IS_LOCAL_ACTION);
/**
* @} End of "Menu item types".
*/
......@@ -1305,6 +1318,15 @@ function theme_menu_local_task($link, $active = FALSE) {
return '<li ' . ($active ? 'class="active" ' : '') . '>' . $link . "</li>\n";
}
/**
* Generate the HTML output for a single local action link.
*
* @ingroup themeable
*/
function theme_menu_local_action($link) {
return '<li>' . $link . "</li>\n";
}
/**
* Generates elements for the $arg array in the help hook.
*/
......@@ -1437,27 +1459,39 @@ function menu_navigation_links($menu_name, $level = 0) {
}
/**
* Collects the local tasks (tabs) for a given level.
* Collects the local tasks (tabs), action links, and the root path.
*
* @param $level
* The level of tasks you ask for. Primary tasks are 0, secondary are 1.
* @param $return_root
* Whether to return the root path for the current page.
* @return
* Themed output corresponding to the tabs of the requested level, or
* router path if $return_root == TRUE. This router path corresponds to
* a parent tab, if the current page is a default local task.
*/
function menu_local_tasks($level = 0, $return_root = FALSE) {
$tabs = &drupal_static(__FUNCTION__);
$root_path = &drupal_static(__FUNCTION__ . ':root_path');
* An array containing
* - tabs: Local tasks for the requested level:
* - count: The number of local tasks.
* - output: The themed output of local tasks.
* - actions: Action links for the requested level:
* - count: The number of action links.
* - output: The themed output of action links.
* - root_path: The router path for the current page. If the current page is
* a default local task, then this corresponds to the parent tab.
*/
function menu_local_tasks($level = 0) {
$data = &drupal_static(__FUNCTION__);
$root_path = &drupal_static(__FUNCTION__ . ':root_path', '');
$empty = array(
'tabs' => array('count' => 0, 'output' => ''),
'actions' => array('count' => 0, 'output' => ''),
'root_path' => &$root_path,
);
if (!isset($tabs)) {
if (!isset($data)) {
$data = array();
// Set defaults in case there are no actions or tabs.
$actions = $empty['actions'];
$tabs = array();
$router_item = menu_get_item();
if (!$router_item || !$router_item['access']) {
return '';
return $empty;
}
// Get all tabs and the root page.
$result = db_select('menu_router', NULL, array('fetch' => PDO::FETCH_ASSOC))
......@@ -1480,7 +1514,6 @@ function menu_local_tasks($level = 0, $return_root = FALSE) {
// Store the translated item for later use.
$tasks[$item['path']] = $item;
}
// Find all tabs below the current path.
$path = $router_item['path'];
// Tab parenting may skip levels, so the number of parts in the path may not
......@@ -1488,31 +1521,42 @@ function menu_local_tasks($level = 0, $return_root = FALSE) {
$depth = 1001;
while (isset($children[$path])) {
$tabs_current = '';
$actions_current = '';
$next_path = '';
$count = 0;
$tab_count = 0;
$action_count = 0;
foreach ($children[$path] as $item) {
if ($item['access']) {
$count++;
// The default task is always active.
if ($item['type'] == MENU_DEFAULT_LOCAL_TASK) {
// Find the first parent which is not a default local task.
// Find the first parent which is not a default local task or action.
for ($p = $item['tab_parent']; $tasks[$p]['type'] == MENU_DEFAULT_LOCAL_TASK; $p = $tasks[$p]['tab_parent']);
$link = theme('menu_item_link', array('href' => $tasks[$p]['href']) + $item);
$tabs_current .= theme('menu_local_task', $link, TRUE);
$next_path = $item['path'];
$tab_count++;
}
else {
$link = theme('menu_item_link', $item);
$tabs_current .= theme('menu_local_task', $link);
if ($item['type'] == MENU_LOCAL_TASK) {
$tabs_current .= theme('menu_local_task', $link);
$tab_count++;
}
else {
$actions_current .= theme('menu_local_action', $link);
$action_count++;
}
}
}
}
$path = $next_path;
$tabs[$depth]['count'] = $count;
$tabs[$depth]['count'] = $tab_count;
$tabs[$depth]['output'] = $tabs_current;
$actions['count'] = $action_count;
$actions['output'] = $actions_current;
$depth++;
}
$data['actions'] = $actions;
// Find all tabs at the same level or above the current one.
$parent = $router_item['tab_parent'];
$path = $router_item['path'];
......@@ -1524,6 +1568,9 @@ function menu_local_tasks($level = 0, $return_root = FALSE) {
$next_parent = '';
$count = 0;
foreach ($children[$parent] as $item) {
if ($item['type'] == MENU_LOCAL_ACTION) {
continue;
}
if ($item['access']) {
$count++;
if ($item['type'] == MENU_DEFAULT_LOCAL_TASK) {
......@@ -1560,36 +1607,51 @@ function menu_local_tasks($level = 0, $return_root = FALSE) {
ksort($tabs);
// Remove the depth, we are interested only in their relative placement.
$tabs = array_values($tabs);
$data['tabs'] = $tabs;
}
if ($return_root) {
return $root_path;
}
else {
// We do not display single tabs.
return (isset($tabs[$level]) && $tabs[$level]['count'] > 1) ? $tabs[$level]['output'] : '';
if (isset($data['tabs'][$level])) {
return array(
'tabs' => $data['tabs'][$level],
'actions' => $data['actions'],
'root_path' => $root_path,
);
}
return $empty;
}
/**
* Returns the rendered local tasks at the top level.
*/
function menu_primary_local_tasks() {
return menu_local_tasks(0);
$links = menu_local_tasks(0);
// Do not display single tabs.
return ($links['tabs']['count'] > 1 ? $links['tabs']['output'] : '');
}
/**
* Returns the rendered local tasks at the second level.
*/
function menu_secondary_local_tasks() {
return menu_local_tasks(1);
$links = menu_local_tasks(1);
// Do not display single tabs.
return ($links['tabs']['count'] > 1 ? $links['tabs']['output'] : '');
}
/**
* Returns the rendered local actions at the current level.
*/
function menu_local_actions() {
$links = menu_local_tasks();
return $links['actions']['output'];
}
/**
* Returns the router path, or the path of the parent tab of a default local task.
*/
function menu_tab_root_path() {
return menu_local_tasks(0, TRUE);
$links = menu_local_tasks();
return $links['root_path'];
}
/**
......
......@@ -2039,6 +2039,7 @@ function template_preprocess_page(&$variables) {
$variables['messages'] = $variables['show_messages'] ? theme('status_messages') : '';
$variables['main_menu'] = theme_get_setting('toggle_main_menu') ? menu_main_menu() : array();
$variables['secondary_menu'] = theme_get_setting('toggle_secondary_menu') ? menu_secondary_menu() : array();
$variables['action_links'] = menu_local_actions();
$variables['search_box'] = (theme_get_setting('toggle_search') ? drupal_render(drupal_get_form('search_theme_form')) : '');
$variables['site_name'] = (theme_get_setting('toggle_name') ? filter_xss_admin(variable_get('site_name', 'Drupal')) : '');
$variables['site_slogan'] = (theme_get_setting('toggle_slogan') ? filter_xss_admin(variable_get('site_slogan', '')) : '');
......
......@@ -65,7 +65,7 @@ function menu_menu() {
'page callback' => 'drupal_get_form',
'page arguments' => array('menu_edit_menu', 'add'),
'access arguments' => array('administer menu'),
'type' => MENU_LOCAL_TASK,
'type' => MENU_LOCAL_ACTION,
);
$items['admin/structure/menu/settings'] = array(
'title' => 'Settings',
......@@ -94,7 +94,7 @@ function menu_menu() {
'page callback' => 'drupal_get_form',
'page arguments' => array('menu_edit_item', 'add', NULL, 3),
'access arguments' => array('administer menu'),
'type' => MENU_LOCAL_TASK,
'type' => MENU_LOCAL_ACTION,
);
$items['admin/structure/menu-customize/%menu/edit'] = array(
'title' => 'Edit menu',
......
......@@ -68,6 +68,8 @@
* - $secondary_menu (array): An array containing the Secondary menu links for
* the site, if they have been configured.
* - $breadcrumb: The breadcrumb trail for the current page.
* - $action_links: Actions local to the page, such as 'Add menu' on the menu
* administration interface.
*
* Page content (in order of occurrence in the default page.tpl.php):
* - $title: The page title, for use in the actual HTML content.
......@@ -171,6 +173,7 @@
<?php if ($title): ?><h1 class="title" id="page-title"><?php print $title; ?></h1><?php endif; ?>
<?php if ($tabs): ?><div class="tabs"><?php print $tabs; ?></div><?php endif; ?>
<?php print $help; ?>
<?php if ($action_links): ?><ul class="action-links"><?php print $action_links; ?></ul><?php endif; ?>
<div id="content-area" class="region">
<?php print $content; ?>
</div> <!-- /#content-area -->
......
......@@ -54,6 +54,7 @@
<?php if ($tabs2): ?><ul class="tabs secondary"><?php print $tabs2 ?></ul><?php endif; ?>
<?php if ($show_messages && $messages): print $messages; endif; ?>
<?php print $help; ?>
<?php if ($action_links): ?><ul class="action-links"><?php print $action_links; ?></ul><?php endif; ?>
<div class="clearfix">
<?php print $content ?>
</div>
......
......@@ -33,6 +33,7 @@
<?php print $help; ?>
</div>
<?php endif; ?>
<?php if ($action_links): ?><ul class="action-links"><?php print $action_links; ?></ul><?php endif; ?>
<?php print $content; ?>
</div>
......
......@@ -608,6 +608,16 @@ html.js input.throbbing {
background-position: 100% -16px;
}
ul.action-links {
margin: 1em 0;
overflow: hidden;
}
ul.action-links li {
float: left;
margin: 0 1em 0 0;
}
/* Exceptions */
#diff-inline-form select,
#block-system-main div.filter-options select {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment