Source of file Mvc.php
Size: 14,602 Bytes - Last Modified: 2014-03-12T23:21:18+01:00
/home/theseer/Downloads/ZendFramework-2.3.0/library/Zend/Navigation/Page/Mvc.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555 | <?php /** * Zend Framework (http://framework.zend.com/) * * @link http://github.com/zendframework/zf2 for the canonical source repository * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ namespace Zend\Navigation\Page; use Zend\Mvc\ModuleRouteListener; use Zend\Mvc\Router\RouteMatch; use Zend\Mvc\Router\RouteStackInterface; use Zend\Navigation\Exception; /** * Represents a page that is defined using controller, action, route * name and route params to assemble the href */ class Mvc extends AbstractPage { /** * Action name to use when assembling URL * * @var string */ protected $action; /** * Controller name to use when assembling URL * * @var string */ protected $controller; /** * URL query part to use when assembling URL * * @var array|string */ protected $query; /** * Params to use when assembling URL * * @see getHref() * @var array */ protected $params = array(); /** * RouteInterface name to use when assembling URL * * @see getHref() * @var string */ protected $route; /** * Cached href * * The use of this variable minimizes execution time when getHref() is * called more than once during the lifetime of a request. If a property * is updated, the cache is invalidated. * * @var string */ protected $hrefCache; /** * RouteInterface matches; used for routing parameters and testing validity * * @var RouteMatch */ protected $routeMatch; /** * If true and set routeMatch than getHref will use routeMatch params * to assemble uri * @var bool */ protected $useRouteMatch = false; /** * Router for assembling URLs * * @see getHref() * @var RouteStackInterface */ protected $router = null; /** * Default router to be used if router is not given. * * @see getHref() * * @var RouteStackInterface */ protected static $defaultRouter = null; /** * Default route name * * @var string */ protected static $defaultRoute = null; // Accessors: /** * Returns whether page should be considered active or not * * This method will compare the page properties against the route matches * composed in the object. * * @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 or not */ public function isActive($recursive = false) { if (!$this->active) { $reqParams = array(); if ($this->routeMatch instanceof RouteMatch) { $reqParams = $this->routeMatch->getParams(); if (isset($reqParams[ModuleRouteListener::ORIGINAL_CONTROLLER])) { $reqParams['controller'] = $reqParams[ModuleRouteListener::ORIGINAL_CONTROLLER]; } $myParams = $this->params; if (null !== $this->controller) { $myParams['controller'] = $this->controller; } if (null !== $this->action) { $myParams['action'] = $this->action; } if (null !== $this->getRoute()) { if ( $this->routeMatch->getMatchedRouteName() === $this->getRoute() && (count(array_intersect_assoc($reqParams, $myParams)) == count($myParams)) ) { $this->active = true; return $this->active; } else { return parent::isActive($recursive); } } } $myParams = $this->params; if (null !== $this->controller) { $myParams['controller'] = $this->controller; } else { /** * @todo In ZF1, this was configurable and pulled from the front controller */ $myParams['controller'] = 'index'; } if (null !== $this->action) { $myParams['action'] = $this->action; } else { /** * @todo In ZF1, this was configurable and pulled from the front controller */ $myParams['action'] = 'index'; } if (count(array_intersect_assoc($reqParams, $myParams)) == count($myParams)) { $this->active = true; return true; } } return parent::isActive($recursive); } /** * Returns href for this page * * This method uses {@link RouteStackInterface} to assemble * the href based on the page's properties. * * @see RouteStackInterface * @return string page href * @throws Exception\DomainException if no router is set */ public function getHref() { if ($this->hrefCache) { return $this->hrefCache; } $router = $this->router; if (null === $router) { $router = static::$defaultRouter; } if (!$router instanceof RouteStackInterface) { throw new Exception\DomainException( __METHOD__ . ' cannot execute as no Zend\Mvc\Router\RouteStackInterface instance is composed' ); } if ($this->useRouteMatch() && $this->getRouteMatch()) { $rmParams = $this->getRouteMatch()->getParams(); if (isset($rmParams[ModuleRouteListener::ORIGINAL_CONTROLLER])) { $rmParams['controller'] = $rmParams[ModuleRouteListener::ORIGINAL_CONTROLLER]; unset($rmParams[ModuleRouteListener::ORIGINAL_CONTROLLER]); } if (isset($rmParams[ModuleRouteListener::MODULE_NAMESPACE])) { unset($rmParams[ModuleRouteListener::MODULE_NAMESPACE]); } $params = array_merge($rmParams, $this->getParams()); } else { $params = $this->getParams(); } if (($param = $this->getController()) != null) { $params['controller'] = $param; } if (($param = $this->getAction()) != null) { $params['action'] = $param; } switch (true) { case ($this->getRoute() !== null || static::getDefaultRoute() !== null): $name = ($this->getRoute() !== null) ? $this->getRoute() : static::getDefaultRoute(); break; case ($this->getRouteMatch() !== null): $name = $this->getRouteMatch()->getMatchedRouteName(); break; default: throw new Exception\DomainException('No route name could be found'); } $options = array('name' => $name); // Add the fragment identifier if it is set $fragment = $this->getFragment(); if (null !== $fragment) { $options['fragment'] = $fragment; } if (null !== ($query = $this->getQuery())) { $options['query'] = $query; } $url = $router->assemble($params, $options); return $this->hrefCache = $url; } /** * Sets action name to use when assembling URL * * @see getHref() * * @param string $action action name * @return Mvc fluent interface, returns self * @throws Exception\InvalidArgumentException if invalid $action is given */ public function setAction($action) { if (null !== $action && !is_string($action)) { throw new Exception\InvalidArgumentException( 'Invalid argument: $action must be a string or null' ); } $this->action = $action; $this->hrefCache = null; return $this; } /** * Returns action name to use when assembling URL * * @see getHref() * * @return string|null action name */ public function getAction() { return $this->action; } /** * Sets controller name to use when assembling URL * * @see getHref() * * @param string|null $controller controller name * @return Mvc fluent interface, returns self * @throws Exception\InvalidArgumentException if invalid controller name is given */ public function setController($controller) { if (null !== $controller && !is_string($controller)) { throw new Exception\InvalidArgumentException( 'Invalid argument: $controller must be a string or null' ); } $this->controller = $controller; $this->hrefCache = null; return $this; } /** * Returns controller name to use when assembling URL * * @see getHref() * * @return string|null controller name or null */ public function getController() { return $this->controller; } /** * Sets URL query part to use when assembling URL * * @see getHref() * @param array|string|null $query URL query part * @return self fluent interface, returns self */ public function setQuery($query) { $this->query = $query; $this->hrefCache = null; return $this; } /** * Returns URL query part to use when assembling URL * * @see getHref() * * @return array|string|null URL query part (as an array or string) or null */ public function getQuery() { return $this->query; } /** * Sets params to use when assembling URL * * @see getHref() * @param array|null $params [optional] page params. Default is null * which sets no params. * @return Mvc fluent interface, returns self */ public function setParams(array $params = null) { $this->params = empty($params) ? array() : $params; $this->hrefCache = null; return $this; } /** * Returns params to use when assembling URL * * @see getHref() * * @return array page params */ public function getParams() { return $this->params; } /** * Sets route name to use when assembling URL * * @see getHref() * * @param string $route route name to use when assembling URL * @return Mvc fluent interface, returns self * @throws Exception\InvalidArgumentException if invalid $route is given */ public function setRoute($route) { if (null !== $route && (!is_string($route) || strlen($route) < 1)) { throw new Exception\InvalidArgumentException( 'Invalid argument: $route must be a non-empty string or null' ); } $this->route = $route; $this->hrefCache = null; return $this; } /** * Returns route name to use when assembling URL * * @see getHref() * * @return string route name */ public function getRoute() { return $this->route; } /** * Get the route match. * * @return \Zend\Mvc\Router\RouteMatch */ public function getRouteMatch() { return $this->routeMatch; } /** * Set route match object from which parameters will be retrieved * * @param RouteMatch $matches * @return Mvc fluent interface, returns self */ public function setRouteMatch(RouteMatch $matches) { $this->routeMatch = $matches; return $this; } /** * Get the useRouteMatch flag * * @return bool */ public function useRouteMatch() { return $this->useRouteMatch; } /** * Set whether the page should use route match params for assembling link uri * * @see getHref() * @param bool $useRouteMatch [optional] * @return Mvc */ public function setUseRouteMatch($useRouteMatch = true) { $this->useRouteMatch = (bool) $useRouteMatch; $this->hrefCache = null; return $this; } /** * Get the router. * * @return null|RouteStackInterface */ public function getRouter() { return $this->router; } /** * Sets router for assembling URLs * * @see getHref() * * @param RouteStackInterface $router Router * @return Mvc fluent interface, returns self */ public function setRouter(RouteStackInterface $router) { $this->router = $router; return $this; } /** * Sets the default router for assembling URLs. * * @see getHref() * @param RouteStackInterface $router Router * @return void */ public static function setDefaultRouter($router) { static::$defaultRouter = $router; } /** * Gets the default router for assembling URLs. * * @return RouteStackInterface */ public static function getDefaultRouter() { return static::$defaultRouter; } /** * Set default route name * * @param string $route * @return void */ public static function setDefaultRoute($route) { static::$defaultRoute = $route; } /** * Get default route name * * @return string */ public static function getDefaultRoute() { return static::$defaultRoute; } // Public methods: /** * Returns an array representation of the page * * @return array associative array containing all page properties */ public function toArray() { return array_merge( parent::toArray(), array( 'action' => $this->getAction(), 'controller' => $this->getController(), 'params' => $this->getParams(), 'route' => $this->getRoute(), 'router' => $this->getRouter(), 'route_match' => $this->getRouteMatch(), ) ); } } |