所以我看了如何做一个hello world自定义模块,我明白标准的url结构看起来像/ modulefrontname / controller / action 但是如何为我的特定模块做一些自定义路由。
例如 / modulefrontname / {anyparamater} 要么 / modulefrontname /控制器/ {anyparamater}
我已经看到很多关于堆栈溢出的问题,但是大多数问题都没有得到解决,或者他们提出了一个问题,即如果没有覆盖主路由器就不可能。这是真的?
答案 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
}