/app/code/core/Mage/Core/Controller/Varien/Front.php
PHP | 327 lines | 200 code | 35 blank | 92 comment | 34 complexity | 87f2daf44842ddd72806cd313c3e9935 MD5 | raw file
Possible License(s): CC-BY-SA-3.0, LGPL-2.1, GPL-2.0, WTFPL
- <?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@magentocommerce.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.magentocommerce.com for more information.
- *
- * @category Mage
- * @package Mage_Core
- * @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.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 Fron 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 give possibility to launch smth before sending ouptut(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;
- }
- if (!Mage::getStoreConfig('web/url/redirect_to_base')) {
- return;
- }
- $baseUrl = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB, Mage::app()->getStore()->isCurrentlySecure());
- if (!$baseUrl) {
- return;
- }
- $redirectCode = 302;
- if (Mage::getStoreConfig('web/url/redirect_to_base')==301) {
- $redirectCode = 301;
- }
- $uri = @parse_url($baseUrl);
- $host = isset($uri['host']) ? $uri['host'] : '';
- $path = isset($uri['path']) ? $uri['path'] : '';
- $requestUri = $request->getRequestUri() ? $request->getRequestUri() : '/';
- if ($host && $host != $request->getHttpHost() || $path && strpos($requestUri, $path) === false)
- {
- Mage::app()->getFrontController()->getResponse()
- ->setRedirect($baseUrl, $redirectCode)
- ->sendResponse();
- exit;
- }
- }
- }