=== modified file 'includes/menu.inc'
--- includes/menu.inc 2007-03-08 19:03:48 +0000
+++ includes/menu.inc 2007-03-10 10:38:02 +0000
@@ -76,13 +76,12 @@
define('MENU_IS_ROOT', 0x0001);
define('MENU_VISIBLE_IN_TREE', 0x0002);
define('MENU_VISIBLE_IN_BREADCRUMB', 0x0004);
-define('MENU_VISIBLE_IF_HAS_CHILDREN', 0x0008);
+define('MENU_MODIFIED_BY_ADMIN', 0x0008);
define('MENU_MODIFIABLE_BY_ADMIN', 0x0010);
-define('MENU_MODIFIED_BY_ADMIN', 0x0020);
-define('MENU_CREATED_BY_ADMIN', 0x0040);
-define('MENU_IS_LOCAL_TASK', 0x0080);
-define('MENU_EXPANDED', 0x0100);
-define('MENU_LINKS_TO_PARENT', 0x0200);
+define('MENU_CREATED_BY_ADMIN', 0x0020);
+define('MENU_IS_LOCAL_TASK', 0x0040);
+define('MENU_EXPANDED', 0x0080);
+define('MENU_LINKS_TO_PARENT', 0x00100);
/**
* @} End of "Menu flags".
@@ -103,25 +102,12 @@ define('MENU_LINKS_TO_PARENT', 0x0200);
define('MENU_NORMAL_ITEM', MENU_VISIBLE_IN_TREE | MENU_VISIBLE_IN_BREADCRUMB | MENU_MODIFIABLE_BY_ADMIN);
/**
- * Item groupings are used for pages like "node/add" that simply list
- * subpages to visit. They are distinguished from other pages in that they will
- * disappear from the menu if no subpages exist.
- */
-define('MENU_ITEM_GROUPING', MENU_VISIBLE_IF_HAS_CHILDREN | MENU_VISIBLE_IN_BREADCRUMB | MENU_MODIFIABLE_BY_ADMIN);
-
-/**
* Callbacks simply register a path so that the correct function is fired
* when the URL is accessed. They are not shown in the menu.
*/
define('MENU_CALLBACK', MENU_VISIBLE_IN_BREADCRUMB);
/**
- * Dynamic menu items change frequently, and so should not be stored in the
- * database for administrative customization.
- */
-define('MENU_DYNAMIC_ITEM', MENU_VISIBLE_IN_TREE | MENU_VISIBLE_IN_BREADCRUMB);
-
-/**
* Modules may "suggest" menu items that the administrator may enable. They act
* just as callbacks do until enabled, at which time they act like normal items.
*/
@@ -418,16 +404,15 @@ function _menu_translate($item, $map, $o
* Returns a rendered menu tree.
*/
function menu_tree() {
- global $user;
if ($item = menu_get_item()) {
list(, $menu) = _menu_tree(db_query('SELECT * FROM {menu} WHERE pid IN ('. $item->parents .') AND visible = 1 ORDER BY mleft'));
return $menu;
}
}
-function _menu_tree($result = NULL, $depth = 0, $link = array('link' => '', 'has_children' => FALSE)) {
+function _menu_tree($result = NULL, $depth = 0, $old_item = NULL) {
static $map;
- $remnant = array('link' => '', 'has_children' => FALSE);
+ $remnant = NULL;
$tree = '';
if (!isset($map)) {
$map = arg(NULL);
@@ -438,50 +423,64 @@ function _menu_tree($result = NULL, $dep
if (!$access) {
continue;
}
- $menu_link = array('link' => l($item->title, $path), 'has_children' => $item->has_children);
+ if ($item->to_arg_functions) {
+ $item->link_path = $path;
+ $item->alias = FALSE;
+ }
+ else {
+ $item->alias = TRUE;
+ }
+ if ($item->attributes) {
+ $item->attributes = unserialize($item->attributes);
+ }
if ($item->depth > $depth) {
- list($remnant, $menu) = _menu_tree($result, $item->depth, $menu_link);
- if ($menu) {
- $tree .= theme('menu_tree', $link, $menu);
- }
- else {
- $tree .= theme('menu_link', $link);
- }
- $link = $remnant;
- $remnant = array('link' => '', 'has_children' => FALSE);
+ list($remnant, $menu) = _menu_tree($result, $item->depth, $item);
+ $tree .= theme('menu_item', $old_item, $menu);
+ $old_item = $remnant;
+ $remnant = NULL;
}
elseif ($item->depth == $depth) {
- if ($link['link'] && !($old_type & MENU_VISIBLE_IF_HAS_CHILDREN)) {
- $tree .= theme('menu_link', $link);
- }
- $link = $menu_link;
+ $tree .= theme('menu_item', $old_item);
+ $old_item = $item;
}
// it's the end of a submenu
else {
- $remnant = $menu_link;
+ $remnant = $item;
break;
}
- $old_type = $item->type;
- }
- if ($link['link']) {
- $tree .= theme('menu_link', $link);
}
+ $tree .= theme('menu_item', $old_item);
return array($remnant, $tree);
}
/**
- * Generate the HTML for a menu tree.
+ * Generate the HTML output for a single menu link.
*/
-function theme_menu_tree($link, $tree) {
- $tree = '
';
- return $link['link'] ? theme('menu_link', $link, $tree) : $tree;
+function theme_menu_item_link($item) {
+ $link = (array)$item;
+ return l($link['title'], $link['link_path'], $link);
}
/**
- * Generate the HTML for a menu link.
+ * Generate the HTML output for a menu tree
*/
-function theme_menu_link($link, $menu = '') {
- return ''. $link['link'] . $menu .'' . "\n";
+function theme_menu_tree($tree) {
+ return '';
+}
+
+/**
+ * Generate the HTML output for a menu item and submenu.
+ */
+function theme_menu_item($item, $menu = '') {
+ if ($menu) {
+ $menu = theme('menu_tree', $menu);
+ $class = 'expanded';
+ }
+ if (isset($item)) {
+ $class = empty($item->has_children) ? 'leaf': 'collapsed';
+ return ''. theme('menu_item_link', $item) . $menu .'' . "\n";
+ }
+ return $menu;
}
function theme_menu_local_task($link, $active = FALSE) {
@@ -699,14 +698,27 @@ function menu_rebuild() {
'page callback' => '',
'_mleft' => 0,
'_mright' => 0,
+ 'block callback' => '',
+ 'description' => '',
+ 'attributes' => '',
+ 'query' => '',
+ 'fragment' => '',
+ 'absolute' => '',
+ 'html' => '',
);
+ $link_path = $item['to_arg_functions'] ? $path : drupal_get_path_alias($path);
+ if ($item['attributes']) {
+ $item['attributes'] = serialize($item['attributes']);
+ }
db_query("INSERT INTO {menu} (
mid, pid, path, load_functions, to_arg_functions,
access_callback, access_arguments, page_callback, page_arguments, fit,
number_parts, visible, parents, depth, has_children, tab, title, parent,
- type, mleft, mright)
+ type, mleft, mright, block_callback, description,
+ link_path, attributes, query, fragment, absolute, html)
VALUES (%d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d,
- '%s', %d, %d, %d, '%s', '%s', '%s', %d, %d)",
+ '%s', %d, %d, %d, '%s', '%s', '%s', %d, %d, '%s', '%s',
+ '%s', '%s', '%s', '%s', %d, %d)",
$item['_mid'], $item['_pid'], $path, $item['load_functions'],
$item['to_arg_functions'], $item['access callback'],
serialize($item['access arguments']), $item['page callback'],
@@ -714,7 +726,9 @@ function menu_rebuild() {
$item['_number_parts'], $item['_visible'], $item['_parents'],
$item['_depth'], !empty($item['_children']), $item['_tab'],
$item['title'], $item['parent'], $item['type'], $item['_mleft'],
- $item['_mright']);
+ $item['_mright'], $item['block callback'], $item['description'],
+ $link_path, $item['attributes'], $item['query'], $item['fragment'],
+ $item['absolute'], $item['html']);
}
}
=== modified file 'index.php'
--- index.php 2007-02-11 09:30:50 +0000
+++ index.php 2007-03-10 10:50:18 +0000
@@ -12,6 +12,7 @@
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
+menu_rebuild();
$return = menu_execute_active_handler();
// Menu status constants are integers; page content is a string.
=== modified file 'modules/aggregator/aggregator.module'
--- modules/aggregator/aggregator.module 2007-02-27 12:29:22 +0000
+++ modules/aggregator/aggregator.module 2007-03-09 09:53:17 +0000
@@ -91,8 +91,7 @@ function aggregator_menu() {
$items['aggregator/categories'] = array(
'title' => t('Categories'),
'page callback' => 'aggregator_page_categories',
- 'access arguments' => array('access news feeds'),
- 'type' => MENU_ITEM_GROUPING,
+ 'access callback' => '_aggregator_has_categories',
);
$items['aggregator/rss'] = array(
'title' => t('RSS feed'),
@@ -112,6 +111,7 @@ function aggregator_menu() {
$items[$path] = array(
'title' => $category['title'],
'page callback' => 'aggregator_page_category',
+ 'access callback' => 'user_access',
'access arguments' => array('access news feeds'),
);
$items[$path .'/view'] = array(
@@ -181,6 +181,10 @@ function aggregator_init() {
drupal_add_css(drupal_get_path('module', 'aggregator') .'/aggregator.css');
}
+function _aggregator_has_categories() {
+ return user_access('access news feeds') && db_num_rows(db_query_range('SELECT 1 FROM {aggregator_category}', 0, 1));
+}
+
function aggregator_admin_settings() {
$items = array(0 => t('none')) + drupal_map_assoc(array(3, 5, 10, 15, 20, 25), '_aggregator_items');
$period = drupal_map_assoc(array(3600, 10800, 21600, 32400, 43200, 86400, 172800, 259200, 604800, 1209600, 2419200, 4838400, 9676800), 'format_interval');
=== modified file 'modules/node/node.module'
--- modules/node/node.module 2007-03-07 13:09:32 +0000
+++ modules/node/node.module 2007-03-09 04:06:58 +0000
@@ -1132,8 +1132,7 @@ function node_menu() {
$items['node/add'] = array(
'title' => t('Create content'),
'page callback' => 'node_add',
- 'access callback' => 'user_access',
- 'access arguments' => array('access content'),
+ 'access callback' => '_node_add_access',
'weight' => 1,
);
$items['rss.xml'] = array(
@@ -2090,6 +2089,16 @@ function theme_node_form($form) {
return $output;
}
+function _node_add_access() {
+ $types = node_get_types();
+ foreach ($types as $type) {
+ if (function_exists($type->module .'_form') && node_access('create', $type->type)) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
/**
* Present a node submission form or a set of links to such forms.
*/
=== modified file 'modules/path/path.module'
--- modules/path/path.module 2007-02-15 11:40:17 +0000
+++ modules/path/path.module 2007-03-10 11:32:19 +0000
@@ -135,10 +135,12 @@ function path_admin_delete($pid = 0) {
function path_set_alias($path = NULL, $alias = NULL, $pid = NULL) {
if ($path && !$alias) {
db_query("DELETE FROM {url_alias} WHERE src = '%s'", $path);
+ db_query("UPDATE {menu} SET link_path = path WHERE path = '%s'", $path);
drupal_clear_path_cache();
}
else if (!$path && $alias) {
db_query("DELETE FROM {url_alias} WHERE dst = '%s'", $alias);
+ db_query("UPDATE {menu} SET link_path = path WHERE link_path = '%s'", $alias);
drupal_clear_path_cache();
}
else if ($path && $alias) {
@@ -147,29 +149,34 @@ function path_set_alias($path = NULL, $a
$alias = urldecode($alias);
$alias_count = db_result(db_query("SELECT COUNT(dst) FROM {url_alias} WHERE dst = '%s'", $alias));
- // We have an insert:
- if ($path_count == 0 && $alias_count == 0) {
- db_query("INSERT INTO {url_alias} (src, dst) VALUES ('%s', '%s')", $path, $alias);
- drupal_clear_path_cache();
- }
- else if ($path_count >= 1 && $alias_count == 0) {
- if ($pid) {
+ // Alias count can only be 0 or 1.
+ if ($alias_count == 0) {
+ // New alias.
+ if ($path_count == 0 || $pid == 0) {
+ db_query("INSERT INTO {url_alias} (src, dst) VALUES ('%s', '%s')", $path, $alias);
+ }
+ // Updating existing alias.
+ else {
db_query("UPDATE {url_alias} SET dst = '%s', src = '%s' WHERE pid = %d", $alias, $path, $pid);
}
+ }
+ // The alias exists.
+ else {
+ // This path has no alias yet, so we redirect the alias here.
+ if ($path_count == 0) {
+ db_query("UPDATE {url_alias} SET src = '%s' WHERE dst = '%s'", $path, $alias);
+ }
else {
- db_query("INSERT INTO {url_alias} (src, dst) VALUES ('%s', '%s')", $path, $alias);
+ // This will delete the path that alias was originally pointing to.
+ path_set_alias(NULL, $alias);
+ // This will remove the current aliases of the path.
+ path_set_alias($path);
+ path_set_alias($path, $alias);
}
- drupal_clear_path_cache();
}
- else if ($path_count == 0 && $alias_count == 1) {
- db_query("UPDATE {url_alias} SET src = '%s' WHERE dst = '%s'", $path, $alias);
+ if ($alias_count == 0 || $path_count == 0) {
drupal_clear_path_cache();
- }
- else if ($path_count == 1 && $alias_count == 1) {
- // This will delete the path that alias was originally pointing to:
- path_set_alias(NULL, $alias);
- path_set_alias($path);
- path_set_alias($path, $alias);
+ db_query("UPDATE {menu} SET link_path = '%s' WHERE path = '%s'", $alias, $path);
}
}
}
=== modified file 'modules/system/system.install'
--- modules/system/system.install 2007-03-08 19:03:48 +0000
+++ modules/system/system.install 2007-03-10 10:52:42 +0000
@@ -349,6 +349,14 @@ function system_install() {
title varchar(255) NOT NULL default '',
parent varchar(255) NOT NULL default '',
type int NOT NULL default 0,
+ block_callback varchar(255) NOT NULL default '',
+ description varchar(255) NOT NULL default '',
+ link_path varchar(255) NOT NULL default '',
+ attributes varchar(255) NOT NULL default '',
+ query varchar(255) NOT NULL default '',
+ fragment varchar(255) NOT NULL default '',
+ absolute INT NOT NULL default 0,
+ html INT NOT NULL default 0,
PRIMARY KEY (path),
KEY fit (fit),
KEY visible (visible),
@@ -824,6 +832,14 @@ function system_install() {
title varchar(255) NOT NULL default '',
parent varchar(255) NOT NULL default '',
type int NOT NULL default 0,
+ block_callback varchar(255) NOT NULL default '',
+ description varchar(255) NOT NULL default '',
+ link_path varchar(255) NOT NULL default '',
+ attributes varchar(255) NOT NULL default '',
+ query varchar(255) NOT NULL default '',
+ fragment varchar(255) NOT NULL default '',
+ absolute INT NOT NULL default 0,
+ html INT NOT NULL default 0,
PRIMARY KEY (path)
)");