aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--actions/admin/menu/save.php35
-rw-r--r--actions/admin/menu_items.php50
-rw-r--r--engine/classes/ElggMenuItem.php2
-rw-r--r--engine/lib/admin.php2
-rw-r--r--engine/lib/navigation.php64
-rw-r--r--engine/lib/river.php3
-rw-r--r--engine/lib/users.php3
-rw-r--r--mod/blog/start.php3
-rw-r--r--mod/bookmarks/start.php3
-rw-r--r--mod/file/start.php3
-rw-r--r--mod/groups/start.php3
-rw-r--r--mod/pages/start.php3
-rw-r--r--mod/riverdashboard/start.php1
-rw-r--r--mod/thewire/start.php5
-rw-r--r--views/default/admin/appearance/menu_items.php43
-rw-r--r--views/default/navigation/menu/elements/item.php10
-rw-r--r--views/default/navigation/menu/site.php25
-rw-r--r--views/default/navigation/site_nav.php83
-rw-r--r--views/default/page/elements/header.php2
19 files changed, 175 insertions, 168 deletions
diff --git a/actions/admin/menu/save.php b/actions/admin/menu/save.php
new file mode 100644
index 000000000..3fdce8c45
--- /dev/null
+++ b/actions/admin/menu/save.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Save menu items.
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+
+// featured menu items
+$featured_names = get_input('featured_menu_names', array());
+$featured_names = array_unique($featured_names);
+if (in_array('', $featured_names)) {
+ unset($featured_names[array_search('', $featured_names)]);
+}
+elgg_save_config('site_featured_menu_names', $featured_names);
+
+
+// custom menu items
+$custom_menu_titles = get_input('custom_menu_titles', array());
+$custom_menu_urls = get_input('custom_menu_urls', array());
+$num_menu_items = count($custom_menu_titles);
+$custom_menu_items = array();
+for ($i = 0; $i < $num_menu_items; $i++) {
+ if (trim($custom_menu_urls[$i]) && trim($custom_menu_titles[$i])) {
+ $url = $custom_menu_urls[$i];
+ $title = $custom_menu_titles[$i];
+ $custom_menu_items[$title] = $url;
+ }
+}
+elgg_save_config('site_custom_menu_items', $custom_menu_items);
+
+
+system_message(elgg_echo('admin:menu_items:saved'));
+
+forward(REFERER);
diff --git a/actions/admin/menu_items.php b/actions/admin/menu_items.php
deleted file mode 100644
index c9efb8bee..000000000
--- a/actions/admin/menu_items.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-/**
- * Save menu items.
- *
- * @package Elgg
- * @subpackage Core
- */
-
-$featured_urls = get_input('featured_urls', array());
-$custom_item_names = get_input('custom_item_names', array());
-$custom_item_urls = get_input('custom_item_urls', array());
-
-// save the full information from the menu item into the config table
-// this will be checked upon display that it is still valid (based upon url)
-$menu_items = get_register('menu');
-$menu_urls = array();
-$featured_url_info = array();
-
-foreach ($menu_items as $name => $info) {
- $menu_urls[$info->value->url] = $info;
-}
-
-foreach ($featured_urls as $url) {
- if (array_key_exists($url, $menu_urls)) {
- $featured_url_info[] = $menu_urls[$url];
- }
-}
-
-// save the custom items
-$custom_count = count($custom_item_names);
-$custom_items = array();
-for ($i = 0; $i < $custom_count; $i++) {
- if (isset($custom_item_names[$i]) && isset($custom_item_names[$i])) {
- $name = $custom_item_names[$i];
- $url = $custom_item_urls[$i];
-
- if ($name && $url) {
- $custom_items[$url] = $name;
- }
- }
-}
-
-
-// set_config() always returns 0 so can't check for failures
-set_config('menu_items_featured_urls', $featured_url_info);
-set_config('menu_items_custom_items', $custom_items);
-
-system_message(elgg_echo('admin:menu_items:saved'));
-
-forward(REFERER);
diff --git a/engine/classes/ElggMenuItem.php b/engine/classes/ElggMenuItem.php
index 97dabe62a..af7bbc9c2 100644
--- a/engine/classes/ElggMenuItem.php
+++ b/engine/classes/ElggMenuItem.php
@@ -68,7 +68,7 @@ class ElggMenuItem {
public function __construct($name, $title, $url) {
$this->name = $name;
$this->title = $title;
- $this->url = $url;
+ $this->url = elgg_normalize_url($url);
}
/**
diff --git a/engine/lib/admin.php b/engine/lib/admin.php
index aab4b3aea..a5f7e1f88 100644
--- a/engine/lib/admin.php
+++ b/engine/lib/admin.php
@@ -122,7 +122,7 @@ function admin_init() {
elgg_register_action('admin/site/update_basic', '', 'admin');
elgg_register_action('admin/site/update_advanced', '', 'admin');
- elgg_register_action('admin/menu_items', '', 'admin');
+ elgg_register_action('admin/menu/save', '', 'admin');
elgg_register_action('admin/plugins/simple_update_states', '', 'admin');
diff --git a/engine/lib/navigation.php b/engine/lib/navigation.php
index 7b8c32f02..ed19976cd 100644
--- a/engine/lib/navigation.php
+++ b/engine/lib/navigation.php
@@ -568,3 +568,67 @@ function elgg_get_breadcrumbs() {
return (is_array($CONFIG->breadcrumbs)) ? $CONFIG->breadcrumbs : array();
}
+
+/**
+ * Set up the site menu
+ *
+ * Handles default, featured, and custom menu items
+ *
+ * @param string $hook
+ * @param string $type
+ * @param array $return Menu array
+ * @param array $params
+ * @return array
+ */
+function elgg_site_menu_setup($hook, $type, $return, $params) {
+
+ $featured_menu_names = elgg_get_config('site_featured_menu_names');
+ $custom_menu_items = elgg_get_config('site_custom_menu_items');
+ if ($featured_menu_names || $custom_menu_items) {
+ // we have featured or custom menu items
+
+ $registered = $return['default'];
+
+ // set up featured menu items
+ $featured = array();
+ foreach ($featured_menu_names as $name) {
+ foreach ($registered as $index => $item) {
+ if ($item->getName() == $name) {
+ $featured[] = $item;
+ unset($registered[$index]);
+ }
+ }
+ }
+
+ // add custom menu items
+ $n = 1;
+ foreach ($custom_menu_items as $title => $url) {
+ $item = new ElggMenuItem("custom$n", $title, $url);
+ $featured[] = $item;
+ $n++;
+ }
+
+ $return['default'] = $featured;
+ $return['more'] = $registered;
+ } else {
+ // no featured menu items set
+ $max_display_items = 5;
+
+ // the first n are shown, rest added to more list
+ $num_menu_items = count($return['default']);
+ if ($num_menu_items > $max_display_items) {
+ $return['more'] = array_splice($return['default'], $max_display_items);
+ }
+ }
+
+ return $return;
+}
+
+/**
+ * Navigation initialization
+ */
+function elgg_nav_init() {
+ elgg_register_plugin_hook_handler('prepare', 'menu:site', 'elgg_site_menu_setup');
+}
+
+elgg_register_event_handler('init', 'system', 'elgg_nav_init'); \ No newline at end of file
diff --git a/engine/lib/river.php b/engine/lib/river.php
index 46f11da46..459d351c1 100644
--- a/engine/lib/river.php
+++ b/engine/lib/river.php
@@ -806,7 +806,8 @@ function elgg_river_page_handler($page) {
*/
function elgg_river_init() {
register_page_handler('activity', 'elgg_river_page_handler');
- add_menu(elgg_echo('activity'), "pg/activity/");
+ $item = new ElggMenuItem('activity', elgg_echo('activity'), 'pg/activity');
+ elgg_register_menu_item('site', $item);
}
elgg_register_event_handler('init', 'system', 'elgg_river_init');
diff --git a/engine/lib/users.php b/engine/lib/users.php
index 4e34586a3..d22e42ebf 100644
--- a/engine/lib/users.php
+++ b/engine/lib/users.php
@@ -1526,7 +1526,8 @@ function users_init() {
register_page_handler('members', 'elgg_members_page_handler');
//register_page_handler('collections', 'collections_page_handler');
- add_menu(elgg_echo('members'), 'pg/members/');
+ $item = new ElggMenuItem('members', elgg_echo('members'), 'pg/members');
+ elgg_register_menu_item('site', $item);
elgg_register_action("register", '', 'public');
elgg_register_action("useradd", '', 'public');
diff --git a/mod/blog/start.php b/mod/blog/start.php
index 374fe22d2..fb9e7d6ef 100644
--- a/mod/blog/start.php
+++ b/mod/blog/start.php
@@ -22,7 +22,8 @@ function blog_init() {
elgg_register_library('elgg:blog', elgg_get_plugin_path() . 'blog/lib/blog.php');
- add_menu(elgg_echo('blog:blogs'), "pg/blog/all/", array());
+ $item = new ElggMenuItem('blog', elgg_echo('blog:blogs'), 'pg/blog/all');
+ elgg_register_menu_item('site', $item);
// run the setup upon activations or to upgrade old installations.
run_function_once('blog_runonce', '1269370108');
diff --git a/mod/bookmarks/start.php b/mod/bookmarks/start.php
index 8e33991c9..30272bb69 100644
--- a/mod/bookmarks/start.php
+++ b/mod/bookmarks/start.php
@@ -11,7 +11,8 @@ function bookmarks_init() {
global $CONFIG;
//add a tools menu option
- add_menu(elgg_echo('bookmarks'), 'pg/bookmarks');
+ $item = new ElggMenuItem('bookmarks', elgg_echo('bookmarks'), 'pg/bookmarks');
+ elgg_register_menu_item('site', $item);
// Register a page handler, so we can have nice URLs
register_page_handler('bookmarks', 'bookmarks_page_handler');
diff --git a/mod/file/start.php b/mod/file/start.php
index c939877f5..227a5c33c 100644
--- a/mod/file/start.php
+++ b/mod/file/start.php
@@ -28,7 +28,8 @@
global $CONFIG;
// Set up menu (tools dropdown)
- add_menu(elgg_echo('files'), "pg/file/");
+ $item = new ElggMenuItem('file', elgg_echo('file'), 'pg/file');
+ elgg_register_menu_item('site', $item);
// Extend CSS
elgg_extend_view('css/screen', 'file/css');
diff --git a/mod/groups/start.php b/mod/groups/start.php
index 36a1964ba..aaaaa3f45 100644
--- a/mod/groups/start.php
+++ b/mod/groups/start.php
@@ -14,7 +14,8 @@
global $CONFIG;
// Set up the menu
- add_menu(elgg_echo('groups'), "pg/groups/world/");
+ $item = new ElggMenuItem('groups', elgg_echo('groups'), 'pg/groups/world');
+ elgg_register_menu_item('site', $item);
// Register a page handler, so we can have nice URLs
register_page_handler('groups','groups_page_handler');
diff --git a/mod/pages/start.php b/mod/pages/start.php
index 1e0c5bdc2..e90c6db54 100644
--- a/mod/pages/start.php
+++ b/mod/pages/start.php
@@ -12,7 +12,8 @@
function pages_init() {
global $CONFIG;
- add_menu(elgg_echo('pages'), "mod/pages/world.php");
+ $item = new ElggMenuItem('pages', elgg_echo('pages'), 'mod/pages/world.php');
+ elgg_register_menu_item('site', $item);
// Register a page handler, so we can have nice URLs
register_page_handler('pages','pages_page_handler');
diff --git a/mod/riverdashboard/start.php b/mod/riverdashboard/start.php
index cc0c4abac..6d1581873 100644
--- a/mod/riverdashboard/start.php
+++ b/mod/riverdashboard/start.php
@@ -11,7 +11,6 @@ function riverdashboard_init() {
global $CONFIG;
// Register and optionally replace the dashboard
register_page_handler('dashboard', 'riverdashboard_page_handler');
- add_menu(elgg_echo('activity'), "pg/activity/");
// Page handler
register_page_handler('activity', 'riverdashboard_page_handler');
diff --git a/mod/thewire/start.php b/mod/thewire/start.php
index 3eb172360..abb0cb019 100644
--- a/mod/thewire/start.php
+++ b/mod/thewire/start.php
@@ -20,8 +20,9 @@
function thewire_init() {
// Set up menu for logged in users
- add_menu(elgg_echo('thewire:title'), "pg/thewire");
-
+ $item = new ElggMenuItem('thewire', elgg_echo('thewire:title'), 'pg/thewire');
+ elgg_register_menu_item('site', $item);
+
// Extend system CSS with our own styles, which are defined in the thewire/css view
elgg_extend_view('css/screen', 'thewire/css');
diff --git a/views/default/admin/appearance/menu_items.php b/views/default/admin/appearance/menu_items.php
index 9bed69a06..7572d2e0c 100644
--- a/views/default/admin/appearance/menu_items.php
+++ b/views/default/admin/appearance/menu_items.php
@@ -6,18 +6,17 @@
* @subpackage Core
*/
-$menu_items = get_register('menu');
-$featured_urls = get_config('menu_items_featured_urls');
+$builder = new ElggMenuBuilder('site');
+$menu = $builder->getMenu('name');
+$menu_items = $menu['default'];
-// get an alphabetical sort of the items + urls
-foreach ($menu_items as $name => $info) {
- $menu_sorted[$info->name] = $info->value->url;
-}
-
-ksort($menu_sorted);
+$featured_menu_names = elgg_get_config('site_featured_menu_names');
-$pulldown_values = array_flip($menu_sorted);
-$pulldown_values[''] = elgg_echo('none');
+$dropdown_values = array();
+foreach ($menu_items as $item) {
+ $dropdown_values[$item->getName()] = $item->getTitle();
+}
+$dropdown_values[''] = elgg_echo('none');
echo elgg_view_title(elgg_echo('admin:menu_items'));
echo "<div class='admin_settings menuitems'><h3>".elgg_echo('admin:menu_items:configure')."</h3>";
@@ -26,15 +25,15 @@ $form_body = '';
// @todo Could probably make this number configurable
for ($i=0; $i<6; $i++) {
- if (array_key_exists($i, $featured_urls)) {
- $current_value = $featured_urls[$i]->value->url;
+ if (array_key_exists($i, $featured_menu_names)) {
+ $current_value = $featured_menu_names[$i];
} else {
$current_value = '';
}
$form_body .= elgg_view('input/pulldown', array(
- 'options_values' => $pulldown_values,
- 'internalname' => 'featured_urls[]',
+ 'options_values' => $dropdown_values,
+ 'internalname' => 'featured_menu_names[]',
'value' => $current_value
));
}
@@ -43,7 +42,7 @@ for ($i=0; $i<6; $i++) {
$form_body .= "<h3>".elgg_echo('admin:add_menu_item')."</h3>";
$form_body .= elgg_view('output/longtext', array('value' => elgg_echo("admin:add_menu_item:description")));
-$custom_items = get_config('menu_items_custom_items');
+$custom_items = elgg_get_config('site_custom_menu_items');
$name_str = elgg_echo('name');
$url_str = elgg_echo('admin:plugins:label:website');
@@ -51,14 +50,14 @@ $url_str = elgg_echo('admin:plugins:label:website');
$form_body .= '<ul class="custom_menuitems">';
if (is_array($custom_items)) {
- foreach ($custom_items as $url => $name) {
+ foreach ($custom_items as $title => $url) {
$name_input = elgg_view('input/text', array(
- 'internalname' => 'custom_item_names[]',
- 'value' => $name
+ 'internalname' => 'custom_menu_titles[]',
+ 'value' => $title
));
$url_input = elgg_view('input/text', array(
- 'internalname' => 'custom_item_urls[]',
+ 'internalname' => 'custom_menu_urls[]',
'value' => $url
));
@@ -68,11 +67,11 @@ if (is_array($custom_items)) {
$new = elgg_echo('new');
$name_input = elgg_view('input/text', array(
- 'internalname' => 'custom_item_names[]',
+ 'internalname' => 'custom_menu_titles[]',
));
$url_input = elgg_view('input/text', array(
- 'internalname' => 'custom_item_urls[]',
+ 'internalname' => 'custom_menu_urls[]',
));
$form_body .= "<li class='custom_menuitem'>$name_str: $name_input $url_str: $url_input</li>
@@ -82,6 +81,6 @@ $form_body .= elgg_view('input/submit', array('value' => elgg_echo('save')));
echo elgg_view('input/form', array(
'body' => $form_body,
- 'action' => "action/admin/menu_items"
+ 'action' => "action/admin/menu/save"
));
echo "</div>"; \ No newline at end of file
diff --git a/views/default/navigation/menu/elements/item.php b/views/default/navigation/menu/elements/item.php
new file mode 100644
index 000000000..f6959b2f4
--- /dev/null
+++ b/views/default/navigation/menu/elements/item.php
@@ -0,0 +1,10 @@
+<?php
+
+$item = $vars['item'];
+
+$class = '';
+if ($item->getSelected()) {
+ $class = 'class="selected"';
+}
+
+echo "<li $class>{$item->getLink()}</li>";
diff --git a/views/default/navigation/menu/site.php b/views/default/navigation/menu/site.php
new file mode 100644
index 000000000..c2b00fd72
--- /dev/null
+++ b/views/default/navigation/menu/site.php
@@ -0,0 +1,25 @@
+<?php
+/**
+ * Site navigation menu
+ *
+ * @uses $vars['menu']['default']
+ * @uses $vars['menu']['more']
+ */
+
+echo '<ul class="elgg-site-menu">';
+foreach ($vars['menu']['default'] as $menu_item) {
+ echo elgg_view('navigation/menu/elements/item', array('item' => $menu_item));
+}
+
+if (isset($vars['menu']['more'])) {
+ $more = elgg_echo('more');
+ echo '<li class="elgg-more">';
+ echo "<a class='subnav' title=\"$more\"><span class=\"elgg-icon elgg-icon-arrow-s\"></span>$more</a>";
+ echo '<ul>';
+ foreach ($vars['menu']['more'] as $menu_item) {
+ echo elgg_view('navigation/menu/elements/item', array('item' => $menu_item));
+ }
+ echo '</ul>';
+ echo '</li>';
+}
+echo '</ul>';
diff --git a/views/default/navigation/site_nav.php b/views/default/navigation/site_nav.php
deleted file mode 100644
index aaf596b93..000000000
--- a/views/default/navigation/site_nav.php
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-/**
- * Site-wide navigation
- *
- */
-
-$nav_items = elgg_get_nav_items();
-$featured = $nav_items['featured'];
-$more = $nav_items['more'];
-
-$nav_html = '';
-$more_nav_html = '';
-$context = elgg_get_context();
-
-// sort more links alphabetically
-$more_sorted = array();
-foreach ($more as $info) {
- $more_sorted[] = $info->name;
-}
-
-// required because array multisort is case sensitive
-$more_sorted_lower = array_map('elgg_strtolower', $more_sorted);
-array_multisort($more_sorted_lower, $more);
-
-$item_count = 0;
-
-// if there are no featured items, display the standard tools in alphabetical order
-if ($featured) {
- foreach ($featured as $info) {
- $selected = ($info->value->context == $context) ? 'class="selected"' : '';
- $title = htmlentities($info->name, ENT_QUOTES, 'UTF-8');
- $url = htmlentities($info->value->url, ENT_QUOTES, 'UTF-8');
-
- $nav_html .= "<li $selected><a href=\"$url\" title=\"$title\"><span>$title</span></a></li>";
- }
-} elseif ($more) {
- for ($i=0; $i<5; $i++) {
- if (!array_key_exists($i, $more)) {
- break;
- }
- $info = $more[$i];
-
- $selected = ($info->value->context == $context) ? 'class="selected"' : '';
- $title = htmlentities($info->name, ENT_QUOTES, 'UTF-8');
- $url = htmlentities($info->value->url, ENT_QUOTES, 'UTF-8');
-
- $nav_html .= "<li $selected><a href=\"$url\" title=\"$title\">$title</a></li>";
- $more[$i]->used = TRUE;
- $item_count++;
- }
-}
-
-// display the rest.
-foreach ($more as $info) {
- if ($info->used) {
- continue;
- }
- $selected = ($info->value->context == $context) ? 'class="selected"' : '';
- $title = htmlentities($info->name, ENT_QUOTES, 'UTF-8');
- $url = htmlentities($info->value->url, ENT_QUOTES, 'UTF-8');
-
- $more_nav_html .= "<li $selected><a href=\"$url\" title=\"$title\">$title</a></li>\n";
- $item_count++;
-}
-
-if ($more_nav_html) {
- $more = elgg_echo('more');
- $nav_html .= "<li class='elgg-more'><a class='subnav' title=\"$more\"><span class=\"elgg-icon elgg-icon-arrow-s\"></span>$more</a>
- <ul>
- $more_nav_html
- </ul>
- </li>";
-}
-
-// only display, if there are nav items to display
-if ($nav_html) {
- echo <<<___END
- <ul class="elgg-site-menu">
- $nav_html
- </ul>
-___END;
-}
-
diff --git a/views/default/page/elements/header.php b/views/default/page/elements/header.php
index 0cedd33e2..125d80bfa 100644
--- a/views/default/page/elements/header.php
+++ b/views/default/page/elements/header.php
@@ -15,7 +15,7 @@
echo elgg_view('core/account/login_dropdown');
// insert site-wide navigation
- echo elgg_view('navigation/site_nav');
+ echo elgg_view_menu('site');
// insert a view which can be extended
echo elgg_view('header/extend');