diff -r 5b37998e522e -r 162c1de6545a web/lib/Zend/Navigation/Page.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/lib/Zend/Navigation/Page.php Fri Mar 11 15:05:35 2011 +0100 @@ -0,0 +1,1145 @@ +toArray(); + } + + if (!is_array($options)) { + require_once 'Zend/Navigation/Exception.php'; + throw new Zend_Navigation_Exception( + 'Invalid argument: $options must be an array or Zend_Config'); + } + + if (isset($options['type'])) { + $type = $options['type']; + } elseif(self::getDefaultPageType()!= null) { + $type = self::getDefaultPageType(); + } + + if(isset($type)) { + if (is_string($type) && !empty($type)) { + switch (strtolower($type)) { + case 'mvc': + $type = 'Zend_Navigation_Page_Mvc'; + break; + case 'uri': + $type = 'Zend_Navigation_Page_Uri'; + break; + } + + if (!class_exists($type)) { + require_once 'Zend/Loader.php'; + @Zend_Loader::loadClass($type); + } + + $page = new $type($options); + if (!$page instanceof Zend_Navigation_Page) { + require_once 'Zend/Navigation/Exception.php'; + throw new Zend_Navigation_Exception(sprintf( + 'Invalid argument: Detected type "%s", which ' . + 'is not an instance of Zend_Navigation_Page', + $type)); + } + return $page; + } + } + + $hasUri = isset($options['uri']); + $hasMvc = isset($options['action']) || isset($options['controller']) || + isset($options['module']) || isset($options['route']); + + if ($hasMvc) { + require_once 'Zend/Navigation/Page/Mvc.php'; + return new Zend_Navigation_Page_Mvc($options); + } elseif ($hasUri) { + require_once 'Zend/Navigation/Page/Uri.php'; + return new Zend_Navigation_Page_Uri($options); + } else { + require_once 'Zend/Navigation/Exception.php'; + throw new Zend_Navigation_Exception( + 'Invalid argument: Unable to determine class to instantiate'); + } + } + + /** + * Page constructor + * + * @param array|Zend_Config $options [optional] page options. Default is + * null, which should set defaults. + * @throws Zend_Navigation_Exception if invalid options are given + */ + public function __construct($options = null) + { + if (is_array($options)) { + $this->setOptions($options); + } elseif ($options instanceof Zend_Config) { + $this->setConfig($options); + } + + // do custom initialization + $this->_init(); + } + + /** + * Initializes page (used by subclasses) + * + * @return void + */ + protected function _init() + { + } + + /** + * Sets page properties using a Zend_Config object + * + * @param Zend_Config $config config object to get properties from + * @return Zend_Navigation_Page fluent interface, returns self + * @throws Zend_Navigation_Exception if invalid options are given + */ + public function setConfig(Zend_Config $config) + { + return $this->setOptions($config->toArray()); + } + + /** + * Sets page properties using options from an associative array + * + * Each key in the array corresponds to the according set*() method, and + * each word is separated by underscores, e.g. the option 'target' + * corresponds to setTarget(), and the option 'reset_params' corresponds to + * the method setResetParams(). + * + * @param array $options associative array of options to set + * @return Zend_Navigation_Page fluent interface, returns self + * @throws Zend_Navigation_Exception if invalid options are given + */ + public function setOptions(array $options) + { + foreach ($options as $key => $value) { + $this->set($key, $value); + } + + return $this; + } + + // Accessors: + + /** + * Sets page label + * + * @param string $label new page label + * @return Zend_Navigation_Page fluent interface, returns self + * @throws Zend_Navigation_Exception if empty/no string is given + */ + public function setLabel($label) + { + if (null !== $label && !is_string($label)) { + require_once 'Zend/Navigation/Exception.php'; + throw new Zend_Navigation_Exception( + 'Invalid argument: $label must be a string or null'); + } + + $this->_label = $label; + return $this; + } + + /** + * Returns page label + * + * @return string page label or null + */ + public function getLabel() + { + return $this->_label; + } + + /** + * Sets page id + * + * @param string|null $id [optional] id to set. Default is null, + * which sets no id. + * @return Zend_Navigation_Page fluent interface, returns self + * @throws Zend_Navigation_Exception if not given string or null + */ + public function setId($id = null) + { + if (null !== $id && !is_string($id) && !is_numeric($id)) { + require_once 'Zend/Navigation/Exception.php'; + throw new Zend_Navigation_Exception( + 'Invalid argument: $id must be a string, number or null'); + } + + $this->_id = null === $id ? $id : (string) $id; + + return $this; + } + + /** + * Returns page id + * + * @return string|null page id or null + */ + public function getId() + { + return $this->_id; + } + + /** + * Sets page CSS class + * + * @param string|null $class [optional] CSS class to set. Default + * is null, which sets no CSS class. + * @return Zend_Navigation_Page fluent interface, returns self + * @throws Zend_Navigation_Exception if not given string or null + */ + public function setClass($class = null) + { + if (null !== $class && !is_string($class)) { + require_once 'Zend/Navigation/Exception.php'; + throw new Zend_Navigation_Exception( + 'Invalid argument: $class must be a string or null'); + } + + $this->_class = $class; + return $this; + } + + /** + * Returns page class (CSS) + * + * @return string|null page's CSS class or null + */ + public function getClass() + { + return $this->_class; + } + + /** + * Sets page title + * + * @param string $title [optional] page title. Default is + * null, which sets no title. + * @return Zend_Navigation_Page fluent interface, returns self + * @throws Zend_Navigation_Exception if not given string or null + */ + public function setTitle($title = null) + { + if (null !== $title && !is_string($title)) { + require_once 'Zend/Navigation/Exception.php'; + throw new Zend_Navigation_Exception( + 'Invalid argument: $title must be a non-empty string'); + } + + $this->_title = $title; + return $this; + } + + /** + * Returns page title + * + * @return string|null page title or null + */ + public function getTitle() + { + return $this->_title; + } + + /** + * Sets page target + * + * @param string|null $target [optional] target to set. Default is + * null, which sets no target. + * @return Zend_Navigation_Page fluent interface, returns self + * @throws Zend_Navigation_Exception if target is not string or null + */ + public function setTarget($target = null) + { + if (null !== $target && !is_string($target)) { + require_once 'Zend/Navigation/Exception.php'; + throw new Zend_Navigation_Exception( + 'Invalid argument: $target must be a string or null'); + } + + $this->_target = $target; + return $this; + } + + /** + * Returns page target + * + * @return string|null page target or null + */ + public function getTarget() + { + return $this->_target; + } + + /** + * Sets the page's forward links to other pages + * + * This method expects an associative array of forward links to other pages, + * where each element's key is the name of the relation (e.g. alternate, + * prev, next, help, etc), and the value is a mixed value that could somehow + * be considered a page. + * + * @param array|Zend_Config $relations [optional] an associative array of + * forward links to other pages + * @return Zend_Navigation_Page fluent interface, returns self + */ + public function setRel($relations = null) + { + $this->_rel = array(); + + if (null !== $relations) { + if ($relations instanceof Zend_Config) { + $relations = $relations->toArray(); + } + + if (!is_array($relations)) { + require_once 'Zend/Navigation/Exception.php'; + throw new Zend_Navigation_Exception( + 'Invalid argument: $relations must be an ' . + 'array or an instance of Zend_Config'); + } + + foreach ($relations as $name => $relation) { + if (is_string($name)) { + $this->_rel[$name] = $relation; + } + } + } + + return $this; + } + + /** + * Returns the page's forward links to other pages + * + * This method returns an associative array of forward links to other pages, + * where each element's key is the name of the relation (e.g. alternate, + * prev, next, help, etc), and the value is a mixed value that could somehow + * be considered a page. + * + * @param string $relation [optional] name of relation to return. If not + * given, all relations will be returned. + * @return array an array of relations. If $relation is not + * specified, all relations will be returned in + * an associative array. + */ + public function getRel($relation = null) + { + if (null !== $relation) { + return isset($this->_rel[$relation]) ? + $this->_rel[$relation] : + null; + } + + return $this->_rel; + } + + /** + * Sets the page's reverse links to other pages + * + * This method expects an associative array of reverse links to other pages, + * where each element's key is the name of the relation (e.g. alternate, + * prev, next, help, etc), and the value is a mixed value that could somehow + * be considered a page. + * + * @param array|Zend_Config $relations [optional] an associative array of + * reverse links to other pages + * @return Zend_Navigation_Page fluent interface, returns self + */ + public function setRev($relations = null) + { + $this->_rev = array(); + + if (null !== $relations) { + if ($relations instanceof Zend_Config) { + $relations = $relations->toArray(); + } + + if (!is_array($relations)) { + require_once 'Zend/Navigation/Exception.php'; + throw new Zend_Navigation_Exception( + 'Invalid argument: $relations must be an ' . + 'array or an instance of Zend_Config'); + } + + foreach ($relations as $name => $relation) { + if (is_string($name)) { + $this->_rev[$name] = $relation; + } + } + } + + return $this; + } + + /** + * Returns the page's reverse links to other pages + * + * This method returns an associative array of forward links to other pages, + * where each element's key is the name of the relation (e.g. alternate, + * prev, next, help, etc), and the value is a mixed value that could somehow + * be considered a page. + * + * @param string $relation [optional] name of relation to return. If not + * given, all relations will be returned. + * @return array an array of relations. If $relation is not + * specified, all relations will be returned in + * an associative array. + */ + public function getRev($relation = null) + { + if (null !== $relation) { + return isset($this->_rev[$relation]) ? + $this->_rev[$relation] : + null; + } + + return $this->_rev; + } + + /** + * Sets page order to use in parent container + * + * @param int $order [optional] page order in container. + * Default is null, which sets no + * specific order. + * @return Zend_Navigation_Page fluent interface, returns self + * @throws Zend_Navigation_Exception if order is not integer or null + */ + public function setOrder($order = null) + { + if (is_string($order)) { + $temp = (int) $order; + if ($temp < 0 || $temp > 0 || $order == '0') { + $order = $temp; + } + } + + if (null !== $order && !is_int($order)) { + require_once 'Zend/Navigation/Exception.php'; + throw new Zend_Navigation_Exception( + 'Invalid argument: $order must be an integer or null, ' . + 'or a string that casts to an integer'); + } + + $this->_order = $order; + + // notify parent, if any + if (isset($this->_parent)) { + $this->_parent->notifyOrderUpdated(); + } + + return $this; + } + + /** + * Returns page order used in parent container + * + * @return int|null page order or null + */ + public function getOrder() + { + return $this->_order; + } + + /** + * Sets ACL resource assoicated with this page + * + * @param string|Zend_Acl_Resource_Interface $resource [optional] resource + * to associate with + * page. Default is + * null, which sets no + * resource. + * @throws Zend_Navigation_Exception if $resource if + * invalid + * @return Zend_Navigation_Page fluent interface, + * returns self + */ + public function setResource($resource = null) + { + if (null === $resource || is_string($resource) || + $resource instanceof Zend_Acl_Resource_Interface) { + $this->_resource = $resource; + } else { + require_once 'Zend/Navigation/Exception.php'; + throw new Zend_Navigation_Exception( + 'Invalid argument: $resource must be null, a string, ' . + ' or an instance of Zend_Acl_Resource_Interface'); + } + + return $this; + } + + /** + * Returns ACL resource assoicated with this page + * + * @return string|Zend_Acl_Resource_Interface|null ACL resource or null + */ + public function getResource() + { + return $this->_resource; + } + + /** + * Sets ACL privilege associated with this page + * + * @param string|null $privilege [optional] ACL privilege to associate + * with this page. Default is null, which + * sets no privilege. + * @return Zend_Navigation_Page fluent interface, returns self + */ + public function setPrivilege($privilege = null) + { + $this->_privilege = is_string($privilege) ? $privilege : null; + return $this; + } + + /** + * Returns ACL privilege associated with this page + * + * @return string|null ACL privilege or null + */ + public function getPrivilege() + { + return $this->_privilege; + } + + /** + * Sets whether page should be considered active or not + * + * @param bool $active [optional] whether page should be + * considered active or not. Default is true. + * @return Zend_Navigation_Page fluent interface, returns self + */ + public function setActive($active = true) + { + $this->_active = (bool) $active; + return $this; + } + + /** + * Returns whether page should be considered active or not + * + * @param bool $recursive [optional] whether page should be considered + * active if any child pages are active. Default is + * false. + * @return bool whether page should be considered active + */ + public function isActive($recursive = false) + { + if (!$this->_active && $recursive) { + foreach ($this->_pages as $page) { + if ($page->isActive(true)) { + return true; + } + } + return false; + } + + return $this->_active; + } + + /** + * Proxy to isActive() + * + * @param bool $recursive [optional] whether page should be considered + * active if any child pages are active. Default + * is false. + * @return bool whether page should be considered active + */ + public function getActive($recursive = false) + { + return $this->isActive($recursive); + } + + /** + * Sets whether the page should be visible or not + * + * @param bool $visible [optional] whether page should be + * considered visible or not. Default is true. + * @return Zend_Navigation_Page fluent interface, returns self + */ + public function setVisible($visible = true) + { + $this->_visible = (bool) $visible; + return $this; + } + + /** + * Returns a boolean value indicating whether the page is visible + * + * @param bool $recursive [optional] whether page should be considered + * invisible if parent is invisible. Default is + * false. + * @return bool whether page should be considered visible + */ + public function isVisible($recursive = false) + { + if ($recursive && isset($this->_parent) && + $this->_parent instanceof Zend_Navigation_Page) { + if (!$this->_parent->isVisible(true)) { + return false; + } + } + + return $this->_visible; + } + + /** + * Proxy to isVisible() + * + * Returns a boolean value indicating whether the page is visible + * + * @param bool $recursive [optional] whether page should be considered + * invisible if parent is invisible. Default is + * false. + * @return bool whether page should be considered visible + */ + public function getVisible($recursive = false) + { + return $this->isVisible($recursive); + } + + /** + * Sets parent container + * + * @param Zend_Navigation_Container $parent [optional] new parent to set. + * Default is null which will set + * no parent. + * @return Zend_Navigation_Page fluent interface, returns self + */ + public function setParent(Zend_Navigation_Container $parent = null) + { + if ($parent === $this) { + require_once 'Zend/Navigation/Exception.php'; + throw new Zend_Navigation_Exception( + 'A page cannot have itself as a parent'); + } + + // return if the given parent already is parent + if ($parent === $this->_parent) { + return $this; + } + + // remove from old parent + if (null !== $this->_parent) { + $this->_parent->removePage($this); + } + + // set new parent + $this->_parent = $parent; + + // add to parent if page and not already a child + if (null !== $this->_parent && !$this->_parent->hasPage($this, false)) { + $this->_parent->addPage($this); + } + + return $this; + } + + /** + * Returns parent container + * + * @return Zend_Navigation_Container|null parent container or null + */ + public function getParent() + { + return $this->_parent; + } + + /** + * Sets the given property + * + * If the given property is native (id, class, title, etc), the matching + * set method will be used. Otherwise, it will be set as a custom property. + * + * @param string $property property name + * @param mixed $value value to set + * @return Zend_Navigation_Page fluent interface, returns self + * @throws Zend_Navigation_Exception if property name is invalid + */ + public function set($property, $value) + { + if (!is_string($property) || empty($property)) { + require_once 'Zend/Navigation/Exception.php'; + throw new Zend_Navigation_Exception( + 'Invalid argument: $property must be a non-empty string'); + } + + $method = 'set' . self::_normalizePropertyName($property); + + if ($method != 'setOptions' && $method != 'setConfig' && + method_exists($this, $method)) { + $this->$method($value); + } else { + $this->_properties[$property] = $value; + } + + return $this; + } + + /** + * Returns the value of the given property + * + * If the given property is native (id, class, title, etc), the matching + * get method will be used. Otherwise, it will return the matching custom + * property, or null if not found. + * + * @param string $property property name + * @return mixed the property's value or null + * @throws Zend_Navigation_Exception if property name is invalid + */ + public function get($property) + { + if (!is_string($property) || empty($property)) { + require_once 'Zend/Navigation/Exception.php'; + throw new Zend_Navigation_Exception( + 'Invalid argument: $property must be a non-empty string'); + } + + $method = 'get' . self::_normalizePropertyName($property); + + if (method_exists($this, $method)) { + return $this->$method(); + } elseif (isset($this->_properties[$property])) { + return $this->_properties[$property]; + } + + return null; + } + + // Magic overloads: + + /** + * Sets a custom property + * + * Magic overload for enabling $page->propname = $value. + * + * @param string $name property name + * @param mixed $value value to set + * @return void + * @throws Zend_Navigation_Exception if property name is invalid + */ + public function __set($name, $value) + { + $this->set($name, $value); + } + + /** + * Returns a property, or null if it doesn't exist + * + * Magic overload for enabling $page->propname. + * + * @param string $name property name + * @return mixed property value or null + * @throws Zend_Navigation_Exception if property name is invalid + */ + public function __get($name) + { + return $this->get($name); + } + + /** + * Checks if a property is set + * + * Magic overload for enabling isset($page->propname). + * + * Returns true if the property is native (id, class, title, etc), and + * true or false if it's a custom property (depending on whether the + * property actually is set). + * + * @param string $name property name + * @return bool whether the given property exists + */ + public function __isset($name) + { + $method = 'get' . self::_normalizePropertyName($name); + if (method_exists($this, $method)) { + return true; + } + + return isset($this->_properties[$name]); + } + + /** + * Unsets the given custom property + * + * Magic overload for enabling unset($page->propname). + * + * @param string $name property name + * @return void + * @throws Zend_Navigation_Exception if the property is native + */ + public function __unset($name) + { + $method = 'set' . self::_normalizePropertyName($name); + if (method_exists($this, $method)) { + require_once 'Zend/Navigation/Exception.php'; + throw new Zend_Navigation_Exception(sprintf( + 'Unsetting native property "%s" is not allowed', + $name)); + } + + if (isset($this->_properties[$name])) { + unset($this->_properties[$name]); + } + } + + /** + * Returns page label + * + * Magic overload for enabling echo $page. + * + * @return string page label + */ + public function __toString() + { + return $this->_label; + } + + // Public methods: + + /** + * Adds a forward relation to the page + * + * @param string $relation relation name (e.g. alternate, glossary, + * canonical, etc) + * @param mixed $value value to set for relation + * @return Zend_Navigation_Page fluent interface, returns self + */ + public function addRel($relation, $value) + { + if (is_string($relation)) { + $this->_rel[$relation] = $value; + } + return $this; + } + + /** + * Adds a reverse relation to the page + * + * @param string $relation relation name (e.g. alternate, glossary, + * canonical, etc) + * @param mixed $value value to set for relation + * @return Zend_Navigation_Page fluent interface, returns self + */ + public function addRev($relation, $value) + { + if (is_string($relation)) { + $this->_rev[$relation] = $value; + } + return $this; + } + + /** + * Removes a forward relation from the page + * + * @param string $relation name of relation to remove + * @return Zend_Navigation_Page fluent interface, returns self + */ + public function removeRel($relation) + { + if (isset($this->_rel[$relation])) { + unset($this->_rel[$relation]); + } + + return $this; + } + + /** + * Removes a reverse relation from the page + * + * @param string $relation name of relation to remove + * @return Zend_Navigation_Page fluent interface, returns self + */ + public function removeRev($relation) + { + if (isset($this->_rev[$relation])) { + unset($this->_rev[$relation]); + } + + return $this; + } + + /** + * Returns an array containing the defined forward relations + * + * @return array defined forward relations + */ + public function getDefinedRel() + { + return array_keys($this->_rel); + } + + /** + * Returns an array containing the defined reverse relations + * + * @return array defined reverse relations + */ + public function getDefinedRev() + { + return array_keys($this->_rev); + } + + /** + * Returns custom properties as an array + * + * @return array an array containing custom properties + */ + public function getCustomProperties() + { + return $this->_properties; + } + + /** + * Returns a hash code value for the page + * + * @return string a hash code value for this page + */ + public final function hashCode() + { + return spl_object_hash($this); + } + + /** + * Returns an array representation of the page + * + * @return array associative array containing all page properties + */ + public function toArray() + { + return array_merge( + $this->getCustomProperties(), + array( + 'label' => $this->getlabel(), + 'id' => $this->getId(), + 'class' => $this->getClass(), + 'title' => $this->getTitle(), + 'target' => $this->getTarget(), + 'rel' => $this->getRel(), + 'rev' => $this->getRev(), + 'order' => $this->getOrder(), + 'resource' => $this->getResource(), + 'privilege' => $this->getPrivilege(), + 'active' => $this->isActive(), + 'visible' => $this->isVisible(), + 'type' => get_class($this), + 'pages' => parent::toArray() + )); + } + + // Internal methods: + + /** + * Normalizes a property name + * + * @param string $property property name to normalize + * @return string normalized property name + */ + protected static function _normalizePropertyName($property) + { + return str_replace(' ', '', ucwords(str_replace('_', ' ', $property))); + } + + public static function setDefaultPageType($type = null) { + if($type !== null && !is_string($type)) { + throw new Zend_Navigation_Exception( + 'Cannot set default page type: type is no string but should be' + ); + } + + self::$_defaultPageType = $type; + } + + public static function getDefaultPageType() { + return self::$_defaultPageType; + } + + // Abstract methods: + + /** + * Returns href for this page + * + * @return string the page's href + */ + abstract public function getHref(); +}