Index: includes/menu.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/menu.inc,v
retrieving revision 1.363
diff -u -p -r1.363 menu.inc
--- includes/menu.inc 2 Dec 2009 07:28:22 -0000 1.363
+++ includes/menu.inc 3 Dec 2009 12:05:48 -0000
@@ -1446,7 +1446,20 @@ function theme_menu_local_task($variable
*/
function theme_menu_local_action($variables) {
$link = $variables['element']['#link'];
- return '
' . l($link['title'], $link['href'], $link['localized_options']) . "\n";
+
+ $output = '';
+ if (isset($link['href'])) {
+ $output .= l($link['title'], $link['href'], isset($link['localized_options']) ? $link['localized_options'] : array());
+ }
+ elseif (!empty($link['localized_options']['html'])) {
+ $output .= $link['title'];
+ }
+ else {
+ $output .= check_plain($link['title']);
+ }
+ $output .= "\n";
+
+ return $output;
}
/**
@@ -1798,6 +1811,11 @@ function menu_local_tasks($level = 0) {
'root_path' => $root_path,
);
}
+ // @todo If there are no tabs, then there still can be actions; for example,
+ // when added via hook_menu_local_tasks_alter().
+ elseif (!empty($data['actions']['output'])) {
+ return array('actions' => $data['actions']) + $empty;
+ }
return $empty;
}
Index: modules/blog/blog.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/blog/blog.module,v
retrieving revision 1.342
diff -u -p -r1.342 blog.module
--- modules/blog/blog.module 26 Nov 2009 06:49:28 -0000 1.342
+++ modules/blog/blog.module 3 Dec 2009 12:06:32 -0000
@@ -134,6 +134,23 @@ function blog_menu() {
}
/**
+ * Implements hook_menu_local_tasks_alter().
+ */
+function blog_menu_local_tasks_alter(&$data, $router_item, $root_path) {
+ // Add action link to 'node/add/blog' on 'blog' page.
+ if ($root_path == 'blog') {
+ $item = menu_get_item('node/add/blog');
+ if ($item['access']) {
+ $item['title'] = t('Create new blog entry');
+ $data['actions']['output'][] = array(
+ '#theme' => 'menu_local_action',
+ '#link' => $item,
+ );
+ }
+ }
+}
+
+/**
* Access callback for user blog pages.
*/
function blog_page_user_access($account) {
Index: modules/blog/blog.pages.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/blog/blog.pages.inc,v
retrieving revision 1.24
diff -u -p -r1.24 blog.pages.inc
--- modules/blog/blog.pages.inc 1 Nov 2009 21:26:44 -0000 1.24
+++ modules/blog/blog.pages.inc 3 Dec 2009 12:00:09 -0000
@@ -70,15 +70,6 @@ function blog_page_last() {
global $user;
$build = array();
- if (user_access('create blog content')) {
- $items[] = l(t('Create new blog entry.'), "node/add/blog");
- $build['blog_actions'] = array(
- '#items' => $items,
- '#theme' => 'item_list',
- '#weight' => -1,
- );
- }
-
$query = db_select('node', 'n')->extend('PagerDefault');
$nids = $query
->fields('n', array('nid', 'sticky', 'created'))
Index: modules/blog/blog.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/blog/blog.test,v
retrieving revision 1.23
diff -u -p -r1.23 blog.test
--- modules/blog/blog.test 2 Dec 2009 19:26:21 -0000 1.23
+++ modules/blog/blog.test 3 Dec 2009 12:00:09 -0000
@@ -187,7 +187,7 @@ class BlogTestCase extends DrupalWebTest
$this->assertResponse(200);
$this->assertTitle('Blogs | Drupal', t('Blog page was displayed'));
$this->assertText(t('Home'), t('Breadcrumbs were displayed'));
- $this->assertLink(t('Create new blog entry.'));
+ $this->assertLink(t('Create new blog entry'));
// Confirm a blog page was displayed per user.
$this->drupalGet('blog/' . $user->uid);
Index: modules/forum/forum.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/forum/forum.module,v
retrieving revision 1.538
diff -u -p -r1.538 forum.module
--- modules/forum/forum.module 2 Dec 2009 19:26:22 -0000 1.538
+++ modules/forum/forum.module 3 Dec 2009 12:07:04 -0000
@@ -137,6 +137,62 @@ function forum_menu() {
return $items;
}
+/**
+ * Implements hook_menu_local_tasks_alter().
+ */
+function forum_menu_local_tasks_alter(&$data, $router_item, $root_path) {
+ global $user;
+
+ // Add action link to 'node/add/forum' on 'forum' page.
+ if ($root_path == 'forum') {
+ $tid = (isset($router_item['page_arguments'][0]) ? $router_item['page_arguments'][0] : 0);
+ $forums = forum_get_forums($tid);
+ $parents = taxonomy_get_parents_all($tid);
+ if ($forums || $parents) {
+ $vid = variable_get('forum_nav_vocabulary', 0);
+ $vocabulary = taxonomy_vocabulary_load($vid);
+
+ $links = array();
+ // Loop through all bundles for forum taxonomy vocabulary field.
+ $field = field_info_field('taxonomy_' . $vocabulary->machine_name);
+ foreach ($field['bundles']['node'] as $type) {
+ if (node_access('create', $type)) {
+ $links[$type] = array(
+ '#theme' => 'menu_local_action',
+ '#link' => array(
+ 'title' => t('Add new @node_type', array('@node_type' => node_type_get_name($type))),
+ 'href' => 'node/add/' . str_replace('_', '-', $type) . '/' . $tid,
+ ),
+ );
+ }
+ }
+ if (empty($links)) {
+ // Authenticated user does not have access to create new topics.
+ if ($user->uid) {
+ $links['disallowed'] = array(
+ '#theme' => 'menu_local_action',
+ '#link' => array(
+ 'title' => t('You are not allowed to post new content in the forum.'),
+ ),
+ );
+ }
+ // Anonymous user does not have access to create new topics.
+ else {
+ $links['login'] = array(
+ '#theme' => 'menu_local_action',
+ '#link' => array(
+ 'title' => t('Login to post new content in the forum.', array(
+ '@login' => url('user/login', array('query' => drupal_get_destination())),
+ )),
+ 'localized_options' => array('html' => TRUE),
+ ),
+ );
+ }
+ }
+ $data['actions']['output'] = array_merge($data['actions']['output'], $links);
+ }
+ }
+}
/**
* Implement hook_init().
@@ -647,6 +703,11 @@ function forum_url_outbound_alter(&$path
* Array of object containing the forum information.
*/
function forum_get_forums($tid = 0) {
+ $cache = &drupal_static(__FUNCTION__, array());
+
+ if (isset($cache[$tid])) {
+ return $cache[$tid];
+ }
$forums = array();
$vid = variable_get('forum_nav_vocabulary', 0);
@@ -708,6 +769,8 @@ function forum_get_forums($tid = 0) {
$forums[$forum->tid] = $forum;
}
+ $cache[$tid] = $forums;
+
return $forums;
}
@@ -846,32 +909,6 @@ function template_preprocess_forums(&$va
drupal_set_title($title);
if ($variables['forums_defined'] = count($variables['forums']) || count($variables['parents'])) {
- // Format the "post new content" links listing.
- $forum_types = array();
-
- // Loop through all bundles for forum taxonomy vocabulary field.
- $field = field_info_field('taxonomy_' . $vocabulary->machine_name);
- foreach ($field['bundles']['node'] as $type) {
- // Check if the current user has the 'create' permission for this node type.
- if (node_access('create', $type)) {
- // Fetch the "General" name of the content type;
- // Push the link with title and url to the array.
- $forum_types[$type] = array('title' => t('Add new @node_type', array('@node_type' => node_type_get_name($type))), 'href' => 'node/add/' . str_replace('_', '-', $type) . '/' . $variables['tid']);
- }
- }
-
- if (empty($forum_types)) {
- // The user is logged-in; but denied access to create any new forum content type.
- if ($user->uid) {
- $forum_types['disallowed'] = array('title' => t('You are not allowed to post new content in the forum.'));
- }
- // The user is not logged-in; and denied access to create any new forum content type.
- else {
- $forum_types['login'] = array('title' => t('Login to post new content in the forum.', array('@login' => url('user/login', array('query' => drupal_get_destination())))), 'html' => TRUE);
- }
- }
- $variables['links'] = $forum_types;
-
if (!empty($variables['forums'])) {
$variables['forums'] = theme('forum_list', $variables);
}
@@ -905,8 +942,7 @@ function template_preprocess_forums(&$va
}
else {
- drupal_set_title(t('No forums defined'), PASS_THROUGH);
- $variables['links'] = array();
+ drupal_set_title(t('No forums defined'));
$variables['forums'] = '';
$variables['topics'] = '';
}
Index: modules/forum/forums.tpl.php
===================================================================
RCS file: /cvs/drupal/drupal/modules/forum/forums.tpl.php,v
retrieving revision 1.6
diff -u -p -r1.6 forums.tpl.php
--- modules/forum/forums.tpl.php 9 Oct 2009 00:59:59 -0000 1.6
+++ modules/forum/forums.tpl.php 3 Dec 2009 12:00:09 -0000
@@ -7,9 +7,6 @@
* containers as well as forum topics.
*
* Variables available:
- * - $links: An array of links that allow a user to post new forum topics.
- * It may also contain a string telling a user they must log in in order
- * to post.
* - $forums: The forums to display (as processed by forum-list.tpl.php)
* - $topics: The topics to display (as processed by forum-topic-list.tpl.php)
* - $forums_defined: A flag to indicate that the forums are configured.
@@ -20,7 +17,6 @@
?>
- $links)); ?>
Index: modules/node/node.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.admin.inc,v
retrieving revision 1.80
diff -u -p -r1.80 node.admin.inc
--- modules/node/node.admin.inc 2 Dec 2009 19:26:22 -0000 1.80
+++ modules/node/node.admin.inc 3 Dec 2009 12:01:21 -0000
@@ -391,11 +391,6 @@ function node_admin_content($form, $form
if (isset($form_state['values']['operation']) && $form_state['values']['operation'] == 'delete') {
return node_multiple_delete_confirm($form, $form_state, array_filter($form_state['values']['nodes']));
}
- // Show the 'add new content' link.
- $form['add_content'] = array(
- '#access' => _node_add_access(),
- '#markup' => theme('links', array('links' => array(array('title' => t('Add new content'), 'href' => 'node/add')), 'attributes' => array('class' => array('action-links')))),
- );
$form['filter'] = node_filter_form();
$form['#submit'][] = 'node_filter_form_submit';
$form['#theme'] = 'node_filter_form';
Index: modules/node/node.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.module,v
retrieving revision 1.1174
diff -u -p -r1.1174 node.module
--- modules/node/node.module 2 Dec 2009 19:52:23 -0000 1.1174
+++ modules/node/node.module 3 Dec 2009 12:07:45 -0000
@@ -1953,6 +1953,22 @@ function node_menu() {
}
/**
+ * Implements hook_menu_local_tasks_alter().
+ */
+function node_menu_local_tasks_alter(&$data, $router_item, $root_path) {
+ // Add action link to 'node/add' on 'admin/content' page.
+ if ($root_path == 'admin/content') {
+ $item = menu_get_item('node/add');
+ if ($item['access']) {
+ $data['actions']['output'][] = array(
+ '#theme' => 'menu_local_action',
+ '#link' => $item,
+ );
+ }
+ }
+}
+
+/**
* Title callback for a node type.
*/
function node_type_page_title($type) {
Index: modules/taxonomy/taxonomy.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/taxonomy/taxonomy.module,v
retrieving revision 1.543
diff -u -p -r1.543 taxonomy.module
--- modules/taxonomy/taxonomy.module 2 Dec 2009 07:42:43 -0000 1.543
+++ modules/taxonomy/taxonomy.module 3 Dec 2009 12:00:09 -0000
@@ -646,6 +646,12 @@ function taxonomy_get_parents($tid, $key
* Find all ancestors of a given term ID.
*/
function taxonomy_get_parents_all($tid) {
+ $cache = &drupal_static(__FUNCTION__, array());
+
+ if (isset($cache[$tid])) {
+ return $cache[$tid];
+ }
+
$parents = array();
if ($term = taxonomy_term_load($tid)) {
$parents[] = $term;
@@ -655,6 +661,9 @@ function taxonomy_get_parents_all($tid)
$n++;
}
}
+
+ $cache[$tid] = $parents;
+
return $parents;
}