我目前正在尝试使用magento生成自定义网址/路由,目前我已在本地模块中的config.xml中设置了默认路由。
<frontend>
<routers>
<portfolios>
<use>standard</use>
<args>
<module>Custom_Portfolios</module>
<frontName>portfolios</frontName>
</args>
</portfolios>
</routers>
<default>
<router>portfolios</router>
</default>
</frontend>
目前使用/ portfolio / index / action / custom-string的url路径,这是magento默认路由。 我想要实现的是/portfolios/custom-string.html我试图使用mod_rewrite规则但没有成功,我找到了一些关于利用我添加到的自定义后缀.html的引用相同的config.xml文件。
<default><portfolios><seo><portfolios_url_suffix>.html</portfolios_url_suffix></seo></portfolios></default>
我查看了与路由相关的alan storm文档,发现它仅与默认路由路径相关,或者信息有点过时。
您是否知道在magento中控制路由的最佳方法可能是一个易于理解和相关的教程?若有,请分享:D很多
答案 0 :(得分:15)
以下代码未经测试,但应该有效
如果您不想为每个protfolio项目定义自定义重写,请按照以下步骤操作:
编写从Mage_Core_Controller_Varien_Router_Standard扩展的自定义路由器类,并实现match
方法:
public function match(Zend_Controller_Request_Http $request)
{
$path = explode('/', trim($request->getPathInfo(), '/'));
// If path doesn't match your module requirements
if (count($path) > 2 && $path[0] != 'portfolios') {
return false;
}
// Define initial values for controller initialization
$module = $path[0];
$realModule = 'Custom_Portfolios';
$controller = 'index';
$action = 'action';
$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;
}
在config.xml中定义自定义路由器:
<stores>
<default>
<web>
<routers>
<your_custom>
<area>frontend</area>
<class>Custom_Portfolios_Controller_Router_Custom</class>
</your_custom>
</routers>
</web>
</default>
</stores>
在Magento中享受您的自定义路由:)
答案 1 :(得分:8)
执行此操作的方法是使用URL重写。事实上,您找到的后缀配置可能被Mage_Catalog用来创建它的重写集。我是第一次接近这个特殊的功能所以这个片段应该用一小撮盐...
// Creating a rewrite
/* @var $rewrite Mage_Core_Model_Url_Rewrite */
$rewrite = Mage::getModel('core/url_rewrite');
$rewrite->setStoreId($store_id)
->setIdPath('portfolios/'.$url_key)
->setRequestPath('portfolios/'.$url_key.'.html')
->setTargetPath('portfolios/index/action/id/'.$url_key)
->setIsSystem(true)
->save();
每个可能的路径都需要重新编写。
编辑; 我添加了setIdPath
因为可能是必要的。
答案 2 :(得分:0)
最简单的方法(当您不需要自动生成多个网址时)是使用内置的Url重写模块。转到管理员后端 - &gt; 目录 - &gt; Url重写管理并设置您喜欢的任何网址重写。