博客

Magento 二次开发系列十 — 后台商品保存时生成url rewrite数据

【php教程】Magento 二次开发系列十 — 后台商品保存时生成url rewrite数据

本节将介绍Magento的URL rewrite,以及如何自定义url。

Magento提供了url rewrite功能,通过rewrite,你可以自定义任意的url。好处是一方面是安全性更高,另一方面对搜索引擎收录也是很有帮助的。

1.打开网站后台->分类->URL重写管理,就可以看到所有的url列表,有两个关键值,一个是“Request Path”,这是请求的地址,也就是你想自定义的部分,任意修改但是必须要唯一,另个是“Target Path”,这是目标地址,可以看到格式是“catalog/product/view/id/3”,第一个参数是模块名称,第二个是类名,第三个是方法,第四个是值;

2.这些url都是存储在数据库表core_url_rewrite中;

3.我们要修改是商品保存后根据添加的model和part属性的值生成多个不同url,但都指向同个商品地址,即都指向相同的“Target Path”。看了前面的章节的朋友可能会注意到我们重写了Product模型Model,修改了afterCommitCallback()回调方法,还创建了个新的模块Extends,它们是为本节的工作做准备的;

4. 通过调用createExtend()方法,就进入了我们自定义的模块,执行我们想要系统执行的方法。这个方法先获取model和part数据,然后进行拆分,我们根据后台输入框中的字符串数据进行换行拆分成数组,然后每个值都创建一条新的url,但是都指向相同的“Target Path”,比如:model是”apple 350 px”,生成“Request Path”是xxxx/apple+350+px/apple-4s-battery-xxxx.html, 生成的核心代码为:

$urlmodel = Mage::getModel(‘core/url_rewrite’);
$urlmodel->setIdPath($idpath)
->setTargetPath($targetPath)
->setIsSystem(0)
->setStoreId($storeId)
->setProductId($object->getId())
->setOptions($type)
->setCategoryId($categoryId);
->setRequestPath($requestPath);
$urlmodel->save();

注意id_path是不能重复的。
另外我们自定义的表extends_product,也存储了商品的id,所属分类id,url,内容(model或part),这里的url和url_rewrite 的“Request Path”不是完全一样,应该是“Request Path”的子字符串,为什么这样设计呢,这涉及下一章节会展示的前台分类页面如何生成url。这里先介绍下规则,我们会通过分类名称/model(或part)/url拼成完整的url,这个完整的url就是和core_url_rewrite表中的“Request Path”是一致,这样就能通过这个完整url找到“Target Path”,也就是可以找到对应的模块和类了,如果还没有明白,我们下一节也会再介绍下。

5.Magento 的url rewrite机制说白了就是通过数据库层的映射关系来达到重定义的目的,明白了这个原理,我们就无需去修改rewrite模块代码就可以达到我们的目的了,是不是感觉比较简单了呢;

6.我们也可以通过网站后台去维护url rewrite,网站后台->分类->URL重写管理即可;

注:此文为原创,如转载请注明出处。