我正在尝试为我的模块创建一些用户友好的URL。
模块名称正在登陆。现在,我使用索引控制器和索引操作,然后抓取一个字符串" page"从URL抓取我的对象基于此。所以,我的网址如下所示:
http://www.example.com/landing/index/index/page/CoolPage
我目前的想法是将此网址构建为/ landing / {page},以便它只是:
http://www.example.com/landing/CoolPage
首先,我尝试使用htaccess完成此操作。我有以下内容:
RewriteRule ^landing/([a-z\-]+)(/)?$ landing/index/index/page/$1 [R,L]
哪个有效但是重定向而不是重写。我也只用了[L]
并且最后没有[]来尝试它,但我最终只能访问我的404页面。
理想情况下,我会使用配置重写,因为它可以与我的模块打包,但我找不到任何关于使用它们的文档。如果按需要工作,我会很高兴使用.htaccess甚至基于数据库的重写。
有没有办法在Magento中进行这样的重写?
答案 0 :(得分:3)
我想我前一段时间从客户那里得到了完全相同的请求,这就是我管理它的方式,我认为这是最简单最简单的方法......
实际上,可以在模块的config.xml文件中进行重写。 在此示例中,所有网址都是
http://www.domain.com/landing/whatever
将被重写为
http://www.domain.com/landingpage/page/view/whatever
<?xml version="1.0"?>
<config>
<modules>
<My_LandingPage>
<version>0.0.1</version>
</My_LandingPage>
</modules>
<frontend>
<routers>
<landingpage>
<use>standard</use>
<args>
<module>My_LandingPage</module>
<frontName>landingpage</frontName>
</args>
</landingpage>
</routers>
</frontend>
<global>
<!-- Rewrite requested routes -->
<rewrite>
<my_landingpage_page_view>
<from><![CDATA[#^/landing/#]]></from>
<to>/landingpage/page/view/</to>
<complete>1</complete>
</my_landingpage_page_view>
</rewrite>
</config>
<?php
class My_LandingPage_PageController extends Mage_Core_Controller_Front_Action {
/**
* View page action
*/
public function viewAction() {
// Get the requested path (/landing/whatever)
$pathInfo = $this->getRequest()->getOriginalPathInfo();
// Extract the requested key (whatever)
$pathArray = explode('/landing/', $pathInfo);
$requestedKey = $pathArray[1];
// So, from there you can use $requestedKey to load any model using it.
// This is also where you will load and render your layout.
}
}
由于调用的真实控制器操作是“landingpage / page / view”,如果您需要此模块的某些布局,其句柄将为<landingpage_page_view>
。
答案 1 :(得分:1)
这是一本教科书定制路由器案例,如果我见过的话。您可以采用CMS路由器的方法并调整请求对象上的路径,以便您的控制器可以使用标准路由器进行匹配。
另一种方法是创建一个索引器来为模块的实体创建重写,并将它们存储在core_url_rewrite
表中。