diff options
Diffstat (limited to 'engine/classes/ElggSession.php')
| -rw-r--r-- | engine/classes/ElggSession.php | 153 | 
1 files changed, 153 insertions, 0 deletions
| diff --git a/engine/classes/ElggSession.php b/engine/classes/ElggSession.php new file mode 100644 index 000000000..9750f063e --- /dev/null +++ b/engine/classes/ElggSession.php @@ -0,0 +1,153 @@ +<?php +/** + * Magic session class. + * This class is intended to extend the $_SESSION magic variable by providing an API hook + * to plug in other values. + * + * Primarily this is intended to provide a way of supplying "logged in user" + * details without touching the session (which can cause problems when + * accessed server side). + * + * If a value is present in the session then that value is returned, otherwise + * a plugin hook 'session:get', '$var' is called, where $var is the variable + * being requested. + * + * Setting values will store variables in the session in the normal way. + * + * LIMITATIONS: You can not access multidimensional arrays + * + * @package    Elgg.Core + * @subpackage Sessions + */ +class ElggSession implements ArrayAccess { +	/** Local cache of trigger retrieved variables */ +	private static $__localcache; + +	/** +	 * Test if property is set either as an attribute or metadata. +	 * +	 * @param string $key The name of the attribute or metadata. +	 * +	 * @return bool +	 */ +	function __isset($key) { +		return $this->offsetExists($key); +	} + +	/** +	 * Set a value, go straight to session. +	 * +	 * @param string $key   Name +	 * @param mixed  $value Value +	 * +	 * @return void +	 */ +	function offsetSet($key, $value) { +		$_SESSION[$key] = $value; +	} + +	/** +	 * Get a variable from either the session, or if its not in the session +	 * attempt to get it from an api call. +	 * +	 * @see ArrayAccess::offsetGet() +	 * +	 * @param mixed $key Name +	 * +	 * @return mixed +	 */ +	function offsetGet($key) { +		if (!ElggSession::$__localcache) { +			ElggSession::$__localcache = array(); +		} + +		if (isset($_SESSION[$key])) { +			return $_SESSION[$key]; +		} + +		if (isset(ElggSession::$__localcache[$key])) { +			return ElggSession::$__localcache[$key]; +		} + +		$value = NULL; +		$value = elgg_trigger_plugin_hook('session:get', $key, NULL, $value); + +		ElggSession::$__localcache[$key] = $value; + +		return ElggSession::$__localcache[$key]; +	} + +	/** +	 * Unset a value from the cache and the session. +	 * +	 * @see ArrayAccess::offsetUnset() +	 * +	 * @param mixed $key Name +	 * +	 * @return void +	 */ +	function offsetUnset($key) { +		unset(ElggSession::$__localcache[$key]); +		unset($_SESSION[$key]); +	} + +	/** +	 * Return whether the value is set in either the session or the cache. +	 * +	 * @see ArrayAccess::offsetExists() +	 * +	 * @param int $offset Offset +	 * +	 * @return bool +	 */ +	function offsetExists($offset) { +		if (isset(ElggSession::$__localcache[$offset])) { +			return true; +		} + +		if (isset($_SESSION[$offset])) { +			return true; +		} + +		if ($this->offsetGet($offset)) { +			return true; +		} + +		return false; +	} + + +	/** +	 * Alias to ::offsetGet() +	 * +	 * @param string $key Name +	 * +	 * @return mixed +	 */ +	function get($key) { +		return $this->offsetGet($key); +	} + +	/** +	 * Alias to ::offsetSet() +	 * +	 * @param string $key   Name +	 * @param mixed  $value Value +	 * +	 * @return void +	 */ +	function set($key, $value) { +		$this->offsetSet($key, $value); +	} + +	/** +	 * Alias to offsetUnset() +	 * +	 * @param string $key Name +	 * +	 * @return void +	 */ +	function del($key) { +		$this->offsetUnset($key); +	} +} | 
