Magento自定义路由器加载控制器,但没有别的

时间:2012-02-02 14:37:27

标签: magento router

我正在尝试使用以下代码在Magento中进行一些自定义路由(我只是在这里稍微修改了https://stackoverflow.com/a/4158571/1069232):

class Company_Modulename_Controller_Router extends Mage_Core_Controller_Varien_Router_Standard {

public function match(Zend_Controller_Request_Http $request){
    $path = explode('/', trim($request->getPathInfo(), '/'));
    // If path doesn't match your module requirements
    if ($path[1] == 'home.html' || (count($path) > 2 && $path[0] != 'portfolios')) {
        return false;
    }
    // Define initial values for controller initialization
    $module = $path[0];
    $realModule = 'Company_Modulename';
    $controller = 'index';
    $action = 'index';
    $controllerClassName = $this->_validateControllerClassName(
        $realModule, 
        $controller
    );
    // If controller was not found
    if (!$controllerClassName) {
        return false; 
    }            
    // Instantiate controller class
    $controllerInstance = Mage::getControllerInstance(
        $controllerClassName, 
        $request, 
        $this->getFront()->getResponse()
    );

    // If action is not found
    if (!$controllerInstance->hasAction($action)) { 
        return false;
    }
    // Set request data
    $request->setModuleName($module);
    $request->setControllerName($controller);
    $request->setActionName($action);
    $request->setControllerModule($realModule);
    // Set your custom request parameter
    $request->setParam('url_path', $path[1]);
    // dispatch action
    $request->setDispatched(true);
    $controllerInstance->dispatch($action);
    // Indicate that our route was dispatched
    return true;
}

}

结果是模板已加载但没有内容的页面。如果我在控制器中注释掉$ this-> loadLayout()/ $ this-> renderLayout(),我可以打印到屏幕。但是,当我尝试加载模板和/或块时,它会在某个地方中断。

home.html也加载正常(如果路径是home.html,则方法返回false)。

非常感谢任何协助。

1 个答案:

答案 0 :(得分:2)

我正在实现与此类似的东西并遇到同样的问题(这是有道理的,因为我复制了你的代码)

$request->setDispatched(true);之前

我添加了$request->setRouteName('brands');(品牌是我模块的前缀)。 并且它工作了。不知道它是否适合你,但是肯定有一些东西缺失,所以magento不知道应用什么布局,因为我可以告诉我们已经达到了控制器。