_defaults = $key; } else { $this->_defaults[$key] = $value; } return $this; } public function getDefault($key=null) { if (is_null($key)) { return $this->_defaults; } elseif (isset($this->_defaults[$key])) { return $this->_defaults[$key]; } return false; } /** * Retrieve request object * * @return Mage_Core_Controller_Request_Http */ public function getRequest() { return Mage::app()->getRequest(); } /** * Retrieve response object * * @return Zend_Controller_Response_Http */ public function getResponse() { return Mage::app()->getResponse(); } /** * Adding new router * * @param string $name * @param Mage_Core_Controller_Varien_Router_Abstract $router * @return Mage_Core_Controller_Varien_Front */ public function addRouter($name, Mage_Core_Controller_Varien_Router_Abstract $router) { $router->setFront($this); $this->_routers[$name] = $router; return $this; } /** * Retrieve router by name * * @param string $name * @return Mage_Core_Controller_Varien_Router_Abstract */ public function getRouter($name) { if (isset($this->_routers[$name])) { return $this->_routers[$name]; } return false; } /** * Retrieve routers collection * * @return array */ public function getRouters() { return $this->_routers; } /** * Init Front Controller * * @return Mage_Core_Controller_Varien_Front */ public function init() { Mage::dispatchEvent('controller_front_init_before', array('front'=>$this)); $routersInfo = Mage::app()->getStore()->getConfig(self::XML_STORE_ROUTERS_PATH); Varien_Profiler::start('mage::app::init_front_controller::collect_routers'); foreach ($routersInfo as $routerCode => $routerInfo) { if (isset($routerInfo['disabled']) && $routerInfo['disabled']) { continue; } if (isset($routerInfo['class'])) { $router = new $routerInfo['class']; if (isset($routerInfo['area'])) { $router->collectRoutes($routerInfo['area'], $routerCode); } $this->addRouter($routerCode, $router); } } Varien_Profiler::stop('mage::app::init_front_controller::collect_routers'); Mage::dispatchEvent('controller_front_init_routers', array('front'=>$this)); // Add default router at the last $default = new Mage_Core_Controller_Varien_Router_Default(); $this->addRouter('default', $default); return $this; } public function dispatch() { $request = $this->getRequest(); // If pre-configured, check equality of base URL and requested URL $this->_checkBaseUrl($request); $request->setPathInfo()->setDispatched(false); if (!$request->isStraight()) { Varien_Profiler::start('mage::dispatch::db_url_rewrite'); Mage::getModel('core/url_rewrite')->rewrite(); Varien_Profiler::stop('mage::dispatch::db_url_rewrite'); } Varien_Profiler::start('mage::dispatch::config_url_rewrite'); $this->rewrite(); Varien_Profiler::stop('mage::dispatch::config_url_rewrite'); Varien_Profiler::start('mage::dispatch::routers_match'); $i = 0; while (!$request->isDispatched() && $i++<100) { foreach ($this->_routers as $router) { if ($router->match($this->getRequest())) { break; } } } Varien_Profiler::stop('mage::dispatch::routers_match'); if ($i>100) { Mage::throwException('Front controller reached 100 router match iterations'); } // This event gives possibility to launch something before sending output (allow cookie setting) Mage::dispatchEvent('controller_front_send_response_before', array('front'=>$this)); Varien_Profiler::start('mage::app::dispatch::send_response'); $this->getResponse()->sendResponse(); Varien_Profiler::stop('mage::app::dispatch::send_response'); Mage::dispatchEvent('controller_front_send_response_after', array('front'=>$this)); return $this; } public function getRouterByRoute($routeName) { // empty route supplied - return base url if (empty($routeName)) { $router = $this->getRouter('standard'); } elseif ($this->getRouter('admin')->getFrontNameByRoute($routeName)) { // try standard router url assembly $router = $this->getRouter('admin'); } elseif ($this->getRouter('standard')->getFrontNameByRoute($routeName)) { // try standard router url assembly $router = $this->getRouter('standard'); } elseif ($router = $this->getRouter($routeName)) { // try custom router url assembly } else { // get default router url $router = $this->getRouter('default'); } return $router; } public function getRouterByFrontName($frontName) { // empty route supplied - return base url if (empty($frontName)) { $router = $this->getRouter('standard'); } elseif ($this->getRouter('admin')->getRouteByFrontName($frontName)) { // try standard router url assembly $router = $this->getRouter('admin'); } elseif ($this->getRouter('standard')->getRouteByFrontName($frontName)) { // try standard router url assembly $router = $this->getRouter('standard'); } elseif ($router = $this->getRouter($frontName)) { // try custom router url assembly } else { // get default router url $router = $this->getRouter('default'); } return $router; } /** * Apply configuration rewrites to current url * * @return Mage_Core_Controller_Varien_Front */ public function rewrite() { $request = $this->getRequest(); $config = Mage::getConfig()->getNode('global/rewrite'); if (!$config) { return; } foreach ($config->children() as $rewrite) { $from = (string)$rewrite->from; $to = (string)$rewrite->to; if (empty($from) || empty($to)) { continue; } $from = $this->_processRewriteUrl($from); $to = $this->_processRewriteUrl($to); $pathInfo = preg_replace($from, $to, $request->getPathInfo()); if (isset($rewrite->complete)) { $request->setPathInfo($pathInfo); } else { $request->rewritePathInfo($pathInfo); } } } /** * Replace route name placeholders in url to front name * * @param string $url * @return string */ protected function _processRewriteUrl($url) { $startPos = strpos($url, '{'); if ($startPos!==false) { $endPos = strpos($url, '}'); $routeName = substr($url, $startPos+1, $endPos-$startPos-1); $router = $this->getRouterByRoute($routeName); if ($router) { $fronName = $router->getFrontNameByRoute($routeName); $url = str_replace('{'.$routeName.'}', $fronName, $url); } } return $url; } /** * Auto-redirect to base url (without SID) if the requested url doesn't match it. * By default this feature is enabled in configuration. * * @param Zend_Controller_Request_Http $request */ protected function _checkBaseUrl($request) { if (!Mage::isInstalled() || $request->getPost()) { return; } $redirectCode = (int)Mage::getStoreConfig('web/url/redirect_to_base'); if (!$redirectCode) { return; } elseif ($redirectCode != 301) { $redirectCode = 302; } if ($this->_isAdminFrontNameMatched($request)) { return; } $baseUrl = Mage::getBaseUrl( Mage_Core_Model_Store::URL_TYPE_WEB, Mage::app()->getStore()->isCurrentlySecure() ); if (!$baseUrl) { return; } $uri = @parse_url($baseUrl); $requestUri = $request->getRequestUri() ? $request->getRequestUri() : '/'; if (isset($uri['scheme']) && $uri['scheme'] != $request->getScheme() || isset($uri['host']) && $uri['host'] != $request->getHttpHost() || isset($uri['path']) && strpos($requestUri, $uri['path']) === false ) { Mage::app()->getFrontController()->getResponse() ->setRedirect($baseUrl, $redirectCode) ->sendResponse(); exit; } } /** * Check if requested path starts with one of the admin front names * * @param Zend_Controller_Request_Http $request * @return boolean */ protected function _isAdminFrontNameMatched($request) { $useCustomAdminPath = (bool)(string)Mage::getConfig() ->getNode(Mage_Adminhtml_Helper_Data::XML_PATH_USE_CUSTOM_ADMIN_PATH); $customAdminPath = (string)Mage::getConfig()->getNode(Mage_Adminhtml_Helper_Data::XML_PATH_CUSTOM_ADMIN_PATH); $adminPath = ($useCustomAdminPath) ? $customAdminPath : null; if (!$adminPath) { $adminPath = (string)Mage::getConfig() ->getNode(Mage_Adminhtml_Helper_Data::XML_PATH_ADMINHTML_ROUTER_FRONTNAME); } $adminFrontNames = array($adminPath); // Check for other modules that can use admin router (a lot of Magento extensions do that) $adminFrontNameNodes = Mage::getConfig()->getNode('admin/routers') ->xpath('*[not(self::adminhtml) and use = "admin"]/args/frontName'); if (is_array($adminFrontNameNodes)) { foreach ($adminFrontNameNodes as $frontNameNode) { /** @var $frontNameNode SimpleXMLElement */ array_push($adminFrontNames, (string)$frontNameNode); } } $pathPrefix = ltrim($request->getPathInfo(), '/'); $urlDelimiterPos = strpos($pathPrefix, '/'); if ($urlDelimiterPos) { $pathPrefix = substr($pathPrefix, 0, $urlDelimiterPos); } return in_array($pathPrefix, $adminFrontNames); } }