我该怎么做自定义路线?

时间:2015-06-22 00:06:01

标签: magento

所以我看了如何做一个hello world自定义模块,我明白标准的url结构看起来像/ modulefrontname / controller / action 但是如何为我的特定模块做一些自定义路由。

例如 / modulefrontname / {anyparamater} 要么 / modulefrontname /控制器/ {anyparamater}

我已经看到很多关于堆栈溢出的问题,但是大多数问题都没有得到解决,或者他们提出了一个问题,即如果没有覆盖主路由器就不可能。这是真的?

1 个答案:

答案 0 :(得分:1)

您需要将自己的路由器添加到Magento使用的路由器列表中。 为此,您需要编辑模块 etc / config.xml 文件。在 部分中定义了路由器 frontName 之后:

<frontend>
<routers>
    <modulename>
        <use>standard</use>
        <args>
            <module>Package_Modulename</module>
            <frontName>yourFrontName</frontName>
        </args>
    </modulename>
</routers>
</frontend>

您可以通过 部分中的事件添加自己的路由器:

<global>
<events>
    <controller_front_init_routers>
        <observers>
            <your_observer_code>
                <type>singleton</type>
                <class>Package_Modulename_Controller_Router</class>
                <method>initControllerRouters</method>
            </your_observer_code>
        </observers>
    </controller_front_init_routers>
</events>
</global>

然后在以下位置创建该文件: Package / Modulename / Controller / Router.php ,它应该从以下地址扩展: Mage_Core_Controller_Varien_Router_Abstract

class Package_Modulename_Controller_Router扩展Mage_Core_Controller_Varien_Router_Abstract {

}

定义将在活动中调用的方法: controller_front_init_routers

public function initControllerRouters($observer)
{
    $front = $observer->getEvent()->getFront();
    //Use the same class as Router
    $yourRouter = new Package_Modulename_Controller_Observer();
    $front->addRouter('yourRouter', $yourRouter);
}

你必须实现这个方法:匹配同一个类因为它是一个Observer,它也是你的自定义路由器:

public function match(Zend_Controller_Request_Http $request)
{
    if (!Mage::isInstalled()) {
        Mage::app()->getFrontController()->getResponse()
            ->setRedirect(Mage::getUrl('install'))
            ->sendResponse();
        exit;
    }
    $identifier = trim($request->getPathInfo(), '/');
    //Work with the $identifier and if it matches some of your custom defined URL's, you can set the found controller like this:
    if ($identifier == 'some-of-yours/custom-urls') {
        $request->setModuleName('modulename') //Your modulename
                    ->setControllerName('index') //Your controller: Package_Modulename_IndexController
                    ->setActionName('view') // The controller action
                    ->setParam('foo', 'bar'); //Set params
        $request->setAlias(
            Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS,
            $identifier
        );
        //You must return true if the identifier matches.
        return true;
    }
    return false;
}

在匹配方法中,您可以使用模块中的模型查找存储在数据库中的任何自定义URL。看看这个路由器是如何工作的: app / code / core / Mage / Cms / Controller / Router.php ,它与你的相同。

然后在您的控制器中: app / code / local / Package / Modulename / controllers / IndexController.php 您可以定义 viewAction 方法并使用传递的参数:< / p>

public function viewAction()
{
    $foo = $this->getRequest()->getParam('foo');
    //Here goes your logic
}