Skip to content

Instantly share code, notes, and snippets.

@mzeis
Created April 2, 2013 19:47
Show Gist options
  • Save mzeis/5295561 to your computer and use it in GitHub Desktop.
Save mzeis/5295561 to your computer and use it in GitHub Desktop.
Debug module / controller / action routing in Magento CE 1.7.0.2. Save file as app/code/local/Mage/Core/Controller/Varien/Router/Standard.php
<?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) 2012 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_Router_Standard extends Mage_Core_Controller_Varien_Router_Abstract
{
protected $_modules = array();
protected $_routes = array();
protected $_dispatchData = array();
public function collectRoutes($configArea, $useRouterName)
{
$routers = array();
$routersConfigNode = Mage::getConfig()->getNode($configArea.'/routers');
if($routersConfigNode) {
$routers = $routersConfigNode->children();
}
foreach ($routers as $routerName=>$routerConfig) {
$use = (string)$routerConfig->use;
if ($use == $useRouterName) {
$modules = array((string)$routerConfig->args->module);
if ($routerConfig->args->modules) {
foreach ($routerConfig->args->modules->children() as $customModule) {
if ($customModule) {
if ($before = $customModule->getAttribute('before')) {
$position = array_search($before, $modules);
if ($position === false) {
$position = 0;
}
array_splice($modules, $position, 0, (string)$customModule);
} elseif ($after = $customModule->getAttribute('after')) {
$position = array_search($after, $modules);
if ($position === false) {
$position = count($modules);
}
array_splice($modules, $position+1, 0, (string)$customModule);
} else {
$modules[] = (string)$customModule;
}
}
}
}
$frontName = (string)$routerConfig->args->frontName;
$this->addModule($frontName, $modules, $routerName);
}
}
}
public function fetchDefault()
{
$this->getFront()->setDefault(array(
'module' => 'core',
'controller' => 'index',
'action' => 'index'
));
}
/**
* checking if this admin if yes then we don't use this router
*
* @return bool
*/
protected function _beforeModuleMatch()
{
if (Mage::app()->getStore()->isAdmin()) {
return false;
}
return true;
}
/**
* dummy call to pass through checking
*
* @return bool
*/
protected function _afterModuleMatch()
{
return true;
}
/**
* Match the request
*
* @param Zend_Controller_Request_Http $request
* @return boolean
*/
public function match(Zend_Controller_Request_Http $request)
{
//checking before even try to find out that current module
//should use this router
if (!$this->_beforeModuleMatch()) {
return false;
}
$this->fetchDefault();
$front = $this->getFront();
$path = trim($request->getPathInfo(), '/');
if ($path) {
$p = explode('/', $path);
} else {
$p = explode('/', $this->_getDefaultPath());
}
// get module name
if ($request->getModuleName()) {
$module = $request->getModuleName();
} else {
if (!empty($p[0])) {
$module = $p[0];
} else {
$module = $this->getFront()->getDefault('module');
$request->setAlias(Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS, '');
}
}
if (!$module) {
if (Mage::app()->getStore()->isAdmin()) {
$module = 'admin';
} else {
return false;
}
}
/**
* Searching router args by module name from route using it as key
*/
$modules = $this->getModuleByFrontName($module);
if ($modules === false) {
return false;
}
// checks after we found out that this router should be used for current module
if (!$this->_afterModuleMatch()) {
return false;
}
/**
* Going through modules to find appropriate controller
*/
$found = false;
foreach ($modules as $realModule) {
Zend_Debug::dump($realModule, __METHOD__ . ': checking module');
$request->setRouteName($this->getRouteByFrontName($module));
// get controller name
if ($request->getControllerName()) {
$controller = $request->getControllerName();
} else {
if (!empty($p[1])) {
$controller = $p[1];
} else {
$controller = $front->getDefault('controller');
$request->setAlias(
Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS,
ltrim($request->getOriginalPathInfo(), '/')
);
}
}
// get action name
if (empty($action)) {
if ($request->getActionName()) {
$action = $request->getActionName();
} else {
$action = !empty($p[2]) ? $p[2] : $front->getDefault('action');
}
}
Zend_Debug::dump($module, '$module');
Zend_Debug::dump($controller, '$controller');
Zend_Debug::dump($action, '$action');
//checking if this place should be secure
$this->_checkShouldBeSecure($request, '/'.$module.'/'.$controller.'/'.$action);
$controllerClassName = $this->_validateControllerClassName($realModule, $controller);
Zend_Debug::dump($controllerClassName, '$controllerClassName');
if (!$controllerClassName) {
continue;
}
// instantiate controller class
$controllerInstance = Mage::getControllerInstance($controllerClassName, $request, $front->getResponse());
if (!$controllerInstance->hasAction($action)) {
continue;
}
$found = true;
break;
}
Zend_Debug::dump($found, 'found');
/**
* if we did not found any suitable
*/
if (!$found) {
if ($this->_noRouteShouldBeApplied()) {
$controller = 'index';
$action = 'noroute';
$controllerClassName = $this->_validateControllerClassName($realModule, $controller);
if (!$controllerClassName) {
return false;
}
// instantiate controller class
$controllerInstance = Mage::getControllerInstance($controllerClassName, $request,
$front->getResponse());
if (!$controllerInstance->hasAction($action)) {
return false;
}
} else {
return false;
}
}
// set values only after all the checks are done
$request->setModuleName($module);
$request->setControllerName($controller);
$request->setActionName($action);
$request->setControllerModule($realModule);
// set parameters from pathinfo
for ($i = 3, $l = sizeof($p); $i < $l; $i += 2) {
$request->setParam($p[$i], isset($p[$i+1]) ? urldecode($p[$i+1]) : '');
}
// dispatch action
$request->setDispatched(true);
$controllerInstance->dispatch($action);
return true;
}
/**
* Get router default request path
* @return string
*/
protected function _getDefaultPath()
{
return Mage::getStoreConfig('web/default/front');
}
/**
* Allow to control if we need to enable no route functionality in current router
*
* @return bool
*/
protected function _noRouteShouldBeApplied()
{
return false;
}
/**
* Generating and validating class file name,
* class and if evrything ok do include if needed and return of class name
*
* @return mixed
*/
protected function _validateControllerClassName($realModule, $controller)
{
$controllerFileName = $this->getControllerFileName($realModule, $controller);
Zend_Debug::dump($controllerFileName, '$controllerFileName');
if (!$this->validateControllerFileName($controllerFileName)) {
return false;
}
$controllerClassName = $this->getControllerClassName($realModule, $controller);
Zend_Debug::dump($controllerClassName, '$controllerClassName');
if (!$controllerClassName) {
return false;
}
// include controller file if needed
if (!$this->_includeControllerClass($controllerFileName, $controllerClassName)) {
Zend_Debug::dump("Tried to include file '$controllerFileName' but it doesn't exist.");
return false;
}
return $controllerClassName;
}
/**
* @deprecated
* @see _includeControllerClass()
*/
protected function _inludeControllerClass($controllerFileName, $controllerClassName)
{
return $this->_includeControllerClass($controllerFileName, $controllerClassName);
}
/**
* Include the file containing controller class if this class is not defined yet
*
* @param string $controllerFileName
* @param string $controllerClassName
* @return bool
*/
protected function _includeControllerClass($controllerFileName, $controllerClassName)
{
if (!class_exists($controllerClassName, false)) {
if (!file_exists($controllerFileName)) {
return false;
}
include $controllerFileName;
if (!class_exists($controllerClassName, false)) {
throw Mage::exception('Mage_Core', Mage::helper('core')->__('Controller file was loaded but class does not exist'));
}
}
return true;
}
public function addModule($frontName, $moduleName, $routeName)
{
$this->_modules[$frontName] = $moduleName;
$this->_routes[$routeName] = $frontName;
return $this;
}
public function getModuleByFrontName($frontName)
{
if (isset($this->_modules[$frontName])) {
return $this->_modules[$frontName];
}
return false;
}
public function getModuleByName($moduleName, $modules)
{
foreach ($modules as $module) {
if ($moduleName === $module || (is_array($module)
&& $this->getModuleByName($moduleName, $module))) {
return true;
}
}
return false;
}
public function getFrontNameByRoute($routeName)
{
if (isset($this->_routes[$routeName])) {
return $this->_routes[$routeName];
}
return false;
}
public function getRouteByFrontName($frontName)
{
return array_search($frontName, $this->_routes);
}
public function getControllerFileName($realModule, $controller)
{
$parts = explode('_', $realModule);
$realModule = implode('_', array_splice($parts, 0, 2));
$file = Mage::getModuleDir('controllers', $realModule);
if (count($parts)) {
$file .= DS . implode(DS, $parts);
}
$file .= DS.uc_words($controller, DS).'Controller.php';
return $file;
}
public function validateControllerFileName($fileName)
{
if ($fileName && is_readable($fileName) && false===strpos($fileName, '//')) {
return true;
}
return false;
}
public function getControllerClassName($realModule, $controller)
{
$class = $realModule.'_'.uc_words($controller).'Controller';
return $class;
}
public function rewrite(array $p)
{
$rewrite = Mage::getConfig()->getNode('global/rewrite');
if ($module = $rewrite->{$p[0]}) {
if (!$module->children()) {
$p[0] = trim((string)$module);
}
}
if (isset($p[1]) && ($controller = $rewrite->{$p[0]}->{$p[1]})) {
if (!$controller->children()) {
$p[1] = trim((string)$controller);
}
}
if (isset($p[2]) && ($action = $rewrite->{$p[0]}->{$p[1]}->{$p[2]})) {
if (!$action->children()) {
$p[2] = trim((string)$action);
}
}
return $p;
}
/**
* Check that request uses https protocol if it should.
* Function redirects user to correct URL if needed.
*
* @param Mage_Core_Controller_Request_Http $request
* @param string $path
* @return void
*/
protected function _checkShouldBeSecure($request, $path = '')
{
if (!Mage::isInstalled() || $request->getPost()) {
return;
}
if ($this->_shouldBeSecure($path) && !$request->isSecure()) {
$url = $this->_getCurrentSecureUrl($request);
if ($request->getRouteName() != 'adminhtml' && Mage::app()->getUseSessionInUrl()) {
$url = Mage::getSingleton('core/url')->getRedirectUrl($url);
}
Mage::app()->getFrontController()->getResponse()
->setRedirect($url)
->sendResponse();
exit;
}
}
protected function _getCurrentSecureUrl($request)
{
if ($alias = $request->getAlias(Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS)) {
return Mage::getBaseUrl('link', true).ltrim($alias, '/');
}
return Mage::getBaseUrl('link', true).ltrim($request->getPathInfo(), '/');
}
/**
* Check whether URL for corresponding path should use https protocol
*
* @param string $path
* @return bool
*/
protected function _shouldBeSecure($path)
{
return substr(Mage::getStoreConfig('web/unsecure/base_url'), 0, 5) === 'https'
|| Mage::getStoreConfigFlag('web/secure/use_in_frontend')
&& substr(Mage::getStoreConfig('web/secure/base_url'), 0, 5) == 'https'
&& Mage::getConfig()->shouldUrlBeSecure($path);
}
}
@JeremyRms
Copy link

Helped me a lot

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment