Magento的自定义路由器失落布局对象(Magento Custom Router Lost La

2019-10-17 22:43发布

好像一切都被正确的配置,我可以得到我想要的输出,但我宁愿不直接从我的控制器呼应的布局对象:

这里是林与config.xml中工作

<config>
    <modules>
        <ALS_Bestselling>
            <version>0.1.0</version>
        </ALS_Bestselling>
    </modules>
    <global>
        <models>
            <bestselling>
                <class>ALS_Bestselling_Model</class>
            </bestselling>
        </models>
        <blocks>
            <bestselling>
                <class>ALS_Bestselling_Block</class>
            </bestselling>
        </blocks>
        <helpers>
            <bestselling>
                <class>ALS_Bestselling_Helper</class>
            </bestselling>
        </helpers>
    </global>
    <frontend>
        <layout>
            <updates>
                <als_bestselling>
                    <file>bestselling.xml</file>
                </als_bestselling>
            </updates>
        </layout>
    </frontend>
    <default>
        <web>
            <routers>
                <bestselling_router>
                    <area>frontend</area>
                    <class>ALS_Bestselling_Controller_Router</class>
                </bestselling_router>
            </routers>
        </web>
        <shorturls>
        </shorturls>
    </default>
</config>

#File: Controller/Router.php

<?php    
class ALS_Bestselling_Controller_Router extends Mage_Core_Controller_Varien_Router_Abstract
{

    private static $_module = 'bestsellers';
    private static $_realModule = 'ALS_Bestselling';
    private static $_controller = 'index';
    private static $_controllerClass = 'ALS_Bestselling_Controller_Index';
    private static $_action = 'view';


    public function initControllerRouters($observer)
    {
        $front = $observer->getEvent()->getFront();
        $front->addRouter('bestselling', $this);
    }

    public function collectRoutes()
    {
        // nothing to do here
    }



    public function match(Zend_Controller_Request_Http $request)
    {
        $this->_request = $request;
        $front = $this->getFront();
        $identifier = trim($request->getPathInfo(), '/');
        if(!substr($identifier,0,strlen('bestsellers')) == 'bestsellers'){
            return false;
        }else{
            //$rewrite = Mage::getModel('core/url_rewrite');
            $route_params = str_replace ( "bestsellers/" , "" , $identifier );
            $rewrite = Mage::getModel('core/url_rewrite');
            $rewrite->setStoreId(1);
            $rewrite->loadByRequestPath($route_params);
            $category_route = $rewrite->getIdPath();

            //If no route exists for category send to a different router
            if(!$category_route != ""){
                return false;
            }//Otherwise send the parameters to the request
            else{
                $id = str_replace ( "category/" , "" , $category_route );
                $this->_request->setParam('id',$id);
            }

        $this->_setRequestRoute();
        $this->_dispatch();
        return true;
        }
    }
    protected function _setRequestRoute()
    {
        $this->_request->setModuleName(self::$_module);
        $this->_request->setControllerName(self::$_controller);
        $this->_request->setActionName(self::$_action);
        $this->_request->setControllerModule(self::$_realModule);

    }
    protected function _dispatch()
    {
        $this->_request->setDispatched(true);
        $controller = Mage::getControllerInstance(self::$_controllerClass, $this->_request, $this->_response);
        $controller->dispatch(self::$_action);
    }
}

File: Controller/Index.php

     class ALS_Bestselling_Controller_Index extends Mage_Core_Controller_Front_Action{   
    public function viewAction(){
            $layout = Mage::app()->getLayout();
            $layout->generateXml()->generateBlocks();
            $render = $layout->getBlock('root')->toHtml();
            echo $render;
        }

    }

以前的作品,但以下几点:

$update = $this->getLayout()->getUpdate();
$update->addHandle('default');
$this->renderLayout();

引发错误调用一个成员函数appendBody()非对象上。

这是如何,我想做到这一点,还是有一些从配方失踪?

Answer 1:

自定义路由类是对大多数开发商Magento的做边缘-标准的做法是建立一个标准模块控制器的frontname bestselling ,或在非SEO友好的方式创建您的功能,然后创建一个重写实体/反对SEO-IFY它。

但是,我有一个情有独钟,自定义路由对象,即使是在他们身后的最佳实践社区的方式很少。 如果没有行号,它听起来就像你的异常

调用一个成员函数appendBody()一个非对象

来自下面的代码

#File: app/code/core/Mage/Core/Controller/Varien/Action.php

$this->getResponse()->appendBody($output);

鉴于定义getResponse

public function getResponse()
{
    return $this->_response;
}

这听起来像你的控制器对象没有一个适当的响应对象集。

看你的控制器实例化代码

$controller = Mage::getControllerInstance(self::$_controllerClass, $this->_request, $this->_response);

你引用$this->_response特性-但您的路由器类和抽象类路由器没有这个属性。 这是不可能根据你张贴说什么,但是这可能是你的问题。 看看标准的路由器的比赛方法是怎么做的。

#File: app/code/core/Mage/Core/Controller/Varien/Router/Standard.php
//...
$controllerInstance = Mage::getControllerInstance($controllerClassName, $request, $front->getResponse());

所以,使用前控制器对象来获取响应对象,传递到getCongrollerInstance工厂方法,你应该是好去(或至少到下一个问题)



文章来源: Magento Custom Router Lost Layout Object
标签: magento