You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
520 lines
13 KiB
520 lines
13 KiB
<?php
|
|
|
|
// +---------------------------------------------------------------------------+
|
|
// | This file is part of the core package. |
|
|
// | Copyright (c) laiketui.com |
|
|
// | |
|
|
// | For the full copyright and license information, please view the LICENSE |
|
|
// | file that was distributed with this source code. You can also view the |
|
|
// | LICENSE file online at http://www.laiketui.com |
|
|
// +---------------------------------------------------------------------------+
|
|
|
|
/**
|
|
* User wraps a client session and provides accessor methods for user
|
|
* attributes. It also makes storing and retrieving multiple page form data
|
|
* rather easy by allowing user attributes to be stored in namespaces, which
|
|
* help organize data.
|
|
*
|
|
* @package laiketui
|
|
* @subpackage user
|
|
*
|
|
* @author ketter (ketter@laiketui.com)
|
|
* @since 3.0.0
|
|
*/
|
|
class User extends ParameterHolder
|
|
{
|
|
|
|
// +-----------------------------------------------------------------------+
|
|
// | CONSTANTS |
|
|
// +-----------------------------------------------------------------------+
|
|
|
|
/**
|
|
* The namespace under which attributes will be stored.
|
|
*
|
|
* @since 3.0.0
|
|
*/
|
|
const ATTRIBUTE_NAMESPACE = 'org/mojavi/user/User/attributes';
|
|
|
|
// +-----------------------------------------------------------------------+
|
|
// | PRIVATE VARIABLES |
|
|
// +-----------------------------------------------------------------------+
|
|
|
|
private
|
|
$attributes = null;
|
|
|
|
// +-----------------------------------------------------------------------+
|
|
// | METHODS |
|
|
// +-----------------------------------------------------------------------+
|
|
|
|
/**
|
|
* Clear all attributes associated with this user.
|
|
*
|
|
* @return void
|
|
*
|
|
* @author ketter (ketter@laiketui.com)
|
|
* @since 3.0.0
|
|
*/
|
|
public function clearAttributes ()
|
|
{
|
|
|
|
$this->attributes = null;
|
|
$this->attributes = array();
|
|
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Retrieve an attribute.
|
|
*
|
|
* @param string An attribute name.
|
|
* @param string An attribute namespace.
|
|
*
|
|
* @return mixed An attribute value, if the attribute exists, otherwise
|
|
* null.
|
|
*
|
|
* @author ketter (ketter@laiketui.com)
|
|
* @since 3.0.0
|
|
*/
|
|
public function & getAttribute ($name, $ns = MO_USER_NAMESPACE)
|
|
{
|
|
|
|
$retval = null;
|
|
|
|
if (isset($this->attributes[$ns]) &&
|
|
isset($this->attributes[$ns][$name]))
|
|
{
|
|
|
|
return $this->attributes[$ns][$name];
|
|
|
|
}
|
|
|
|
return $retval;
|
|
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Retrieve an array of attribute names.
|
|
*
|
|
* @param string An attribute namespace.
|
|
*
|
|
* @return array An indexed array of attribute names, if the namespace
|
|
* exists, otherwise null.
|
|
*
|
|
* @author ketter (ketter@laiketui.com)
|
|
* @since 3.0.0
|
|
*/
|
|
public function getAttributeNames ($ns = MO_USER_NAMESPACE)
|
|
{
|
|
|
|
if (isset($this->attributes[$ns]))
|
|
{
|
|
|
|
return array_keys($this->attributes[$ns]);
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Retrieve all attributes within a namespace.
|
|
*
|
|
* @param string An attribute namespace.
|
|
*
|
|
* @return array An associative array of attributes.
|
|
*
|
|
* @author ketter (ketter@laiketui.com)
|
|
* @since 3.0.0
|
|
*/
|
|
public function & getAttributeNamespace ($ns = MO_USER_NAMESPACE)
|
|
{
|
|
|
|
$retval = null;
|
|
|
|
if (isset($this->attributes[$ns]))
|
|
{
|
|
|
|
return $this->attributes[$ns];
|
|
|
|
}
|
|
|
|
return $retval;
|
|
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Retrieve an array of attribute namespaces.
|
|
*
|
|
* @return array An indexed array of attribute namespaces.
|
|
*
|
|
* @author ketter (ketter@laiketui.com)
|
|
* @since 3.0.0
|
|
*/
|
|
public function getAttributeNamespaces ()
|
|
{
|
|
|
|
return array_keys($this->attributes);
|
|
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Retrieve the current application context.
|
|
*
|
|
* @return Context A Context instance.
|
|
*
|
|
* @author ketter (ketter@laiketui.com)
|
|
* @since 3.0.0
|
|
*/
|
|
public function getContext ()
|
|
{
|
|
|
|
return $this->context;
|
|
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Indicates whether or not an attribute exists.
|
|
*
|
|
* @param string An attribute name.
|
|
* @param string An attribute namespace.
|
|
*
|
|
* @return bool true, if the attribute exists, otherwise false.
|
|
*
|
|
* @author ketter (ketter@laiketui.com)
|
|
* @since 3.0.0
|
|
*/
|
|
public function hasAttribute ($name, $ns = MO_USER_NAMESPACE)
|
|
{
|
|
|
|
if (isset($this->attributes[$ns]))
|
|
{
|
|
|
|
return isset($this->attributes[$ns][$name]);
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Indicates whether or not an attribute namespace exists.
|
|
*
|
|
* @param string An attribute namespace.
|
|
*
|
|
* @return bool true, if the namespace exists, otherwise false.
|
|
*
|
|
* @author ketter (ketter@laiketui.com)
|
|
* @since 3.0.0
|
|
*/
|
|
public function hasAttributeNamespace ($ns)
|
|
{
|
|
|
|
return isset($this->attributes[$ns]);
|
|
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Initialize this User.
|
|
*
|
|
* @param Context A Context instance.
|
|
* @param array An associative array of initialization parameters.
|
|
*
|
|
* @return bool true, if initialization completes successfully, otherwise
|
|
* false.
|
|
*
|
|
* @throws <b>InitializationException</b> If an error occurs while
|
|
* initializing this User.
|
|
*
|
|
* @author ketter (ketter@laiketui.com)
|
|
* @since 3.0.0
|
|
*/
|
|
public function initialize ($context, $parameters = null)
|
|
{
|
|
|
|
$this->context = $context;
|
|
|
|
if ($parameters != null)
|
|
{
|
|
|
|
$this->parameters = array_merge($this->parameters, $parameters);
|
|
|
|
}
|
|
|
|
// read data from storage
|
|
$this->attributes = $this->getContext()
|
|
->getStorage()
|
|
->read(self::ATTRIBUTE_NAMESPACE);
|
|
|
|
if ($this->attributes == null)
|
|
{
|
|
|
|
// initialize our attributes array
|
|
$this->attributes = array();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Retrieve a new User implementation instance.
|
|
*
|
|
* @param string A User implementation name
|
|
*
|
|
* @return User A User implementation instance.
|
|
*
|
|
* @throws <b>FactoryException</b> If a user implementation instance cannot
|
|
* be created.
|
|
*
|
|
* @author ketter (ketter@laiketui.com)
|
|
* @since 3.0.0
|
|
*/
|
|
public static function newInstance ($class)
|
|
{
|
|
|
|
// the class exists
|
|
$object = new $class();
|
|
|
|
if (!($object instanceof User))
|
|
{
|
|
|
|
// the class name is of the wrong type
|
|
$error = 'Class "%s" is not of the type User';
|
|
$error = sprintf($error, $class);
|
|
|
|
throw new FactoryException($error);
|
|
|
|
}
|
|
|
|
return $object;
|
|
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Remove an attribute.
|
|
*
|
|
* @param string An attribute name.
|
|
* @param string An attribute namespace.
|
|
*
|
|
* @return mixed An attribute value, if the attribute was removed,
|
|
* otherwise null.
|
|
*
|
|
* @author ketter (ketter@laiketui.com)
|
|
* @since 3.0.0
|
|
*/
|
|
public function & removeAttribute ($name, $ns = MO_USER_NAMESPACE)
|
|
{
|
|
|
|
$retval = null;
|
|
|
|
if (isset($this->attributes[$ns]) &&
|
|
isset($this->attributes[$ns][$name]))
|
|
{
|
|
|
|
$retval =& $this->attributes[$ns][$name];
|
|
|
|
unset($this->attributes[$ns][$name]);
|
|
|
|
}
|
|
|
|
return $retval;
|
|
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Remove an attribute namespace and all of its associated attributes.
|
|
*
|
|
* @param string An attribute namespace.
|
|
*
|
|
* @return void
|
|
*
|
|
* @author ketter (ketter@laiketui.com)
|
|
* @since 3.0.0
|
|
*/
|
|
public function removeAttributeNamespace ($ns)
|
|
{
|
|
|
|
if (isset($this->attributes[$ns]))
|
|
{
|
|
|
|
unset($this->attributes[$ns]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Set an attribute.
|
|
*
|
|
* If an attribute with the name already exists the value will be
|
|
* overridden.
|
|
*
|
|
* @param string An attribute name.
|
|
* @param mixed An attribute value.
|
|
* @param string An attribute namespace.
|
|
*
|
|
* @return void
|
|
*
|
|
* @author ketter (ketter@laiketui.com)
|
|
* @since 3.0.0
|
|
*/
|
|
public function setAttribute ($name, $value, $ns = MO_USER_NAMESPACE)
|
|
{
|
|
|
|
if (!isset($this->attributes[$ns]))
|
|
{
|
|
|
|
$this->attributes[$ns] = array();
|
|
|
|
}
|
|
|
|
$this->attributes[$ns][$name] = $value;
|
|
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Set an attribute by reference.
|
|
*
|
|
* If an attribute with the name already exists the value will be
|
|
* overridden.
|
|
*
|
|
* @param string An attribute name.
|
|
* @param mixed A reference to an attribute value.
|
|
* @param string An attribute namespace.
|
|
*
|
|
* @return void
|
|
*
|
|
* @author ketter (ketter@laiketui.com)
|
|
* @since 3.0.0
|
|
*/
|
|
public function setAttributeByRef ($name, &$value, $ns = MO_USER_NAMESPACE)
|
|
{
|
|
|
|
if (!isset($this->attributes[$ns]))
|
|
{
|
|
|
|
$this->attributes[$ns] = array();
|
|
|
|
}
|
|
|
|
$this->attributes[$ns][$name] =& $value;
|
|
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Set an array of attributes.
|
|
*
|
|
* If an existing attribute name matches any of the keys in the supplied
|
|
* array, the associated value will be overridden.
|
|
*
|
|
* @param array An associative array of attributes and their associated
|
|
* values.
|
|
* @param string An attribute namespace.
|
|
*
|
|
* @return void
|
|
*
|
|
* @author ketter (ketter@laiketui.com)
|
|
* @since 3.0.0
|
|
*/
|
|
public function setAttributes ($attributes, $ns = MO_USER_NAMESPACE)
|
|
{
|
|
|
|
if (!isset($this->attributes[$ns]))
|
|
{
|
|
|
|
$this->attributes[$ns] = array();
|
|
|
|
}
|
|
|
|
$this->attributes[$ns] = array_merge($this->attributes[$ns],
|
|
$attributes);
|
|
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Set an array of attributes by reference.
|
|
*
|
|
* If an existing attribute name matches any of the keys in the supplied
|
|
* array, the associated value will be overridden.
|
|
*
|
|
* @param array An associative array of attributes and references to their
|
|
* associated values.
|
|
* @param string An attribute namespace.
|
|
*
|
|
* @return void
|
|
*
|
|
* @author ketter (ketter@laiketui.com)
|
|
* @since 3.0.0
|
|
*/
|
|
public function setAttributesByRef (&$attributes, $ns = MO_USER_NAMESPACE)
|
|
{
|
|
|
|
if (!isset($this->attributes[$ns]))
|
|
{
|
|
|
|
$this->attributes[$ns] = array();
|
|
|
|
}
|
|
|
|
foreach ($attributes as $key => &$value)
|
|
{
|
|
|
|
$this->attributes[$ns][$key] =& $value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Execute the shutdown procedure.
|
|
*
|
|
* @return void
|
|
*
|
|
* @author ketter (ketter@laiketui.com)
|
|
* @since 3.0.0
|
|
*/
|
|
public function shutdown ()
|
|
{
|
|
|
|
// write attributes to the storage
|
|
$this->getContext()
|
|
->getStorage()
|
|
->write(self::ATTRIBUTE_NAMESPACE, $this->attributes);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
?>
|