aboutsummaryrefslogtreecommitdiff
path: root/engine/lib
diff options
context:
space:
mode:
authorcash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>2010-10-30 20:30:16 +0000
committercash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>2010-10-30 20:30:16 +0000
commitc3f0a32b2bc8d055bfce97e20079cb7840746cd5 (patch)
treefd21eb16c1b1549d543082c77111d1c48cf0f098 /engine/lib
parent37d8b3e053d86fb5f213ab6fe38940e3c0a243d4 (diff)
downloadelgg-c3f0a32b2bc8d055bfce97e20079cb7840746cd5.tar.gz
elgg-c3f0a32b2bc8d055bfce97e20079cb7840746cd5.tar.bz2
pulled navigation functions out of elgglib.php
git-svn-id: http://code.elgg.org/elgg/trunk@7136 36083f99-b078-4883-b0ff-0f9b5a30f544
Diffstat (limited to 'engine/lib')
-rw-r--r--engine/lib/elgglib.php554
-rw-r--r--engine/lib/navigation.php502
2 files changed, 532 insertions, 524 deletions
diff --git a/engine/lib/elgglib.php b/engine/lib/elgglib.php
index 2f9acf060..ff7886561 100644
--- a/engine/lib/elgglib.php
+++ b/engine/lib/elgglib.php
@@ -141,326 +141,6 @@ function current_page_url() {
}
/**
- * Deprecated by elgg_add_submenu_item()
- *
- * @see elgg_add_submenu_item()
- * @deprecated 1.8
- *
- * @param string $label The label
- * @param string $link The link
- * @param string $group The group to store item in
- * @param boolean $onclick Add a confirmation when clicked?
- * @param boolean $selected Is menu item selected
- *
- * @return bool
- */
-function add_submenu_item($label, $link, $group = 'default', $onclick = false, $selected = NULL) {
- elgg_deprecated_notice('add_submenu_item was deprecated by elgg_add_submenu_item', 1.8);
-
- $item = array(
- 'text' => $label,
- 'href' => $link,
- 'selected' => $selected
- );
-
- if (!$group) {
- $group = 'default';
- }
-
- if ($onclick) {
- $js = "onclick=\"javascript:return confirm('" . elgg_echo('deleteconfirm') . "')\"";
- $item['vars'] = array('js' => $js);
- }
- // submenu items were added in the page setup hook usually by checking
- // the context. We'll pass in the current context here, which will
- // emulate that effect.
- // if context == 'main' (default) it probably means they always wanted
- // the menu item to show up everywhere.
- $context = get_context();
-
- if ($context == 'main') {
- $context = 'all';
- }
- return elgg_add_submenu_item($item, $context, $group);
-}
-
-/**
- * Add an entry to the submenu.
- *
- * @param array $item The item as:
- * <code>
- * array(
- * 'title' => 'Text to display',
- * 'url' => 'URL of the link',
- * 'id' => 'entry_unique_id' //used by children items to identify parents
- * 'parent_id' => 'id_of_parent',
- * 'selected' => BOOL // Is this item selected? (If NULL or unset will attempt to guess)
- * 'vars' => array() // Array of vars to pass to the navigation/submenu_item view
- * )
- * </code>
- *
- * @param string $context Context in which to display this menu item. 'all'
- * will make it show up all the time. Use sparingly.
- * @param string $group Group for the item. Each submenu group has its own <ul>
- *
- * @return BOOL
- * @since 1.8
- * @see elgg_prepare_submenu
- */
-function elgg_add_submenu_item(array $item, $context = 'all', $group = 'default') {
- global $CONFIG;
-
- if (!isset($CONFIG->submenu_items)) {
- $CONFIG->submenu_items = array();
- }
-
- if (!isset($CONFIG->submenu_items[$context])) {
- $CONFIG->submenu_items[$context] = array();
- }
-
- if (!isset($CONFIG->submenu_items[$context][$group])) {
- $CONFIG->submenu_items[$context][$group] = array();
- }
-
- if (!isset($item['text'])) {
- return FALSE;
- }
-
- // we use persistent object properties in the submenu
- // setup function, so normalize the array to an object.
- // we pass it in as an array because this would be the only
- // place in elgg that we ask for an object like this.
- // consistency ftw.
- $item_obj = new StdClass();
-
- foreach ($item as $k => $v) {
- switch ($k) {
- case 'parent_id':
- case 'id':
- // make sure '' and false make sense
- $v = (empty($v)) ? NULL : $v;
-
- default:
- $item_obj->$k = $v;
- break;
- }
- }
-
- $CONFIG->submenu_items[$context][$group][] = $item_obj;
-
- return TRUE;
-}
-
-/**
- * Properly nest all submenu entries for contexts $context and 'all'
- *
- * @param string $context Context for menus
- * @param bool $sort Sort the menu items alphabetically
- *
- * @since 1.8
- * @see elgg_add_submenu_item
- *
- * @return true
- */
-function elgg_prepare_submenu($context = 'main', $sort = FALSE) {
- global $CONFIG;
-
- if (!isset($CONFIG->submenu_items) || !($CONFIG->submenu_items)) {
- return FALSE;
- }
-
- $groups = array();
-
- if (isset($CONFIG->submenu_items['all'])) {
- $groups = $CONFIG->submenu_items['all'];
- }
-
- if (isset($CONFIG->submenu_items[$context])) {
- $groups = array_merge_recursive($groups, $CONFIG->submenu_items[$context]);
- }
-
- if (!$groups) {
- return FALSE;
- }
-
- foreach ($groups as $group => $items) {
- if ($sort) {
- usort($items, 'elgg_submenu_item_cmp');
- }
-
- $parsed_menu = array();
- // determin which children need to go in this item.
- foreach ($items as $i => $item) {
- // can only support children if there's an id
- if (isset($item->id)) {
- foreach ($items as $child_i => $child_item) {
- // don't check ourselves or used children.
- if ($child_i == $i || $child_item->used == TRUE) {
- continue;
- }
-
- if (isset($child_item->parent_id) && $child_item->parent_id == $item->id) {
- if (!isset($item->children)) {
- $item->children = array();
- }
- $item->children[] = $child_item;
- $child_item->parent = $item;
- // don't unset because we still need to check this item for children
- $child_item->used = TRUE;
- }
- }
-
- // if the parent doesn't have a url, make it the first child item.
- if (isset($item->children) && $item->children && !$item->href) {
- $child = $item->children[0];
- while ($child && !isset($child->href)) {
- if (isset($child->children) && isset($child->children[0])) {
- $child = $child->children[0];
- } else {
- $child = NULL;
- }
- }
-
- if ($child && isset($child->href)) {
- $item->href = $child->href;
- } else {
- // @todo There are no URLs anywhere in this tree.
- $item->href = $CONFIG->url;
- }
- }
- }
-
- // only add top-level elements to the menu.
- // the rest are children.
- if (!isset($item->parent_id)) {
- $parsed_menu[] = $item;
- }
- }
-
- $CONFIG->submenu[$context][$group] = $parsed_menu;
- }
-
- return TRUE;
-}
-
-/**
- * Helper function used to sort submenu items by their display text.
- *
- * @param object $a First object
- * @param object $b Second object
- *
- * @return int
- * @since 1.8
- * @see elgg_prepare_submenu
- */
-function elgg_submenu_item_cmp($a, $b) {
- $a = $a->text;
- $b = $b->text;
-
- return strnatcmp($a, $b);
-}
-
-/**
- * Use elgg_get_submenu().
- *
- * @see elgg_get_submenu()
- * @deprecated 1.8
- *
- * @return string
- */
-function get_submenu() {
- elgg_deprecated_notice("get_submenu() has been deprecated by elgg_get_submenu()", 1.8);
- return elgg_get_submenu();
-}
-
-/**
- * Return the HTML for a sidemenu.
- *
- * @param string $context The context of the submenu (defaults to main)
- * @param BOOL $sort Sort by display name?
- *
- * @return string Formatted HTML.
- * @since 1.8
- * @todo Rename to a view function. See {@trac #2320}.
- */
-function elgg_get_submenu($context = NULL, $sort = FALSE) {
- global $CONFIG;
-
- if (!$context) {
- $context = get_context();
- }
-
- if (!elgg_prepare_submenu($context, $sort)) {
- return '';
- }
-
- $groups = $CONFIG->submenu[$context];
- $submenu_html = '';
-
- foreach ($groups as $group => $items) {
- // how far down we are in children arrays
- $depth = 0;
- // push and pop parent items
- $temp_items = array();
-
- while ($item = current($items)) {
- // ignore parents created by a child but parent never defined properly
- if (!isset($item->text) || !($item->text)) {
- next($items);
- continue;
- }
-
- // try to guess if this should be selected if they don't specify
- if ((!isset($item->selected) || $item->selected === NULL) && isset($item->href)) {
- $item->selected = elgg_http_url_is_identical(full_url(), $item->href);
- }
-
- // traverse up the parent tree if matached to mark all parents as selected/expanded.
- if ($item->selected && isset($item->parent)) {
- $parent = $item->parent;
- while ($parent) {
- $parent->selected = TRUE;
- if (isset($parent->parent)) {
- $parent = $parent->parent;
- } else {
- $parent = NULL;
- }
- }
- }
-
- // get the next item
- if (isset($item->children) && $item->children) {
- $depth++;
- array_push($temp_items, $items);
- $items = $item->children;
- } elseif ($depth > 0) {
- // check if there are more children elements in the current items
- // pop back up to the parent(s) if not
- if ($item = next($items)) {
- continue;
- } else {
- while ($depth > 0) {
- $depth--;
- $items = array_pop($temp_items);
- if ($item = next($items)) {
- break;
- }
- }
- }
- } else {
- next($items);
- }
- }
-
- $vars = array('group' => $group, 'items' => $items);
- $submenu_html .= elgg_view('navigation/submenu_group', $vars);
- }
-
- // include the JS for the expand menus too
- return elgg_view('navigation/submenu_js') . $submenu_html;
-}
-
-/**
* Returns the HTML for "likes" and "like this" on entities.
*
* @param ElggEntity $entity The entity to like
@@ -713,64 +393,6 @@ function get_register($register_name) {
}
/**
- * Adds an item to the site-wide menu.
- *
- * You can obtain the menu array by calling {@link get_register('menu')}
- *
- * @param string $menu_name The name of the menu item
- * @param string $menu_url The URL of the page
- * @param array $menu_children Optionally, an array of submenu items (not currently used)
- * @param string $context The context of the menu
- *
- * @return true|false Depending on success
- * @todo Can be deprecated when the new menu system is introduced.
- */
-function add_menu($menu_name, $menu_url, $menu_children = array(), $context = "") {
- global $CONFIG;
-
- if (!isset($CONFIG->menucontexts)) {
- $CONFIG->menucontexts = array();
- }
-
- if (empty($context)) {
- $context = get_plugin_name();
- }
-
- $value = new stdClass();
- $value->url = $menu_url;
- $value->context = $context;
-
- $CONFIG->menucontexts[] = $context;
- return add_to_register('menu', $menu_name, $value, $menu_children);
-}
-
-/**
- * Removes an item from the menu register
- *
- * @param string $menu_name The name of the menu item
- *
- * @return true|false Depending on success
- */
-function remove_menu($menu_name) {
- return remove_from_register('menu', $menu_name);
-}
-
-/**
- * Returns a menu item for use in the children section of add_menu()
- * This is not currently used in the Elgg core.
- *
- * @param string $menu_name The name of the menu item
- * @param string $menu_url Its URL
- *
- * @return stdClass|false Depending on success
- * @todo Can be deprecated when the new menu system is introduced.
- */
-function menu_item($menu_name, $menu_url) {
- elgg_deprecated_notice('menu_item() is deprecated by add_submenu_item', 1.7);
- return make_register_object($menu_name, $menu_url);
-}
-
-/**
* Queues a message to be displayed.
*
* Messages will not be displayed immediately, but are stored in
@@ -1697,6 +1319,36 @@ function ini_get_bool($ini_get_arg) {
}
/**
+ * Returns a PHP INI setting in bytes.
+ *
+ * @tip Use this for arithmetic when determining if a file can be uploaded.
+ *
+ * @param str $setting The php.ini setting
+ *
+ * @return int
+ * @since 1.7.0
+ * @link http://www.php.net/manual/en/function.ini-get.php
+ */
+function elgg_get_ini_setting_in_bytes($setting) {
+ // retrieve INI setting
+ $val = ini_get($setting);
+
+ // convert INI setting when shorthand notation is used
+ $last = strtolower($val[strlen($val) - 1]);
+ switch($last) {
+ case 'g':
+ $val *= 1024;
+ case 'm':
+ $val *= 1024;
+ case 'k':
+ $val *= 1024;
+ }
+
+ // return byte value
+ return $val;
+}
+
+/**
* Returns true is string is not empty, false, or null.
*
* Function to be used in array_filter which returns true if $string is not null.
@@ -1937,54 +1589,6 @@ function elgg_http_add_url_query_elements($url, array $elements) {
}
/**
- * Adds a breadcrumb to the breadcrumbs stack.
- *
- * @param string $title The title to display
- * @param string $link Optional. The link for the title.
- *
- * @return void
- *
- * @link http://docs.elgg.org/Tutorials/UI/Breadcrumbs
- */
-function elgg_push_breadcrumb($title, $link = NULL) {
- global $CONFIG;
- if (!is_array($CONFIG->breadcrumbs)) {
- $CONFIG->breadcrumbs = array();
- }
-
- // avoid key collisions.
- $CONFIG->breadcrumbs[] = array('title' => $title, 'link' => $link);
-}
-
-/**
- * Removes last breadcrumb entry.
- *
- * @return array popped item.
- * @link http://docs.elgg.org/Tutorials/UI/Breadcrumbs
- */
-function elgg_pop_breadcrumb() {
- global $CONFIG;
-
- if (is_array($CONFIG->breadcrumbs)) {
- array_pop($CONFIG->breadcrumbs);
- }
-
- return FALSE;
-}
-
-/**
- * Returns all breadcrumbs as an array of array('title' => 'Readable Title', 'link' => 'URL')
- *
- * @return array Breadcrumbs
- * @link http://docs.elgg.org/Tutorials/UI/Breadcrumbs
- */
-function elgg_get_breadcrumbs() {
- global $CONFIG;
-
- return (is_array($CONFIG->breadcrumbs)) ? $CONFIG->breadcrumbs : array();
-}
-
-/**
* Load all the REQUEST variables into the sticky form cache
*
* Call this from an action when you want all your submitted variables
@@ -2111,36 +1715,6 @@ function elgg_set_active_sticky_form($form_name) {
}
/**
- * Returns a PHP INI setting in bytes.
- *
- * @tip Use this for arithmetic when determining if a file can be uploaded.
- *
- * @param str $setting The php.ini setting
- *
- * @return int
- * @since 1.7.0
- * @link http://www.php.net/manual/en/function.ini-get.php
- */
-function elgg_get_ini_setting_in_bytes($setting) {
- // retrieve INI setting
- $val = ini_get($setting);
-
- // convert INI setting when shorthand notation is used
- $last = strtolower($val[strlen($val) - 1]);
- switch($last) {
- case 'g':
- $val *= 1024;
- case 'm':
- $val *= 1024;
- case 'k':
- $val *= 1024;
- }
-
- // return byte value
- return $val;
-}
-
-/**
* Serve javascript pages.
*
* Searches for views under js/ and outputs them with special
@@ -2258,74 +1832,6 @@ function elgg_api_test($hook, $type, $value, $params) {
}
/**
- * Returns the main site menu.
- *
- * @note The main site menu is split into "featured" links and
- * "more" links.
- *
- * @return array ('featured_urls' and 'more')
- * @since 1.8
- * @link http://docs.elgg.org/Tutorials/UI/SiteMenu
- */
-function elgg_get_nav_items() {
- $menu_items = get_register('menu');
- $featured_urls_info = get_config('menu_items_featured_urls');
-
- $more = array();
- $featured_urls = array();
- $featured_urls_sanitised = array();
-
- // easier to compare with in_array() than embedded foreach()es
- $valid_urls = array();
- foreach ($menu_items as $info) {
- $valid_urls[] = $info->value->url;
- }
-
- // make sure the url is a valid link.
- // this prevents disabled plugins leaving behind
- // valid links when not using a pagehandler.
- if ($featured_urls_info) {
- foreach ($featured_urls_info as $info) {
- if (in_array($info->value->url, $valid_urls)) {
- $featured_urls[] = $info->value->url;
- $featured_urls_sanitised[] = $info;
- }
- }
- }
-
- // add toolbar entries if not hiding dupes.
- foreach ($menu_items as $name => $info) {
- if (!in_array($info->value->url, $featured_urls)) {
- $more[] = $info;
- }
- }
-
- return array(
- 'featured' => $featured_urls_sanitised,
- 'more' => $more
- );
-}
-
-/**
- * Registers any custom menu items with the main Site Menu.
- *
- * @note Custom menu items are added through the admin interface. Plugins
- * can add standard menu items by using {@link add_menu()}.
- *
- * @since 1.8
- * @link http://docs.elgg.org/Tutorials/UI/SiteMenu
- * @elgg_event_handler init system
- * @return void
- */
-function add_custom_menu_items() {
- if ($custom_items = get_config('menu_items_custom_items')) {
- foreach ($custom_items as $url => $name) {
- add_menu($name, $url);
- }
- }
-}
-
-/**
* Test if two URLs are functionally identical.
*
* @tip If $ignore_params is used, neither the name nor its value will be considered when comparing.
diff --git a/engine/lib/navigation.php b/engine/lib/navigation.php
new file mode 100644
index 000000000..a5b087bd8
--- /dev/null
+++ b/engine/lib/navigation.php
@@ -0,0 +1,502 @@
+<?php
+/**
+ * Elgg navigation library
+ * Functions for managing menus and other navigational elements
+ *
+ * @package Elgg.Core
+ * @subpackage Navigation
+ */
+
+/**
+ * Deprecated by elgg_add_submenu_item()
+ *
+ * @see elgg_add_submenu_item()
+ * @deprecated 1.8
+ *
+ * @param string $label The label
+ * @param string $link The link
+ * @param string $group The group to store item in
+ * @param boolean $onclick Add a confirmation when clicked?
+ * @param boolean $selected Is menu item selected
+ *
+ * @return bool
+ */
+function add_submenu_item($label, $link, $group = 'default', $onclick = false, $selected = NULL) {
+ elgg_deprecated_notice('add_submenu_item was deprecated by elgg_add_submenu_item', 1.8);
+
+ $item = array(
+ 'text' => $label,
+ 'href' => $link,
+ 'selected' => $selected
+ );
+
+ if (!$group) {
+ $group = 'default';
+ }
+
+ if ($onclick) {
+ $js = "onclick=\"javascript:return confirm('" . elgg_echo('deleteconfirm') . "')\"";
+ $item['vars'] = array('js' => $js);
+ }
+ // submenu items were added in the page setup hook usually by checking
+ // the context. We'll pass in the current context here, which will
+ // emulate that effect.
+ // if context == 'main' (default) it probably means they always wanted
+ // the menu item to show up everywhere.
+ $context = get_context();
+
+ if ($context == 'main') {
+ $context = 'all';
+ }
+ return elgg_add_submenu_item($item, $context, $group);
+}
+
+/**
+ * Add an entry to the submenu.
+ *
+ * @param array $item The item as:
+ * <code>
+ * array(
+ * 'title' => 'Text to display',
+ * 'url' => 'URL of the link',
+ * 'id' => 'entry_unique_id' //used by children items to identify parents
+ * 'parent_id' => 'id_of_parent',
+ * 'selected' => BOOL // Is this item selected? (If NULL or unset will attempt to guess)
+ * 'vars' => array() // Array of vars to pass to the navigation/submenu_item view
+ * )
+ * </code>
+ *
+ * @param string $context Context in which to display this menu item. 'all'
+ * will make it show up all the time. Use sparingly.
+ * @param string $group Group for the item. Each submenu group has its own <ul>
+ *
+ * @return BOOL
+ * @since 1.8
+ * @see elgg_prepare_submenu
+ */
+function elgg_add_submenu_item(array $item, $context = 'all', $group = 'default') {
+ global $CONFIG;
+
+ if (!isset($CONFIG->submenu_items)) {
+ $CONFIG->submenu_items = array();
+ }
+
+ if (!isset($CONFIG->submenu_items[$context])) {
+ $CONFIG->submenu_items[$context] = array();
+ }
+
+ if (!isset($CONFIG->submenu_items[$context][$group])) {
+ $CONFIG->submenu_items[$context][$group] = array();
+ }
+
+ if (!isset($item['text'])) {
+ return FALSE;
+ }
+
+ // we use persistent object properties in the submenu
+ // setup function, so normalize the array to an object.
+ // we pass it in as an array because this would be the only
+ // place in elgg that we ask for an object like this.
+ // consistency ftw.
+ $item_obj = new StdClass();
+
+ foreach ($item as $k => $v) {
+ switch ($k) {
+ case 'parent_id':
+ case 'id':
+ // make sure '' and false make sense
+ $v = (empty($v)) ? NULL : $v;
+
+ default:
+ $item_obj->$k = $v;
+ break;
+ }
+ }
+
+ $CONFIG->submenu_items[$context][$group][] = $item_obj;
+
+ return TRUE;
+}
+
+/**
+ * Properly nest all submenu entries for contexts $context and 'all'
+ *
+ * @param string $context Context for menus
+ * @param bool $sort Sort the menu items alphabetically
+ *
+ * @since 1.8
+ * @see elgg_add_submenu_item
+ *
+ * @return true
+ */
+function elgg_prepare_submenu($context = 'main', $sort = FALSE) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->submenu_items) || !($CONFIG->submenu_items)) {
+ return FALSE;
+ }
+
+ $groups = array();
+
+ if (isset($CONFIG->submenu_items['all'])) {
+ $groups = $CONFIG->submenu_items['all'];
+ }
+
+ if (isset($CONFIG->submenu_items[$context])) {
+ $groups = array_merge_recursive($groups, $CONFIG->submenu_items[$context]);
+ }
+
+ if (!$groups) {
+ return FALSE;
+ }
+
+ foreach ($groups as $group => $items) {
+ if ($sort) {
+ usort($items, 'elgg_submenu_item_cmp');
+ }
+
+ $parsed_menu = array();
+ // determin which children need to go in this item.
+ foreach ($items as $i => $item) {
+ // can only support children if there's an id
+ if (isset($item->id)) {
+ foreach ($items as $child_i => $child_item) {
+ // don't check ourselves or used children.
+ if ($child_i == $i || $child_item->used == TRUE) {
+ continue;
+ }
+
+ if (isset($child_item->parent_id) && $child_item->parent_id == $item->id) {
+ if (!isset($item->children)) {
+ $item->children = array();
+ }
+ $item->children[] = $child_item;
+ $child_item->parent = $item;
+ // don't unset because we still need to check this item for children
+ $child_item->used = TRUE;
+ }
+ }
+
+ // if the parent doesn't have a url, make it the first child item.
+ if (isset($item->children) && $item->children && !$item->href) {
+ $child = $item->children[0];
+ while ($child && !isset($child->href)) {
+ if (isset($child->children) && isset($child->children[0])) {
+ $child = $child->children[0];
+ } else {
+ $child = NULL;
+ }
+ }
+
+ if ($child && isset($child->href)) {
+ $item->href = $child->href;
+ } else {
+ // @todo There are no URLs anywhere in this tree.
+ $item->href = $CONFIG->url;
+ }
+ }
+ }
+
+ // only add top-level elements to the menu.
+ // the rest are children.
+ if (!isset($item->parent_id)) {
+ $parsed_menu[] = $item;
+ }
+ }
+
+ $CONFIG->submenu[$context][$group] = $parsed_menu;
+ }
+
+ return TRUE;
+}
+
+/**
+ * Helper function used to sort submenu items by their display text.
+ *
+ * @param object $a First object
+ * @param object $b Second object
+ *
+ * @return int
+ * @since 1.8
+ * @see elgg_prepare_submenu
+ */
+function elgg_submenu_item_cmp($a, $b) {
+ $a = $a->text;
+ $b = $b->text;
+
+ return strnatcmp($a, $b);
+}
+
+/**
+ * Use elgg_get_submenu().
+ *
+ * @see elgg_get_submenu()
+ * @deprecated 1.8
+ *
+ * @return string
+ */
+function get_submenu() {
+ elgg_deprecated_notice("get_submenu() has been deprecated by elgg_get_submenu()", 1.8);
+ return elgg_get_submenu();
+}
+
+/**
+ * Return the HTML for a sidemenu.
+ *
+ * @param string $context The context of the submenu (defaults to main)
+ * @param BOOL $sort Sort by display name?
+ *
+ * @return string Formatted HTML.
+ * @since 1.8
+ * @todo Rename to a view function. See {@trac #2320}.
+ */
+function elgg_get_submenu($context = NULL, $sort = FALSE) {
+ global $CONFIG;
+
+ if (!$context) {
+ $context = get_context();
+ }
+
+ if (!elgg_prepare_submenu($context, $sort)) {
+ return '';
+ }
+
+ $groups = $CONFIG->submenu[$context];
+ $submenu_html = '';
+
+ foreach ($groups as $group => $items) {
+ // how far down we are in children arrays
+ $depth = 0;
+ // push and pop parent items
+ $temp_items = array();
+
+ while ($item = current($items)) {
+ // ignore parents created by a child but parent never defined properly
+ if (!isset($item->text) || !($item->text)) {
+ next($items);
+ continue;
+ }
+
+ // try to guess if this should be selected if they don't specify
+ if ((!isset($item->selected) || $item->selected === NULL) && isset($item->href)) {
+ $item->selected = elgg_http_url_is_identical(full_url(), $item->href);
+ }
+
+ // traverse up the parent tree if matached to mark all parents as selected/expanded.
+ if ($item->selected && isset($item->parent)) {
+ $parent = $item->parent;
+ while ($parent) {
+ $parent->selected = TRUE;
+ if (isset($parent->parent)) {
+ $parent = $parent->parent;
+ } else {
+ $parent = NULL;
+ }
+ }
+ }
+
+ // get the next item
+ if (isset($item->children) && $item->children) {
+ $depth++;
+ array_push($temp_items, $items);
+ $items = $item->children;
+ } elseif ($depth > 0) {
+ // check if there are more children elements in the current items
+ // pop back up to the parent(s) if not
+ if ($item = next($items)) {
+ continue;
+ } else {
+ while ($depth > 0) {
+ $depth--;
+ $items = array_pop($temp_items);
+ if ($item = next($items)) {
+ break;
+ }
+ }
+ }
+ } else {
+ next($items);
+ }
+ }
+
+ $vars = array('group' => $group, 'items' => $items);
+ $submenu_html .= elgg_view('navigation/submenu_group', $vars);
+ }
+
+ // include the JS for the expand menus too
+ return elgg_view('navigation/submenu_js') . $submenu_html;
+}
+
+/**
+ * Registers any custom menu items with the main Site Menu.
+ *
+ * @note Custom menu items are added through the admin interface. Plugins
+ * can add standard menu items by using {@link add_menu()}.
+ *
+ * @since 1.8
+ * @link http://docs.elgg.org/Tutorials/UI/SiteMenu
+ * @elgg_event_handler init system
+ * @return void
+ */
+function add_custom_menu_items() {
+ if ($custom_items = get_config('menu_items_custom_items')) {
+ foreach ($custom_items as $url => $name) {
+ add_menu($name, $url);
+ }
+ }
+}
+
+/**
+ * Returns the main site menu.
+ *
+ * @note The main site menu is split into "featured" links and
+ * "more" links.
+ *
+ * @return array ('featured_urls' and 'more')
+ * @since 1.8
+ * @link http://docs.elgg.org/Tutorials/UI/SiteMenu
+ */
+function elgg_get_nav_items() {
+ $menu_items = get_register('menu');
+ $featured_urls_info = get_config('menu_items_featured_urls');
+
+ $more = array();
+ $featured_urls = array();
+ $featured_urls_sanitised = array();
+
+ // easier to compare with in_array() than embedded foreach()es
+ $valid_urls = array();
+ foreach ($menu_items as $info) {
+ $valid_urls[] = $info->value->url;
+ }
+
+ // make sure the url is a valid link.
+ // this prevents disabled plugins leaving behind
+ // valid links when not using a pagehandler.
+ if ($featured_urls_info) {
+ foreach ($featured_urls_info as $info) {
+ if (in_array($info->value->url, $valid_urls)) {
+ $featured_urls[] = $info->value->url;
+ $featured_urls_sanitised[] = $info;
+ }
+ }
+ }
+
+ // add toolbar entries if not hiding dupes.
+ foreach ($menu_items as $name => $info) {
+ if (!in_array($info->value->url, $featured_urls)) {
+ $more[] = $info;
+ }
+ }
+
+ return array(
+ 'featured' => $featured_urls_sanitised,
+ 'more' => $more
+ );
+}
+
+/**
+ * Adds an item to the site-wide menu.
+ *
+ * You can obtain the menu array by calling {@link get_register('menu')}
+ *
+ * @param string $menu_name The name of the menu item
+ * @param string $menu_url The URL of the page
+ * @param array $menu_children Optionally, an array of submenu items (not currently used)
+ * @param string $context The context of the menu
+ *
+ * @return true|false Depending on success
+ * @todo Can be deprecated when the new menu system is introduced.
+ */
+function add_menu($menu_name, $menu_url, $menu_children = array(), $context = "") {
+ global $CONFIG;
+
+ if (!isset($CONFIG->menucontexts)) {
+ $CONFIG->menucontexts = array();
+ }
+
+ if (empty($context)) {
+ $context = get_plugin_name();
+ }
+
+ $value = new stdClass();
+ $value->url = $menu_url;
+ $value->context = $context;
+
+ $CONFIG->menucontexts[] = $context;
+ return add_to_register('menu', $menu_name, $value, $menu_children);
+}
+
+/**
+ * Removes an item from the menu register
+ *
+ * @param string $menu_name The name of the menu item
+ *
+ * @return true|false Depending on success
+ */
+function remove_menu($menu_name) {
+ return remove_from_register('menu', $menu_name);
+}
+
+/**
+ * Returns a menu item for use in the children section of add_menu()
+ * This is not currently used in the Elgg core.
+ *
+ * @param string $menu_name The name of the menu item
+ * @param string $menu_url Its URL
+ *
+ * @return stdClass|false Depending on success
+ * @todo Can be deprecated when the new menu system is introduced.
+ */
+function menu_item($menu_name, $menu_url) {
+ elgg_deprecated_notice('menu_item() is deprecated by add_submenu_item', 1.7);
+ return make_register_object($menu_name, $menu_url);
+}
+
+/**
+ * Adds a breadcrumb to the breadcrumbs stack.
+ *
+ * @param string $title The title to display
+ * @param string $link Optional. The link for the title.
+ *
+ * @return void
+ *
+ * @link http://docs.elgg.org/Tutorials/UI/Breadcrumbs
+ */
+function elgg_push_breadcrumb($title, $link = NULL) {
+ global $CONFIG;
+ if (!is_array($CONFIG->breadcrumbs)) {
+ $CONFIG->breadcrumbs = array();
+ }
+
+ // avoid key collisions.
+ $CONFIG->breadcrumbs[] = array('title' => $title, 'link' => $link);
+}
+
+/**
+ * Removes last breadcrumb entry.
+ *
+ * @return array popped item.
+ * @link http://docs.elgg.org/Tutorials/UI/Breadcrumbs
+ */
+function elgg_pop_breadcrumb() {
+ global $CONFIG;
+
+ if (is_array($CONFIG->breadcrumbs)) {
+ array_pop($CONFIG->breadcrumbs);
+ }
+
+ return FALSE;
+}
+
+/**
+ * Returns all breadcrumbs as an array of array('title' => 'Readable Title', 'link' => 'URL')
+ *
+ * @return array Breadcrumbs
+ * @link http://docs.elgg.org/Tutorials/UI/Breadcrumbs
+ */
+function elgg_get_breadcrumbs() {
+ global $CONFIG;
+
+ return (is_array($CONFIG->breadcrumbs)) ? $CONFIG->breadcrumbs : array();
+}