aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engine/lib/elgglib.php759
1 files changed, 540 insertions, 219 deletions
diff --git a/engine/lib/elgglib.php b/engine/lib/elgglib.php
index d4aa37a53..47d05327e 100644
--- a/engine/lib/elgglib.php
+++ b/engine/lib/elgglib.php
@@ -1,25 +1,22 @@
<?php
/**
- * Elgg library
- * Contains important functionality core to Elgg
+ * Bootstrapping and helper procedural code available for use in Elgg core and plugins.
*
- * @package Elgg
- * @subpackage Core
- * @author Curverider Ltd
- * @link http://elgg.org/
- */
-
-/**
- * Getting directories and moving the browser
+ *
+ * @package Elgg.Core
+ * @todo These functions can't be subpackaged because they cover a wide mix of
+ * puposes and subsystems. Many of them should be moved to more relevant files.
*/
/**
- * Forwards the browser.
- * Returns false if headers have already been sent and the browser cannot be moved.
+ * Forward to $location.
+ *
+ * Sends a 'Location: $location' header and exists. If headers have already been sent, returns FALSE.
*
- * @param string $location URL to forward to browser to. Can be relative path.
- * @return nothing|false
- */function forward($location = "") {
+ * @param string $location URL to forward to browser to. Can be path relative to the network's URL.
+ * @return False False if headers have been sent. Terminates execution if forwarding.
+ */
+function forward($location = "") {
global $CONFIG;
if (!headers_sent()) {
@@ -27,14 +24,15 @@
$location = $_SERVER['HTTP_REFERER'];
}
- $current_page = current_page_url();
if ((substr_count($location, 'http://') == 0) && (substr_count($location, 'https://') == 0)) {
$location = $CONFIG->url . $location;
}
// return new forward location or false to stop the forward or empty string to exit
+ $current_page = current_page_url();
$params = array('current_url' => $current_page, 'forward_url' => $location);
$location = trigger_plugin_hook('forward', 'system', $params, $location);
+
if ($location) {
header("Location: {$location}");
exit;
@@ -47,7 +45,13 @@
}
/**
- * Return the current page URL.
+ * Returns the current page's complete URL.
+ *
+ * The current URL is assembled using the network's wwwroot and the request URI
+ * in $_SERVER as populated by the web server. This function will include
+ * any schemes, usernames and passwords, and ports.
+ *
+ * @return string The current page URL.
*/
function current_page_url() {
global $CONFIG;
@@ -74,7 +78,6 @@ function current_page_url() {
$page .= ":" . $url['port'];
}
- //$page.="/";
$page = trim($page, "/");
$page .= $_SERVER['REQUEST_URI'];
@@ -83,22 +86,33 @@ function current_page_url() {
}
/**
- * This is a factory function which produces an ElggCache object suitable for caching file load paths.
+ * Returns an ElggCache object suitable for caching view
+ * file load paths to disk under $CONFIG->dataroot.
*
* @todo Can this be done in a cleaner way?
* @todo Swap to memcache etc?
+ *
+ * @return ElggFileCache A cache object suitable for caching file load paths.
*/
function elgg_get_filepath_cache() {
global $CONFIG;
+
+ /**
+ * A default filestore cache using the dataroot.
+ */
static $FILE_PATH_CACHE;
- if (!$FILE_PATH_CACHE) $FILE_PATH_CACHE = new ElggFileCache($CONFIG->dataroot);
+
+ if (!$FILE_PATH_CACHE) {
+ $FILE_PATH_CACHE = new ElggFileCache($CONFIG->dataroot);
+ }
return $FILE_PATH_CACHE;
}
/**
- * Function which resets the file path cache.
+ * Deletes the view file paths cache from disk.
*
+ * @return bool On success
*/
function elgg_filepath_cache_reset() {
$cache = elgg_get_filepath_cache();
@@ -106,9 +120,11 @@ function elgg_filepath_cache_reset() {
}
/**
- * Saves a filepath cache.
+ * Saves $data to the views file paths disk cache as
+ * 'view_paths'.
*
- * @param mixed $data
+ * @param mixed $data The data
+ * @return bool On success
*/
function elgg_filepath_cache_save($data) {
global $CONFIG;
@@ -122,8 +138,9 @@ function elgg_filepath_cache_save($data) {
}
/**
- * Retrieve the contents of the filepath cache.
+ * Returns the contents of the views file paths cache from disk.
*
+ * @return mixed Null if simplecache isn't enabled, the contents of the views file paths cache if it is.
*/
function elgg_filepath_cache_load() {
global $CONFIG;
@@ -141,25 +158,33 @@ function elgg_filepath_cache_load() {
}
/**
- * Enable the filepath cache.
+ * Enables the views file paths disk cache.
*
+ * Uses the 'viewpath_cache_enabled' datalist with a boolean value.
+ * Resets the views paths cache.
+ *
+ * @return null
*/
function elgg_enable_filepath_cache() {
global $CONFIG;
- datalist_set('viewpath_cache_enabled',1);
+ datalist_set('viewpath_cache_enabled', 1);
$CONFIG->viewpath_cache_enabled = 1;
elgg_filepath_cache_reset();
}
/**
- * Disable filepath cache.
+ * Disables the views file paths disk cache.
+ *
+ * Uses the 'viewpath_cache_enabled' datalist with a boolean value.
+ * Resets the views paths cache.
*
+ * @return null
*/
function elgg_disable_filepath_cache() {
global $CONFIG;
- datalist_set('viewpath_cache_enabled',0);
+ datalist_set('viewpath_cache_enabled', 0);
$CONFIG->viewpath_cache_enabled = 0;
elgg_filepath_cache_reset();
}
@@ -203,7 +228,9 @@ function add_submenu_item($label, $link, $group = 'default', $onclick = false, $
/**
* Add an entry to the submenu.
*
- * @param array $item The item as array(
+ * @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
@@ -211,11 +238,13 @@ function add_submenu_item($label, $link, $group = 'default', $onclick = false, $
* '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;
@@ -267,6 +296,7 @@ function elgg_add_submenu_item(array $item, $context = 'all', $group = 'default'
* @param string $context
* @param bool $sort Sort the menu items alphabetically
* @since 1.8
+ * @see elgg_add_submenu_item
*/
function elgg_prepare_submenu($context = 'main', $sort = FALSE) {
global $CONFIG;
@@ -355,6 +385,7 @@ function elgg_prepare_submenu($context = 'main', $sort = FALSE) {
* @param object $a
* @param object $b
* @since 1.8
+ * @see elgg_prepare_submenu
*/
function elgg_submenu_item_cmp($a, $b) {
$a = $a->text;
@@ -381,6 +412,7 @@ function get_submenu() {
* @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;
@@ -403,7 +435,6 @@ function elgg_get_submenu($context = NULL, $sort = FALSE) {
$temp_items = array();
while ($item = current($items)) {
- $t = '';
// ignore parents created by a child but parent never defined properly
if (!isset($item->text) || !($item->text)) {
next($items);
@@ -460,20 +491,21 @@ function elgg_get_submenu($context = NULL, $sort = FALSE) {
}
/**
- * Automatically views likes and a like input relating to the given entity
+ * Returns the HTML for "likes" and "like this" on entities.
*
* @param ElggEntity $entity The entity to like
- * @return string|false The HTML (etc) for the likes, or false on failure
+ * @return string|false The HTML for the likes, or false on failure
* @since 1.8
+ * @see @elgg_view likes/forms/edit
*/
function elgg_view_likes($entity){
if (!($entity instanceof ElggEntity)) {
return false;
}
+
if ($likes = trigger_plugin_hook('likes', $entity->getType(), array('entity' => $entity), false)) {
return $likes;
} else {
- //display the form
$likes = elgg_view('likes/forms/edit', array('entity' => $entity));
return $likes;
}
@@ -510,12 +542,6 @@ function elgg_count_comments($entity) {
}
}
-
-
-/**
- * Library loading and handling
- */
-
/**
* @deprecated 1.7
*/
@@ -525,13 +551,15 @@ function get_library_files($directory, $exceptions = array(), $list = array()) {
}
/**
- * Returns a list of files in $directory
+ * Returns a list of files in $directory.
*
- * @param str $directory
+ * Only returns files. Does not recurse into subdirs.
+ *
+ * @param string $directory
* @param array $exceptions Array of filenames to ignore
* @param array $list Array of files to append to
- * @param mixed $extensions Array of extensions to allow, NULL for all. (With a dot: array('.php'))
- * @return array of filenames including $directory
+ * @param mixed $extensions Array of extensions to allow, NULL for all. Use a dot: array('.php').
+ * @return array Filenames in $directory, in the form $directory/filename.
*/
function elgg_get_file_list($directory, $exceptions = array(), $list = array(), $extensions = NULL) {
$directory = sanitise_filepath($directory);
@@ -556,10 +584,25 @@ function elgg_get_file_list($directory, $exceptions = array(), $list = array(),
}
/**
- * Ensures that the installation has all the correct files, that PHP is configured correctly, and so on.
- * Leaves appropriate messages in the error register if not.
+ * Checks that Elgg has been installed and attempts to complete installation if not.
+ *
+ * This is called by {@link engine/start.php} immediately after Elgg libraries are loaded
+ * to check the installation state.
+ *
+ * Elgg's installation state is determined by (1) the existence of the engine/settings.php
+ * file, (2) a .htaccess file, and (3) a populated database. This function checks
+ * for 1 and 2, while 3 is checked by {@link is_installed()} and {@link is_db_installed()}.
+ *
+ * If settings.php doesn't exist and $_REQUEST['db_install_vars'] is present,
+ * this function attempts to write the values from 'db_install_vars' to settings.php.
+ *
+ * If .htaccess doens't exist this function attempts to copy htaccess_dist to .htaccess.
+ *
+ * If there are any problems, this function calls {@link register_error()} and returns FALSE.
+ * Since this function is called during bootstrapping, the viewtype is failsafe.
+ * Returning FALSE results in an InstallationException, which halts execution.
*
- * @return true|false True if everything is ok (or Elgg is fit enough to run); false if not.
+ * @return bool
*/
function sanitised() {
$sanitised = true;
@@ -608,18 +651,16 @@ function sanitised() {
}
/**
- * Registers
- */
-
-/**
- * Adds an array with a name to a given generic array register.
- * For example, these are used for menus.
+ * Adds an entry in $CONFIG[$register_name][$subregister_name].
+ *
+ * This is only used for the site-wide menu. See {@link add_menu()}.
*
* @param string $register_name The name of the top-level register
* @param string $subregister_name The name of the subregister
* @param mixed $subregister_value The value of the subregister
* @param array $children_array Optionally, an array of children
* @return true|false Depending on success
+ * @todo Can be deprecated when the new menu system is introduced.
*/
function add_to_register($register_name, $subregister_name, $subregister_value, $children_array = array()) {
global $CONFIG;
@@ -649,12 +690,15 @@ function add_to_register($register_name, $subregister_name, $subregister_value,
}
/**
- * Removes what has been registered at [register_name][subregister_name]
+ * Removes a register entry from $CONFIG[register_name][subregister_name]
+ *
+ * This is used to by {@link remove_menu()} to remove site-wide menu items.
*
* @param string $register_name The name of the top-level register
* @param string $subregister_name The name of the subregister
* @return true|false Depending on success
* @since 1.7.0
+ * @todo Can be deprecated when the new menu system is introduced.
*/
function remove_from_register($register_name, $subregister_name) {
global $CONFIG;
@@ -680,12 +724,13 @@ function remove_from_register($register_name, $subregister_name) {
}
/**
- * Returns a register object
+ * Constructs and returns a register object.
*
* @param string $register_name The name of the register
* @param mixed $register_value The value of the register
* @param array $children_array Optionally, an array of children
* @return false|stdClass Depending on success
+ * @todo Can be deprecated when the new menu system is introduced.
*/
function make_register_object($register_name, $register_value, $children_array = array()) {
elgg_deprecated_notice('make_register_object() is deprecated by add_submenu_item()', 1.7);
@@ -706,6 +751,7 @@ function make_register_object($register_name, $register_value, $children_array =
*
* @param string $register_name The name of the register
* @return array|false Depending on success
+ * @todo Can be deprecated when the new menu system is introduced.
*/
function get_register($register_name) {
global $CONFIG;
@@ -718,15 +764,16 @@ function get_register($register_name) {
}
/**
- * Adds an item to the menu register
- * This is used in the core to create the tools dropdown menu
- * You can obtain the menu array by calling get_register('menu')
+ * 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
* @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;
@@ -759,11 +806,12 @@ function remove_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
+ * 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);
@@ -771,14 +819,30 @@ function menu_item($menu_name, $menu_url) {
}
/**
- * Message register handling
- * If a null $message parameter is given, the function returns the array of messages so far and empties it
- * based on the $register parameters. Otherwise, any message or array of messages is added.
+ * Queues a message to be displayed.
+ *
+ * Messages will not be displayed immediately, but are stored in
+ * for later display, usually upon next page load.
+ *
+ * The method of displaying these messages differs depending upon plugins and
+ * viewtypes. The core default viewtype retrieves messages in {@link views/default/page_shells/default.php}
+ * and displays messages as javascript popups.
+ *
+ * @internal Messages are stored as strings in the $_SESSION['msg'][$register] array.
+ *
+ * @warning This function is used to both add to and clear the message
+ * stack. If $messages is null, $register will be returned and cleared.
+ * If $messages is null and $register is empty, all messages will be
+ * returned and removed.
+ *
+ * @important This function handles the standard {@link system_message()} ($register =
+ * 'messages') as well as {@link register_error()} messages ($register = 'errors').
*
* @param string|array $message Optionally, a single message or array of messages to add, (default: null)
* @param string $register This allows for different types of messages: "errors", "messages" (default: messages)
* @param bool $count Count the number of messages (default: false)
* @return true|false|array Either the array of messages, or a response regarding whether the message addition was successful
+ * @todo Clean up. Separate registering messages and retrieving them.
*/
function system_messages($message = null, $register = "messages", $count = false) {
if (!isset($_SESSION['msg'])) {
@@ -826,22 +890,24 @@ function system_messages($message = null, $register = "messages", $count = false
* @return integer The number of messages
*/
function count_messages($register = "") {
- return system_messages(null,$register,true);
+ return system_messages(null, $register, true);
}
/**
- * An alias for system_messages($message) to handle standard user information messages
+ * Display a system message on next page load.
*
+ * @see system_messages()
* @param string|array $message Message or messages to add
- * @return true|false Success response
+ * @return Bool
*/
function system_message($message) {
return system_messages($message, "messages");
}
/**
- * An alias for system_messages($message) to handle error messages
+ * Display an error on next page load.
*
+ * @see system_messages()
* @param string|array $message Error or errors to add
* @return true|false Success response
*/
@@ -850,26 +916,25 @@ function register_error($error) {
}
/**
- * Event register
- * Adds functions to the register for a particular event, but also calls all functions registered to an event when required
- *
- * Event handler functions must be of the form:
- *
- * event_handler_function($event, $object_type, $object);
- *
- * And must return true or false depending on success. A false will halt the event in its tracks and no more functions will be called.
+ * Register a callback function as a handler or trigger registered handlers for an event.
*
- * You can then simply register them using the following function. Optionally, this can be called with a priority nominally from 0 to 1000, where functions with lower priority values are called first (note that priorities CANNOT be negative):
+ * Elgg emits an event when certain core actions occur, like creating an entity.
+ * Functions registered to these events can respond to the event, prevent the
+ * event from completing, or ignore the event.
*
- * register_elgg_event_handler($event, $object_type, $function_name [, $priority = 500]);
+ * Callback functions are registered with {@link register_elgg_event_handler()}
*
- * Note that you can also use 'all' in place of both the event and object type.
+ * When an event is triggered ({@link trigger_elgg_event()}, each callback function is
+ * run in order of priority. Any callback that returns false will halt execution
+ * and control will be passed back to the caller.
*
- * To trigger an event properly, you should always use:
+ * @internal Events are stored in $CONFIG->events as:
+ * <code>
+ * $CONFIG->events[$event][$type][$priority] = 'callback_function'
+ * </code>
*
- * trigger_elgg_event($event, $object_type [, $object]);
- *
- * Where $object is optional, and represents the $object_type the event concerns. This will return true if successful, or false if it fails.
+ * @note You cannot generally alter the event, only halt it.
+ * @tip Plugin authors should use {@link register_elgg_event_handler()} to register events.
*
* @param string $event The type of event (eg 'init', 'update', 'delete')
* @param string $object_type The type of object (eg 'system', 'blog', 'user')
@@ -878,6 +943,12 @@ function register_error($error) {
* @param boolean $call Set to true to call the event rather than add to it (default false)
* @param mixed $object Optionally, the object the event is being performed on (eg a user)
* @return true|false Depending on success
+ *
+ * @todo Separate registering and calling events. {@trac #2466}
+ * @example events/basic.php Register and respond to an Elgg event
+ * @example events/advanced.php Register for an Elgg event and optionally halt it.
+ * @internal @example events/emit.php Basic emitting of an Elgg event.
+ * @link http://docs.elgg.org/Tutorials/Core/Events
*/
function events($event = "", $object_type = "", $function = "", $priority = 500, $call = false, $object = null) {
global $CONFIG;
@@ -947,19 +1018,63 @@ function events($event = "", $object_type = "", $function = "", $priority = 500,
}
/**
- * Alias function for events, that registers a function to a particular kind of event
+ * Register a callback function as an Elgg event handler.
+ *
+ * Events are emitted by Elgg when certain actions occur. Plugins
+ * can respond to these events or halt them completely by registering a handler
+ * as a callback function to an event. Multiple handlers can be registered for
+ * the same event and will be executed in order of $priority. Any handler
+ * returning false will halt the execution chain.
+ *
+ * This function is called with the event name, event type, and handler function name.
+ * Setting the optional $priority allows plugin authors to specify when the
+ * function should be run. Priorities for plugins should be 1-1000.
+ *
+ * The callback function is passed 3 arguments when called: $event, $type, and optional $params.
+ *
+ * $event is the name of event being emitted.
+ * $type is the type of event or object concerned.
+ * $params is an optional parameter passed that can include a related object. See
+ * specific event documentation for details on which events pass what parameteres.
+ *
+ * @tip If a priority isn't specified it is determined by the order the handler was
+ * registered relative to the event and type. For plugins, this generally means
+ * the earlier the plugin is in the load order, the earlier the priorities are for
+ * any event handlers.
+ *
+ * @tip $event and $object_type can use the special keyword 'all'. Handler functions registered
+ * with $event = all will be called for all events of type $object_type. Similarly,
+ * functions registered with $object_type = all will be called for all events of type
+ * $event, regardless of $object_type. If $event and $object_type both are 'all', the
+ * handler function will be called for all events.
+ *
+ * @tip Event handler functions are considered in the follow order:
+ * - Specific registration where 'all' isn't used.
+ * - Registration where 'all' is used for $event only.
+ * - Registration where 'all' is used for $type only.
+ * - Registration where 'all' is used for both.
+ *
+ * @warning If you use the 'all' keyword, you must have logic in the handler function to
+ * test the passed parameters before taking an action.
+ *
+ * @tip When referring to events, the preferred syntax is "event:type".
*
* @param string $event The event type
* @param string $object_type The object type
- * @param string $function The function name
- * @return true|false Depending on success
+ * @param string $function The handler callback function name
+ * @param int $priority The priority of the event
+ * @return bool
+ * @link http://docs.elgg.org/Tutorials/Plugins/Events
+ * @example events/basic.php Basic example of registering an event handler callback function.
+ * @example events/advanced.php Advanced example of registering an event handler callback function and halting execution.
+ * @example events/all.php Example of how to use the 'all' keyword.
*/
function register_elgg_event_handler($event, $object_type, $function, $priority = 500) {
return events($event, $object_type, $function, $priority);
}
/**
- * Unregisters a function to a particular kind of event
+ * Unregisters a callback function from an event.
*
* @param string $event The event type
* @param string $object_type The object type
@@ -976,12 +1091,33 @@ function unregister_elgg_event_handler($event, $object_type, $function) {
}
/**
- * Alias function for events, that triggers a particular kind of event
+ * Trigger an Elgg Event and run all handler functions registered to that event:type.
+ *
+ * This function runs all handlers regsitered to $event:$object_type or
+ * the special keyword 'all' for either or both.
+ *
+ * $event is usually a verb: create, update, delete, annotation.
+ *
+ * $object_type is usually a noun: object, group, user, annotation, relationship, metadata.
+ *
+ * $object is usually an Elgg* object assciated with the event.
+ *
+ * @warning Elgg events should only be called by core. Plugin authors should use
+ * {@link trigger_elgg_plugin_hook()} instead.
+ *
+ * @tip When referring to events, the preferred syntax is "event:type".
+ *
+ * @internal Only rarely should events be changed, added, or removed in core.
+ * When making changes to events, be sure to first create a ticket in trac.
+ *
+ * @internal @tip Think of $object_type as the primary namespace element, and
+ * $event as the secondary namespace.
*
* @param string $event The event type
* @param string $object_type The object type
* @param string $function The function name
- * @return true|false Depending on success
+ * @return bool The result of running all handler functions.
+ * @link http://docs.elgg.org/Tutorials/Core/Events
*/
function trigger_elgg_event($event, $object_type, $object = null) {
$return = true;
@@ -993,27 +1129,68 @@ function trigger_elgg_event($event, $object_type, $object = null) {
}
/**
- * Register a function to a plugin hook for a particular hook name and type, with a given priority.
+ * Register a callback function as a plugin hook handler.
*
- * eg if you want the function "export_user" to be called when the hook "export" for "user" entities
- * is run, use:
+ * Plugin hooks allow developers to losely couple plugins and features by
+ * repsonding to and emitting {@link trigger_plugin_hook()} customizable hooks.
+ * Handler functions can respond to the hook, change the details of the hook, or ignore it.
*
- * register_plugin_hook("export", "user", "export_user");
+ * Multiple handlers can be registered for a plugin hook, and each callback
+ * function is called in order of priority. If the return value of a handler
+ * function is not null, that value is passed to the next function in the
+ * call stack. When all functions have been run, the final value is passed
+ * back to the caller via {@link trigger_plugin_hook()}.
*
- * "all" is a valid value for both $hook and $entity_type. "none" is a valid value for $entity_type.
+ * Similar to Elgg Events, plugin hook handler functions are registered by passing
+ * a hook, a type, and a priority.
*
- * The export_user function would then be defined as:
+ * The callback function is passed 4 arguments when called: $hook, $type
+ * $value, and $params.
*
- * function export_user($hook, $entity_type, $returnvalue, $params);
+ * - str $hook The name of the hook.
+ * - str $type The type of hook.
+ * - mixed $value The return value of the last handler or the default
+ * value if no other handlers have been called.
+ * - mixed $params An optional array of parameters. Used to provide additional information
+ * to plugins.
*
- * Where $returnvalue is the return value returned by the last function returned by the hook, and
- * $params is an array containing a set of parameters (or nothing).
+ * @internal Plugin hooks are stored in $CONFIG->hooks as:
+ * <code>
+ * $CONFIG->hooks[$hook][$type][$priority] = 'callback_function'
+ * </code>
+ *
+ * @tip Plugin hooks are similar to Elgg Events in that Elgg emits
+ * a plugin hook when certain actions occur, but a plugin hook allows you to alter the
+ * parameters, as well as halt execution.
+ *
+ * @tip If a priority isn't specified it is determined by the order the handler was
+ * registered relative to the event and type. For plugins, this generally means
+ * the earlier the plugin is in the load order, the earlier the priorities are for
+ * any event handlers.
+ *
+ * @tip Like Elgg Events, $hook and $type can use the special keyword 'all'.
+ * Handler functions registered with $hook = all will be called for all hooks
+ * of type $type. Similarly, handlers registered with $type = all will be
+ * called for all hooks of type $event, regardless of $object_type. If $hook
+ * and $type both are 'all', the handler will be called for all hooks.
+ *
+ * @tip Plugin hooks are sometimes used to gather lists from plugins. This is
+ * usually done by pushing elements into an array passed in $params. Be sure
+ * to append to and then return $value so you don't overwrite other plugin's
+ * values.
+ *
+ * @warning Unlike Elgg Events, a handler that returns false will NOT halt the
+ * execution chain.
*
* @param string $hook The name of the hook
- * @param string $type The type of the hook (NB Can be an ElggEntity type [user, object, group, site] or custom-defined 'get_sections')
+ * @param string $type The type of the hook
* @param string $function The name of a valid function to be run
* @param string $priority The priority - 0 is first, 1000 last, default is 500
- * @return true|false Depending on success
+ * @return bool
+ *
+ * @example hooks/register/basic.php Registering for a plugin hook and examining the variables.
+ * @example hooks/register/advanced.php Registering for a plugin hook and changing the params.
+ * @link http://docs.elgg.org/Tutorials/Plugins/Hooks
*/
function register_plugin_hook($hook, $type, $function, $priority = 500) {
global $CONFIG;
@@ -1043,7 +1220,7 @@ function register_plugin_hook($hook, $type, $function, $priority = 500) {
}
/**
- * Unregister a function to a plugin hook for a particular entity type
+ * Unregister a callback function as a plugin hook.
*
* @param string $hook The name of the hook
* @param string $entity_type The name of the type of entity (eg "user", "object" etc)
@@ -1060,18 +1237,38 @@ function unregister_plugin_hook($hook, $entity_type, $function) {
}
/**
- * Triggers a plugin hook, with various parameters as an array. For example, to provide
- * a 'foo' hook that concerns the type 'bar', with a parameter called 'param1'
- * with value 'value1', that by default returns true, you'd call:
+ * Trigger a Plugin Hook and run all handler functions registered to that hook:type.
+ *
+ * This function runs all handlers regsitered to $hook:$type or
+ * the special keyword 'all' for either or both.
+ *
+ * Use $params to send additional information to the handler functions.
+ *
+ * $returnvalue Is the initial value to pass to the handlers, which can
+ * then change it. It is useful to use $returnvalue to set defaults.
+ * If no handlers are registered, $returnvalue is immediately returned.
*
- * trigger_plugin_hook('foo', 'bar', array('param1' => 'value1'), true);
+ * $hook is usually a verb: import, get_views, output.
*
- * @see register_plugin_hook
+ * $type is usually a noun: user, ecml, page.
+ *
+ * @tip Like Elgg Events, $hook and $type can use the special keyword 'all'.
+ * Handler functions registered with $hook = all will be called for all hooks
+ * of type $type. Similarly, handlers registered with $type = all will be
+ * called for all hooks of type $event, regardless of $object_type. If $hook
+ * and $type both are 'all', the handler will be called for all hooks.
+ *
+ * @see register_plugin_hook()
* @param string $hook The name of the hook to trigger (NB: "all" will trigger for all $types regardless of $hook value)
* @param string $type The type of the hook to trigger (NB: "all" will trigger for all $hooks regardless of $type value)
- * @param array $params Any parameters. It's good practice to name the keys, i.e. by using array('name' => 'value', 'name2' => 'value2')
+ * @param mixed $params Additional parameters to pass to the handlers
* @param mixed $returnvalue An initial return value
- * @return mixed|null The cumulative return value for the plugin hook functions
+ * @return mixed|null The return value of the last handler function called
+ *
+ * @example hooks/trigger/basic.php Trigger a hook that determins if execution should continue.
+ * @example hooks/trigger/advanced.php Trigger a hook with a default value and use the results to populate a menu.
+ * @example hooks/basic.php Trigger and respond to a basic plugin hook.
+ * @link http://docs.elgg.org/Tutorials/Plugins/Hooks
*/
function trigger_plugin_hook($hook, $type, $params = null, $returnvalue = null) {
global $CONFIG;
@@ -1088,7 +1285,9 @@ function trigger_plugin_hook($hook, $type, $params = null, $returnvalue = null)
if (!empty($CONFIG->hooks['all'][$type]) && is_array($CONFIG->hooks['all'][$type])) {
foreach($CONFIG->hooks['all'][$type] as $hookfunction) {
$temp_return_value = $hookfunction($hook, $type, $returnvalue, $params);
- if (!is_null($temp_return_value)) $returnvalue = $temp_return_value;
+ if (!is_null($temp_return_value)) {
+ $returnvalue = $temp_return_value;
+ }
}
}
@@ -1114,12 +1313,15 @@ function trigger_plugin_hook($hook, $type, $params = null, $returnvalue = null)
}
/**
- * Error handling
- */
-
-/**
- * PHP Error handler function.
- * This function acts as a wrapper to catch and report PHP error messages.
+ * Intercepts catchable PHP errors.
+ *
+ * @warning This function should never be called directly.
+ *
+ * @internal
+ * For catchable fatal errors, throws an Exception with the error.
+ *
+ * For non-fatal errors, depending upon the debug settings, either
+ * log the error or ignore it.
*
* @see http://www.php.net/set-error-handler
* @param int $errno The level of the error raised
@@ -1156,18 +1358,21 @@ function __elgg_php_error_handler($errno, $errmsg, $filename, $linenum, $vars) {
}
/**
- * Throws a message to the Elgg logger
+ * Display or log a message.
+ *
+ * If $level is >= to the debug setting in {@link $CONFIG->debug}, the
+ * message will be sent to {@link elgg_dump()}. Messages with lower
+ * priority than {@link $CONFIG->debug} are ignored.
*
- * The Elgg log is currently implemented such that any messages sent at a level
- * greater than or equal to the debug setting will be sent to elgg_dump.
- * The default location for elgg_dump is the screen except for notices.
+ * {@link elgg_dump()} outputs all levels but NOTICE to screen by default.
*
- * Note: No messages will be displayed unless debugging has been enabled.
+ * @note No messages will be displayed unless debugging has been enabled.
*
* @param str $message User message
* @param str $level NOTICE | WARNING | ERROR | DEBUG
* @return bool
* @since 1.7.0
+ * @todo This is complicated and confusing. Using int constants for debug levels will make things easier.
*/
function elgg_log($message, $level='NOTICE') {
global $CONFIG;
@@ -1205,11 +1410,13 @@ function elgg_log($message, $level='NOTICE') {
}
/**
- * Extremely generic var_dump-esque wrapper
+ * Logs or displays $value.
+ *
+ * If $to_screen is true, $value is displayed to screen. Else,
+ * it is handled by PHP's {@link error_log()} function.
*
- * Immediately dumps the given $value as a human-readable string.
- * The $value can instead be written to the screen or server log depending on
- * the value of the $to_screen flag.
+ * A {@elgg_plugin_hook debug:log} is called. If a handler returns
+ * false, it will stop the default logging method.
*
* @param mixed $value
* @param bool $to_screen
@@ -1245,8 +1452,9 @@ function elgg_dump($value, $to_screen = TRUE, $level = 'NOTICE') {
}
/**
- * Custom exception handler.
- * This function catches any thrown exceptions and handles them appropriately.
+ * Intercepts, logs, and display uncaught exceptions.
+ *
+ * @warning This function should never be called directly.
*
* @see http://www.php.net/set-exception-handler
* @param Exception $exception The exception being handled
@@ -1254,33 +1462,43 @@ function elgg_dump($value, $to_screen = TRUE, $level = 'NOTICE') {
function __elgg_php_exception_handler($exception) {
error_log("*** FATAL EXCEPTION *** : " . $exception);
- ob_end_clean(); // Wipe any existing output buffer
+ // Wipe any existing output buffer
+ ob_end_clean();
// make sure the error isn't cached
header("Cache-Control: no-cache, must-revalidate", true);
header('Expires: Fri, 05 Feb 1982 00:00:00 -0500', true);
+ // @todo Why don't we send a 500 header?
//header("Internal Server Error", true, 500);
- $body = elgg_view("messages/exceptions/exception",array('object' => $exception));
+ $body = elgg_view("messages/exceptions/exception", array('object' => $exception));
page_draw(elgg_echo('exception:title'), $body);
}
/**
- * Data lists
+ * An array of key value pairs from the datalists table.
+ *
+ * Used as a cache in datalist functions.
+ *
+ * @global array $DATALIST_CACHE
*/
-
$DATALIST_CACHE = array();
/**
- * Get the value of a particular piece of data in the datalist
+ * Get the value of a datalist element.
*
- * @param string $name The name of the datalist
- * @return string|false Depending on success
+ * @internal Datalists are stored in the datalist table.
+ *
+ * @tip Use datalists to store information common to a full installation.
+ *
+ * @param string $name The name of the datalist element
+ * @return string|false The datalist value or false if it doesn't exist.
*/
function datalist_get($name) {
global $CONFIG, $DATALIST_CACHE;
- // We need this, because sometimes datalists are received before the database is created
+ // We need this, because sometimes datalists are attempted
+ // to be retrieved before the database is created
if (!is_db_installed()) {
return false;
}
@@ -1320,28 +1538,17 @@ function datalist_get($name) {
}
}
-
- /*if ($row = get_data_row("SELECT value from {$CONFIG->dbprefix}datalists where name = '{$name}' limit 1")) {
- $DATALIST_CACHE[$name] = $row->value;
-
- // Cache it if memcache is available
- if ($datalist_memcache) $datalist_memcache->save($name, $row->value);
-
- return $row->value;
- }*/
-
return false;
}
/**
- * Sets the value for a system-wide piece of data (overwriting a previous value if it exists)
+ * Set the value for a datalist element.
*
* @param string $name The name of the datalist
* @param string $value The new value
* @return true
*/
function datalist_set($name, $value) {
-
global $CONFIG, $DATALIST_CACHE;
$name = sanitise_string($name);
@@ -1357,7 +1564,6 @@ function datalist_set($name, $value) {
$datalist_memcache->delete($name);
}
- //delete_data("delete from {$CONFIG->dbprefix}datalists where name = '{$name}'");
insert_data("INSERT into {$CONFIG->dbprefix}datalists set name = '{$name}', value = '{$value}' ON DUPLICATE KEY UPDATE value='{$value}'");
$DATALIST_CACHE[$name] = $value;
@@ -1366,14 +1572,25 @@ function datalist_set($name, $value) {
}
/**
- * Runs a function once - not per page load, but per installation.
- * If you like, you can also set the threshold for the function execution - i.e.,
- * if the function was executed before or on $timelastupdatedcheck, this
- * function will run it again.
+ * Run a function one time per installation.
+ *
+ * If you pass a timestamp as the second argument, it will run the function
+ * only if (i) it has never been run before or (ii) the timestamp is >=
+ * the last time it was run.
+ *
+ * @warning Functions are determined by their name. If you change the name of a function
+ * it will be run again.
+ *
+ * @tip Use $timelastupdatedcheck in your plugins init function to perform automated
+ * upgrades. Schedule a function to run once and pass the timestamp of the new release.
+ * This will cause the run once function to be run on all installations. To perform
+ * additional upgrades, create new functions for each release.
+ *
+ * @internal A datalist entry $functioname is created with the value of time().
*
* @param string $functionname The name of the function you want to run.
- * @param int $timelastupdatedcheck Optionally, the UNIX epoch timestamp of the execution threshold
- * @return true|false Depending on success.
+ * @param int $timelastupdatedcheck A UNIX timestamp. If time() is > than this, this function will be run again.
+ * @return bool
*/
function run_function_once($functionname, $timelastupdatedcheck = 0) {
if ($lastupdated = datalist_get($functionname)) {
@@ -1383,7 +1600,7 @@ function run_function_once($functionname, $timelastupdatedcheck = 0) {
}
if (is_callable($functionname) && $lastupdated <= $timelastupdatedcheck) {
$functionname();
- datalist_set($functionname,time());
+ datalist_set($functionname, time());
return true;
} else {
return false;
@@ -1392,12 +1609,21 @@ function run_function_once($functionname, $timelastupdatedcheck = 0) {
/**
* Sends a notice about deprecated use of a function, view, etc.
- * Note: This will ALWAYS at least log a warning. Don't use to pre-deprecate things.
+ *
+ * This function either displays or logs the deprecation message,
+ * depending upon the deprecation policies in {@link CODING.txt}.
+ * Logged messages are sent with the level of 'WARNING'.
+ *
+ * A user-visual message will be displayed if $dep_version is greater
+ * than 1 minor releases lower than the current Elgg version, or at all
+ * lower than the current Elgg major version.
+ *
+ * @note This will always at least log a warning. Don't use to pre-deprecate things.
* This assumes we are releasing in order and deprecating according to policy.
*
+ * @see CODING.txt
* @param str $msg Message to log / display.
- * @param str $version human-readable *release* version the function was deprecated. No bloody A, B, (R)C, or D.
- *
+ * @param str $version human-readable *release* version: 1.7, 1.7.3
* @return bool
* @since 1.7.0
*/
@@ -1406,7 +1632,6 @@ function elgg_deprecated_notice($msg, $dep_version) {
// if it's a 2 minor releases behind, visual and logged
// if it's 1 minor release behind, logged.
// bugfixes don't matter because you're not deprecating between them, RIGHT?
-
if (!$dep_version) {
return FALSE;
}
@@ -1450,13 +1675,7 @@ function elgg_deprecated_notice($msg, $dep_version) {
/**
- * Privilege elevation and gatekeeper code
- */
-
-
-/**
- * Gatekeeper function which ensures that a we are being executed from
- * a specified location.
+ * Checks if code is being called from a certain function.
*
* To use, call this function with the function name (and optional file location) that it has to be called
* from, it will either return true or false.
@@ -1486,6 +1705,7 @@ function elgg_deprecated_notice($msg, $dep_version) {
* @param mixed $function The function that this function must have in its call stack,
* to test against a method pass an array containing a class and method name.
* @param string $file Optional file that the function must reside in.
+ * @todo This is neat but is it necessary?
*/
function call_gatekeeper($function, $file = "") {
// Sanity check
@@ -1516,7 +1736,6 @@ function call_gatekeeper($function, $file = "") {
return false;
}
-
// If file then check that this it is being called from this function
if ($file) {
$mirror = null;
@@ -1544,6 +1763,7 @@ function call_gatekeeper($function, $file = "") {
* @param string $path The full path and filename that this function must have in its call stack If a partial path is given and $include_subdirs is true, then the function will return true if called by any function in or below the specified path.
* @param bool $include_subdirs Are subdirectories of the path ok, or must you specify an absolute path and filename.
* @param bool $strict_mode If true then the calling method or function must be directly called by something on $path, if false the whole call stack is searched.
+ * @todo Again, very neat, but is it necessary?
*/
function callpath_gatekeeper($path, $include_subdirs = true, $strict_mode = false) {
global $CONFIG;
@@ -1590,7 +1810,9 @@ function callpath_gatekeeper($path, $include_subdirs = true, $strict_mode = fals
}
/**
- * Returns true or false depending on whether a PHP .ini setting is on or off
+ * Return the state of a php.ini setting.
+ *
+ * Normalizes the setting to bool.
*
* @param string $ini_get_arg The INI setting
* @return true|false Depending on whether it's on or off
@@ -1605,10 +1827,13 @@ function ini_get_bool($ini_get_arg) {
}
/**
+ * 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.
*
* @param string $string
* @return bool
+ * @todo This is used once in metadata.php. Use a lambda function instead.
*/
function is_not_null($string) {
if (($string==='') || ($string===false) || ($string===null)) {
@@ -1620,11 +1845,13 @@ function is_not_null($string) {
/**
- * Normalise the singular keys in an options array
- * to the plural keys.
+ * Normalise the singular keys in an options array to plural keys.
*
- * @param $options
- * @param $singulars
+ * Used in elgg_get_entities*() functions to support shortcutting plural
+ * names by singular names.
+ *
+ * @param array $options The options array. $options['keys'] = 'values';
+ * @param array $singulars A list of sinular words to pluralize by adding 's'.
* @return array
* @since 1.7.0
*/
@@ -1647,15 +1874,18 @@ function elgg_normalise_plural_options_array($options, $singulars) {
}
/**
- * Get the full URL of the current page.
+ * Return the full URL of the current page.
*
* @return string The URL
+ * @todo Combine / replace with current_page_url()
*/
function full_url() {
$s = empty($_SERVER["HTTPS"]) ? '' : ($_SERVER["HTTPS"] == "on") ? "s" : "";
$protocol = substr(strtolower($_SERVER["SERVER_PROTOCOL"]), 0, strpos(strtolower($_SERVER["SERVER_PROTOCOL"]), "/")) . $s;
$port = ($_SERVER["SERVER_PORT"] == "80" || $_SERVER["SERVER_PORT"] == "443") ? "" : (":".$_SERVER["SERVER_PORT"]);
+ // This is here to prevent XSS in poorly written browsers used by 80% of the population.
+ // {@trac [5813]}
$quotes = array('\'', '"');
$encoded = array('%27', '%22');
@@ -1675,6 +1905,8 @@ function full_url() {
* xxx.xxx.xxx.xxx/nn (nn = # bits, cisco style -- i.e. /24 = class C)
* Does not match:
* xxx.xxx.xxx.xx[yyy-zzz] (range, partial octets not supported)
+ *
+ * @todo not used at all.
*/
function test_ip($range, $ip) {
$result = 1;
@@ -1737,10 +1969,9 @@ function test_ip($range, $ip) {
* @param array $networks
* @param string $ip
* @return bool
+ * @todo not used at all in core.
*/
function is_ip_in_array(array $networks, $ip) {
- global $SYSTEM_LOG;
-
foreach ($networks as $network) {
if (test_ip(trim($network), $ip)) {
return true;
@@ -1753,7 +1984,9 @@ function is_ip_in_array(array $networks, $ip) {
require_once dirname(dirname(__FILE__)).'/classes/Friendable.php';
/**
- * Rebuilds a parsed (partial) URL
+ * Builds a URL from the a parts array like one returned by {@link parse_url()}.
+ *
+ * @note If only partial information is passed, a partial URL will be returned.
*
* @param array $parts Associative array of URL components like parse_url() returns
* @param bool $htmlencode HTML Encode the url?
@@ -1777,14 +2010,22 @@ function elgg_http_build_url(array $parts, $html_encode = TRUE) {
}
}
-
/**
* Adds action tokens to URL
*
+ * As of 1.7.0 action tokens are required on all actions.
+ * Use this function to append action tokens to a URL's GET parameters.
+ * This will preserve any existing GET parameters.
+ *
+ * @note If you are using {@elgg_view input/form} you don't need to
+ * add tokens to the action. The form view automatically handles
+ * tokens.
+ *
* @param str $link Full action URL
* @param bool $htmlencode html encode the url?
* @return str URL with action tokens
* @since 1.7.0
+ * @link http://docs.elgg.org/Tutorials/Actions
*/
function elgg_add_action_tokens_to_url($url, $html_encode = TRUE) {
$components = parse_url($url);
@@ -1808,7 +2049,10 @@ function elgg_add_action_tokens_to_url($url, $html_encode = TRUE) {
return elgg_http_build_url($components, $html_encode);
}
+
/**
+ * Add action tokens to URL.
+ *
* @deprecated 1.7 final
*/
function elgg_validate_action_url($url) {
@@ -1817,12 +2061,15 @@ function elgg_validate_action_url($url) {
return elgg_add_action_tokens_to_url($url);
}
+
/**
- * Removes a single elementry from a (partial) url query.
+ * Removes an element from a URL's query string.
+ *
+ * @note You can send a partial URL string.
*
* @param string $url
* @param string $element
- * @return string
+ * @return string The new URL with the query element removed.
* @since 1.7.0
*/
function elgg_http_remove_url_query_element($url, $element) {
@@ -1844,13 +2091,12 @@ function elgg_http_remove_url_query_element($url, $element) {
return $string;
}
-
/**
- * Adds get params to $url
+ * Adds an element or elements to a URL's query string.
*
- * @param str $url
- * @param array $elements k/v pairs.
- * @return str
+ * @param str $url The URL
+ * @param array $elements key/value pairs to add to the URL
+ * @return str The new URL with the query strings added
* @since 1.7.0
*/
function elgg_http_add_url_query_elements($url, array $elements) {
@@ -1872,16 +2118,12 @@ function elgg_http_add_url_query_elements($url, array $elements) {
return $string;
}
-
/**
- * Breadcrumb support.
- */
-
-/**
- * Adds a breadcrumb to the stack
+ * Adds a breadcrumb to the breadcrumbs stack.
*
* @param string $title The title to display
* @param string $link Optional. The link for the title.
+ * @link http://docs.elgg.org/Tutorials/UI/Breadcrumbs
*/
function elgg_push_breadcrumb($title, $link = NULL) {
global $CONFIG;
@@ -1897,6 +2139,7 @@ function elgg_push_breadcrumb($title, $link = NULL) {
* Removes last breadcrumb entry.
*
* @return array popped item.
+ * @link http://docs.elgg.org/Tutorials/UI/Breadcrumbs
*/
function elgg_pop_breadcrumb() {
global $CONFIG;
@@ -1909,9 +2152,10 @@ function elgg_pop_breadcrumb() {
}
/**
- * Returns all breadcrumbs
+ * 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;
@@ -1919,16 +2163,13 @@ function elgg_get_breadcrumbs() {
return (is_array($CONFIG->breadcrumbs)) ? $CONFIG->breadcrumbs : array();
}
-
-/**
- * Sticky forms
- */
-
/**
* Load all the REQUEST variables into the sticky form cache
*
* Call this from an action when you want all your submitted variables
* available if the submission fails validation and is sent back to the form
+ *
+ * @link http://docs.elgg.org/Tutorials/UI/StickyForms
*/
function elgg_make_sticky_form($form_name) {
global $CONFIG;
@@ -1947,7 +2188,6 @@ function elgg_make_sticky_form($form_name) {
}
}
-
/**
* Clear the sticky form cache
*
@@ -1956,23 +2196,25 @@ function elgg_make_sticky_form($form_name) {
* after a validation error.
*
* @param string $name Form namespace
+ * @link http://docs.elgg.org/Tutorials/UI/StickyForms
*/
function elgg_clear_sticky_form($form_name) {
unset($_SESSION['sticky_forms'][$form_name]);
}
/**
- * Has this form been made sticky
+ * Has this form been made sticky?
*
* @param string $name Form namespace
* @return boolean
+ * @link http://docs.elgg.org/Tutorials/UI/StickyForms
*/
function elgg_is_sticky_form($form_name) {
return isset($_SESSION['sticky_forms'][$form_name]);
}
/**
- * Get a specific stick variable
+ * Get a specific sticky variable
*
* @param string $variable The name of the variable
* @param mixed $default Default value if the variable does not exist in sticky cache
@@ -1980,6 +2222,7 @@ function elgg_is_sticky_form($form_name) {
* @return mixed
*
* @todo should this filter the default value?
+ * @link http://docs.elgg.org/Tutorials/UI/StickyForms
*/
function elgg_get_sticky_value($form_name, $variable, $default = NULL, $filter_result = true) {
if (isset($_SESSION['sticky_forms'][$form_name][$variable])) {
@@ -1997,6 +2240,7 @@ function elgg_get_sticky_value($form_name, $variable, $default = NULL, $filter_r
* Clear a specific sticky variable
*
* @param string $variable The name of the variable to clear
+ * @link http://docs.elgg.org/Tutorials/UI/StickyForms
*/
function elgg_clear_sticky_value($form_name, $variable) {
unset($_SESSION['sticky_forms'][$form_name][$variable]);
@@ -2005,6 +2249,7 @@ function elgg_clear_sticky_value($form_name, $variable) {
/**
* Returns the current active sticky form.
* @return mixed Str | FALSE
+ * @link http://docs.elgg.org/Tutorials/UI/StickyForms
*/
function elgg_get_active_sticky_form() {
global $CONFIG;
@@ -2018,13 +2263,22 @@ function elgg_get_active_sticky_form() {
return (elgg_is_sticky_form($form_name)) ? $form_name : FALSE;
}
+/**
+ * Sets the active sticky form.
+ *
+ * @param string $form_name
+ * @link http://docs.elgg.org/Tutorials/UI/StickyForms
+ */
function elgg_set_active_sticky_form($form_name) {
global $CONFIG;
$CONFIG->active_sticky_form = $form_name;
}
+
/**
- * Returns the PHP INI setting in bytes
+ * Returns a PHP INI setting in bytes.
+ *
+ * @tip Use this for arithmetic when determining if a file can be uploaded.
*
* @param str $setting
* @return int
@@ -2051,10 +2305,14 @@ function elgg_get_ini_setting_in_bytes($setting) {
}
/**
- * Server javascript pages.
+ * Serve javascript pages.
+ *
+ * Searches for views under js/ and outputs them with special
+ * headers for caching control.
*
* @param $page
* @return unknown_type
+ * @elgg_pagehandler js
*/
function js_page_handler($page) {
if (is_array($page) && sizeof($page)) {
@@ -2073,9 +2331,14 @@ function js_page_handler($page) {
}
/**
- * This function is a shutdown hook registered on startup which does nothing more than trigger a
- * shutdown event when the script is shutting down, but before database connections have been dropped etc.
+ * Emits a shutdown:system event upon PHP shutdown, but before database connections are dropped.
+ *
+ * @tip Register for the shutdown:system event to perform functions at the end of page loads.
+ *
+ * @warning Using this event to perform long-running functions is not very useful. Servers will hold pages until processing is done
+ * before sending them out to the browser.
*
+ * @see register_shutdown_hook()
*/
function __elgg_shutdown_hook() {
global $START_MICROTIME;
@@ -2088,28 +2351,31 @@ function __elgg_shutdown_hook() {
}
/**
- * Register functions for Elgg core
+ * Elgg's main init.
*
- * @return unknown_type
+ * Handles core actions for comments and likes, the JS pagehandler, and the shutdown function.
+ *
+ * @elgg_event_handler init system
*/
function elgg_init() {
global $CONFIG;
- // Actions
register_action('comments/add');
register_action('comments/delete');
register_action('likes/add');
register_action('likes/delete');
- // Page handler for JS
- register_page_handler('js','js_page_handler');
+ register_page_handler('js', 'js_page_handler');
- // Register an event triggered at system shutdown
+ // Trigger the shutdown:system event upon PHP shutdown.
register_shutdown_function('__elgg_shutdown_hook');
}
/**
- * Walled garden system:index plugin hook.
+ * Intercepts the index page when Walled Garden mode is enabled.
+ *
+ * @link http://docs.elgg.org/Tutorials/WalledGarden
+ * @elgg_plugin_hook index system
*/
function elgg_walled_garden_index() {
$login = elgg_view('account/forms/login_walled_garden');
@@ -2121,7 +2387,9 @@ function elgg_walled_garden_index() {
}
/**
- * Runs unit tests for the API.
+ * Adds unit tests for the general API.
+ *
+ * @elgg_plugin_hook unit_tests system
*/
function elgg_api_test($hook, $type, $value, $params) {
global $CONFIG;
@@ -2132,9 +2400,14 @@ function elgg_api_test($hook, $type, $value, $params) {
}
/**
- * Sorts out the featured URLs and the "more" dropdown
+ * 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');
@@ -2152,7 +2425,7 @@ function elgg_get_nav_items() {
// make sure the url is a valid link.
// this prevents disabled plugins leaving behind
- // valid links when no using a pagehandler.
+ // valid links when not using a pagehandler.
foreach ($featured_urls_info as $info) {
if (in_array($info->value->url, $valid_urls)) {
$featured_urls[] = $info->value->url;
@@ -2174,8 +2447,14 @@ function elgg_get_nav_items() {
}
/**
- * Hook that registers the custom menu items.
+ * 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
*/
function add_custom_menu_items() {
if ($custom_items = get_config('menu_items_custom_items')) {
@@ -2186,7 +2465,11 @@ function add_custom_menu_items() {
}
/**
- * Test two URLs to see if they are functionally identical.
+ * Test if two URLs are functionally identical.
+ *
+ * @tip If $ignore_params is used, neither the name nor its value will be considered when comparing.
+ *
+ * @tip The order of GET params doesn't matter.
*
* @param string $url1
* @param string $url2
@@ -2277,9 +2560,16 @@ function elgg_http_url_is_identical($url1, $url2, $ignore_params = array('offset
}
/**
- * Checks walled garden status upon Elgg init.
+ * Checks the status of the Walled Garden and forwards to a login page
+ * if required.
+ *
+ * If the site is in Walled Garden mode, all page except those registered as
+ * plugin pages by {@elgg_hook public_pages walled_garden} will redirect to
+ * a login page.
*
* @since 1.8
+ * @elgg_event_handler init system
+ * @link http://docs.elgg.org/Tutorials/WalledGarden
*/
function elgg_walled_garden() {
global $CONFIG;
@@ -2307,8 +2597,10 @@ function elgg_get_array_value($key, array $array, $default = NULL) {
/**
* Sorts a 3d array by specific element.
- * Will re-index numeric indexes.
- * NB: This operates the same as the built-in sort functions.
+ *
+ * @warning Will re-index numeric indexes.
+ *
+ * @note This operates the same as the built-in sort functions.
* ie, sorts the array and returns a bool for success.
*
* Do this: elgg_sort_3d_array_by_value($my_array);
@@ -2334,29 +2626,58 @@ function elgg_sort_3d_array_by_value(&$array, $element, $sort_order = SORT_ASC,
return array_multisort($sort, $sort_order, $sort_type, $array);
}
-/**
- * Some useful constant definitions
+
+/**#@+
+ * Controlls access levels on ElggEntity entities, metadata, and annotations.
+ *
+ * @var int
*/
define('ACCESS_DEFAULT', -1);
define('ACCESS_PRIVATE', 0);
define('ACCESS_LOGGED_IN', 1);
define('ACCESS_PUBLIC', 2);
define('ACCESS_FRIENDS', -2);
+/**#@-*/
/**
- * @since 1.7.0
+ * Constant to request the value of a parameter be ignored in elgg_get_*() functions
+ *
+ * @see elgg_get_entities()
+ * @var NULL
+ * @since 1.7
*/
define('ELGG_ENTITIES_ANY_VALUE', NULL);
+
+/**
+ * Constant to request the value of a parameter be nothing in elgg_get_*() functions.
+ *
+ * @see elgg_get_entities()
+ * @var int 0
+ * @since 1.7
+ */
define('ELGG_ENTITIES_NO_VALUE', 0);
/**
- * @since 1.7.2
+ * Used in calls to forward() to specify the browser should be redirected to the
+ * referring page.
+ *
+ * @see forward
+ * @var unknown_type
*/
define('REFERRER', -1);
+
+/**
+ * Alternate spelling for REFERRER. Included because of some bad documentation
+ * in the original HTTP spec.
+ *
+ * @see forward()
+ * @link http://en.wikipedia.org/wiki/HTTP_referrer#Origin_of_the_term_referer
+ * @var int -1
+ */
define('REFERER', -1);
register_elgg_event_handler('init', 'system', 'elgg_init');
register_plugin_hook('unit_test', 'system', 'elgg_api_test');
register_elgg_event_handler('init', 'system', 'add_custom_menu_items', 1000);
-register_elgg_event_handler('init', 'system', 'elgg_walled_garden', 1000);
+register_elgg_event_handler('init', 'system', 'elgg_walled_garden', 1000); \ No newline at end of file