container = $container; foreach ($options as $k => $v) { $method = 'set' . ucfirst($k); if (method_exists($this, $method)) { $this->$method($v); } } if (empty($this->name) && ($this->title != 'ROOT')) { throw new \Exception('A menu item must have a name', 500); } if (empty($this->title) && empty($this->titleHandler)) { throw new \Exception('A menu item must have a title or a title handler', 500); } } /** * Sets the group for this menu item * * @param string $group * * @return void */ public function setGroup($group) { $this->group = $group; } /** * Returns the group of this menu item * * @return string */ public function getGroup() { return $this->group; } /** * Sets the icon classes * * @param string $icon * * @return void */ public function setIcon($icon) { $this->icon = $icon; } /** * Returns the icon classes * * @return string */ public function getIcon() { return $this->icon; } /** * Sets the name of the menu item * * @param string $name * * @return void */ public function setName($name) { $filter = new \Awf\Input\Filter(); $this->name = $filter->clean($name, 'cmd'); } /** * Returns the name of the menu item * * @return string */ public function getName() { return $this->name; } /** * Sets the handler for this menu item's title * * @param string $titleHandler * * @return void */ public function setTitleHandler($titleHandler) { if (is_string($titleHandler)) { $this->titleHandler = $titleHandler; } elseif (is_array($titleHandler)) { if (count($titleHandler) >= 2) { $class = array_shift($titleHandler); $method = array_shift($titleHandler); $this->titleHandler = array($class, $method); } } else { $this->titleHandler = ''; } } /** * Get the title handler * * @return string */ public function getTitleHandler() { return $this->titleHandler; } /** * Set the click handler * * @param string $onClick * * @return void */ public function setOnClick($onClick) { $this->onClick = $onClick; } /** * Get the click handler * * @return string */ public function getOnClick() { return $this->onClick; } /** * Set the parent menu item * * @param string $parent * * @return void */ public function setParent($parent) { $this->parent = $parent; } /** * Get the parent menu item * * @return string */ public function getParent() { return $this->parent; } /** * Set the menus this menu item is visible in * * @param array $show The menus this item is visible in * @param boolean $add When true the $show items will be added, otherwise will replace existing items * * @return void */ public function setShow($show, $add = false) { if (is_string($show)) { $show = array($show); } $this->show = $show; } /** * Get the menus this menu item is visible in * * @return array */ public function getShow() { return $this->show; } /** * Set the title of this menu item * * @param string $title * * @return void */ public function setTitle($title) { $this->title = $title; } /** * Get the title of this menu item * * @return string */ public function getTitle() { if (empty($this->title) && !empty($this->titleHandler)) { $titleHandler = $this->titleHandler; if (is_string($titleHandler)) { $this->title = $titleHandler($this); } else { $this->title = call_user_func($titleHandler, $this); } } return $this->title; } /** * Set the custom URL * * @param string $url * * @return void */ public function setUrl($url) { $this->url = $url; } /** * Get the URL associated with this menu item. If no custom URL is * specified we construct a URL based on the URL query params. * * @return string */ public function getUrl() { if (!empty($this->url)) { return $this->url; } else { $router = $this->container->router; $tempUrl = 'index.php?' . http_build_query($this->params); return $router->route($tempUrl); } } /** * Set the order of a mneu item * * @param integer $order The new order */ public function setOrder($order) { $this->order = $order; } /** * Get the order of a menu item * * @return integer */ public function getOrder() { return $this->order; } /** * Adds a child menu item * * @param Item $item * * @return void */ public function addChild(Item $item) { $key = $item->getName(); $this->children[$key] = $item; } /** * Remove a child menu item * * @param Item $item * * @return void */ public function removeChild(Item $item) { $key = $item->getName(); if (!array_key_exists($key, $this->children)) { return; } unset($this->children[$key]); } /** * Reset the children items cache * * @return void */ public function resetChildren() { $this->children = array(); } /** * Return all children items * * @return array */ public function getChildren() { return $this->children; } /** * Sets the menu item URL parameters * * @param array $params */ public function setParams($params) { $this->params = $params; } /** * Returns the menu item's URL parameters * * @param boolean $asQueryString Return the parameters in query string format * * @return array|string */ public function getParams($asQueryString = false) { // Should I just return the raw array? if (!$asQueryString) { return $this->params; } // Construct a query string $parts = array(); foreach ($this->params as $k => $v) { $parts[] = urlencode($k) . '=' . urlencode($v); } return implode('&', $parts); } /** * Is this menu item the active one? * * @return boolean */ public function isActive() { // Get the current URI $uri = Uri::getInstance(); // If we have an exact match to the custom URL, return true if ($uri->toString() == $this->url) { return true; } // If there are no parameters to check and the URLs don't match, it's not an active menu item if (empty($this->params)) { return false; } // Otherwise check if the parameters match foreach ($this->params as $k => $v) { $uv = $uri->getVar($k, null); if ($uv != $v) { return false; } } return true; } }