* (c) 2004-2006 Sean Kerr. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * sfParameterHolder provides a base class for managing parameters. * * Parameters, in this case, are used to extend classes with additional data * that requires no additional logic to manage. * * @package symfony * @subpackage util * @author Fabien Potencier * @author Sean Kerr * @version SVN: $Id: sfParameterHolder.class.php 3329 2007-01-23 08:29:34Z fabien $ */ class sfParameterHolder { protected $default_namespace = null; protected $parameters = array(); /** * The constructor for sfParameterHolder. * * The default namespace may be overridden at initialization as follows: * * * */ public function __construct($namespace = 'symfony/default') { $this->default_namespace = $namespace; } /** * Get the default namespace value. * * The $default_namespace is defined as 'symfony/default'. * * @return string The default namespace. */ public function getDefaultNamespace() { return $this->default_namespace; } /** * Clear all parameters associated with this request. * * @return void */ public function clear() { $this->parameters = null; $this->parameters = array(); } /** * Retrieve a parameter with an optionally specified namespace. * * An isolated namespace may be identified by providing a value for the third * argument. If not specified, the default namespace 'symfony/default' is * used. * * @param string A parameter name. * @param mixed A default parameter value. * @param string A parameter namespace. * * @return mixed A parameter value, if the parameter exists, otherwise null. */ public function & get($name, $default = null, $ns = null) { if (!$ns) { $ns = $this->default_namespace; } if (isset($this->parameters[$ns][$name])) { $value = & $this->parameters[$ns][$name]; } else if (isset($this->parameters[$ns])) { $value = sfToolkit::getArrayValueForPath($this->parameters[$ns], $name, $default); } else { $value = $default; } return $value; } /** * Retrieve an array of parameter names from an optionally specified namespace. * * @param string A parameter namespace. * * @return array An indexed array of parameter names, if the namespace exists, otherwise null. */ public function getNames($ns = null) { if (!$ns) { $ns = $this->default_namespace; } if (isset($this->parameters[$ns])) { return array_keys($this->parameters[$ns]); } return array(); } /** * Retrieve an array of parameter namespaces. * * @return array An indexed array of parameter namespaces. */ public function getNamespaces() { return array_keys($this->parameters); } /** * Retrieve an array of parameters, within a namespace. * * This method is limited to a namespace. Without any argument, * it returns the parameters of the default namespace. If a * namespace is passed as an argument, only the parameters of the * specified namespace are returned. * * @param string A parameter namespace. * * @return array An associative array of parameters. */ public function & getAll($ns = null) { if (!$ns) { $ns = $this->default_namespace; } $parameters = array(); if (isset($this->parameters[$ns])) { $parameters = $this->parameters[$ns]; } return $parameters; } /** * Indicates whether or not a parameter exists. * * @param string A parameter name. * @param string A parameter namespace. * * @return bool true, if the parameter exists, otherwise false. */ public function has($name, $ns = null) { if (!$ns) { $ns = $this->default_namespace; } if (false !== ($offset = strpos($name, '['))) { if (isset($this->parameters[$ns][substr($name, 0, $offset)])) { $array = $this->parameters[$ns][substr($name, 0, $offset)]; while ($pos = strpos($name, '[', $offset)) { $end = strpos($name, ']', $pos); if ($end == $pos + 1) { // reached a [] return true; } else if (!isset($array[substr($name, $pos + 1, $end - $pos - 1)])) { return false; } $array = $array[substr($name, $pos + 1, $end - $pos - 1)]; $offset = $end; } return true; } } elseif (isset($this->parameters[$ns][$name])) { return true; } return false; } /** * Indicates whether or not A parameter namespace exists. * * @param string A parameter namespace. * * @return bool true, if the namespace exists, otherwise false. */ public function hasNamespace($ns) { return isset($this->parameters[$ns]); } /** * Remove a parameter. * * @param string A parameter name. * @param string A parameter namespace. * * @return string A parameter value, if the parameter was removed, otherwise null. */ public function & remove($name, $ns = null) { if (!$ns) { $ns = $this->default_namespace; } $retval = null; if (isset($this->parameters[$ns]) && isset($this->parameters[$ns][$name])) { $retval =& $this->parameters[$ns][$name]; unset($this->parameters[$ns][$name]); } return $retval; } /** * Remove A parameter namespace and all of its associated parameters. * * @param string A parameter namespace. * * @return void */ public function & removeNamespace($ns = null) { if (!$ns) { $ns = $this->default_namespace; } $retval = null; if (isset($this->parameters[$ns])) { $retval =& $this->parameters[$ns]; unset($this->parameters[$ns]); } return $retval; } /** * Set a parameter. * * If a parameter with the name already exists the value will be overridden. * * @param string A parameter name. * @param mixed A parameter value. * @param string A parameter namespace. * * @return void */ public function set($name, $value, $ns = null) { if (!$ns) { $ns = $this->default_namespace; } if (!isset($this->parameters[$ns])) { $this->parameters[$ns] = array(); } $this->parameters[$ns][$name] = $value; } /** * Set a parameter by reference. * * If a parameter with the name already exists the value will be overridden. * * @param string A parameter name. * @param mixed A reference to a parameter value. * @param string A parameter namespace. * * @return void */ public function setByRef($name, & $value, $ns = null) { if (!$ns) { $ns = $this->default_namespace; } if (!isset($this->parameters[$ns])) { $this->parameters[$ns] = array(); } $this->parameters[$ns][$name] =& $value; } /** * Set an array of parameters. * * If an existing parameter name matches any of the keys in the supplied * array, the associated value will be overridden. * * @param array An associative array of parameters and their associated values. * @param string A parameter namespace. * * @return void */ public function add($parameters, $ns = null) { if ($parameters === null) return; if (!$ns) { $ns = $this->default_namespace; } if (!isset($this->parameters[$ns])) { $this->parameters[$ns] = array(); } foreach ($parameters as $key => $value) { $this->parameters[$ns][$key] = $value; } } /** * Set an array of parameters by reference. * * If an existing parameter name matches any of the keys in the supplied * array, the associated value will be overridden. * * @param array An associative array of parameters and references to their associated values. * @param string A parameter namespace. * * @return void */ public function addByRef(& $parameters, $ns = null) { if (!$ns) { $ns = $this->default_namespace; } if (!isset($this->parameters[$ns])) { $this->parameters[$ns] = array(); } foreach ($parameters as $key => &$value) { $this->parameters[$ns][$key] =& $value; } } }