/app/code/core/Mage/Core/Controller/Varien/Front.php
PHP | 389 lines | 230 code | 44 blank | 115 comment | 42 complexity | fa826d6cb39da808d9f2abdb6c4a3619 MD5 | raw file
- <?php
- /**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magento.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magento.com for more information.
- *
- * @category Mage
- * @package Mage_Core
- * @copyright Copyright (c) 2006-2016 X.commerce, Inc. and affiliates (http://www.magento.com)
- * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
- */
- class Mage_Core_Controller_Varien_Front extends Varien_Object
- {
- protected $_defaults = array();
- /**
- * Available routers array
- *
- * @var array
- */
- protected $_routers = array();
- protected $_urlCache = array();
- const XML_STORE_ROUTERS_PATH = 'web/routers';
- public function setDefault($key, $value=null)
- {
- if (is_array($key)) {
- $this->_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);
- $this->_getRequestRewriteController()->rewrite();
- Varien_Profiler::start('mage::dispatch::routers_match');
- $i = 0;
- while (!$request->isDispatched() && $i++ < 100) {
- foreach ($this->_routers as $router) {
- /** @var $router Mage_Core_Controller_Varien_Router_Abstract */
- if ($router->match($request)) {
- 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;
- }
- /**
- * Returns request rewrite instance.
- * Class name alias is declared in the configuration
- *
- * @return Mage_Core_Model_Url_Rewrite_Request
- */
- protected function _getRequestRewriteController()
- {
- $className = (string)Mage::getConfig()->getNode('global/request_rewrite/model');
- return Mage::getSingleton('core/factory')->getModel($className, array(
- 'routers' => $this->getRouters(),
- ));
- }
- /**
- * Returns router instance by route name
- *
- * @param string $routeName
- * @return Mage_Core_Controller_Varien_Router_Abstract
- */
- 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
- * @deprecated since 1.7.0.2. Refactored and moved to Mage_Core_Controller_Request_Rewrite
- */
- 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
- * @deprecated since 1.7.0.2. Refactored and moved to Mage_Core_Controller_Request_Rewrite
- */
- 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() || strtolower($request->getMethod()) == 'post') {
- 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);
- }
- }