From: cash Date: Sat, 18 Dec 2010 16:37:16 +0000 (+0000) Subject: site nav menu now uses new menu code (and finished the implementation of custom menu... X-Git-Url: https://gitweb.fluxo.info/?a=commitdiff_plain;h=8ec093ecc1bf28c09f5d2dbe3c7bc8e6a2485ac6;p=lorea%2Felgg.git site nav menu now uses new menu code (and finished the implementation of custom menu items while I was at it - not backward compatible with the previous half finished version) git-svn-id: http://code.elgg.org/elgg/trunk@7668 36083f99-b078-4883-b0ff-0f9b5a30f544 --- 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 @@ + $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 ""; \ 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 @@ +getSelected()) { + $class = 'class="selected"'; +} + +echo "
  • {$item->getLink()}
  • "; 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 @@ +'; +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 '
  • '; + echo "$more"; + echo ''; + echo '
  • '; +} +echo ''; 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 @@ -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 .= "
  • $title
  • "; - } -} 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 .= "
  • $title
  • "; - $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 .= "
  • $title
  • \n"; - $item_count++; -} - -if ($more_nav_html) { - $more = elgg_echo('more'); - $nav_html .= "
  • $more - -
  • "; -} - -// only display, if there are nav items to display -if ($nav_html) { - echo <<<___END - -___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');