全部博文(315)
分类: 系统运维
2009-11-05 12:47:34
下面讨论的方式都是基于第二种原则。扩展模板的基本思路是在合适的地方改变http请求的入口。如:
请求
执行过程如下:
1). 分析URL中的catalog: Magento遍历app/code下所有模块etc/config.xml文件中的如下定义
config/frontend/routers/*/args/frontName标签值为catalog对应的模块名字,定位到相应的目录,对于该例子找到module为Mage_Catalog
2). 分析URL中的category: 定位到app/code/Mage/Catalog/controllers/CategoryController.php
3). 分析URL中的view: 定位到CategoryController.php中的viewAction方法。后面的id/6则是该方法的参数。
4). viewAction方法执行完,一般就是去寻找
config/frontend/layout/updates/*/file/的值所指向的布局文件,这里是:catalog.xml
5). 定位到app/design/frontend/default/default/layout/catalog.xml, 在该文件中查找catalog_category_view标签,找不到自动定位到catalog_category_default. 根据该标签里的Block定义分别调用相应目录下的模板文件。
通常我们有三个阶段改变网页入口:
1. 改变目标url,结果改变了controller入口,于是可以重新定义模块及其相应的controller类。
2. 重写(rewrite) Block入口类:适合定制Block和Template的情况。
3. 改变模板:如果仅仅需要改变Block指向的Template文件的情况下使用
从使用频繁度来讲,三种方法的顺序为:3,2,1
I. 下面首先来介绍最常用的第三种定制方法:仅仅改变模板文件
仍然以上面的例子为例:
1. 建立自己的模块,如Joymami_Catalogue, 相应的Layout文件为catalogue.xml,在该文件中加入如下的代码:
上面的代码将和Mage_Core内置的catalog_category_default定义共同对该页面请求生效。但是上面的代码由于使用了
则移除了原来Block Type为catalog/category_view(对应的名字为category.products)的定义。然后重新定义了Type为catalog/category_view的Block的Template属性指向,为了使新定义的Block生效,请注意:name属性必须不能和原来的名字category.products不一样,这里为joymami_category.products
2. 在template目录下建立catalogue/category/series.phtml文件,里面定义自己的html显示。
重新运行
看看是否发生了变化:)
II.重写(rewrite) Block入口类
这种定制使用的情况是:如果你想在模板文件中输出更多的动态数据,而原来的Block类不足以提供这些数据,那么就需要重写(rewrite)这个Block类,在Block类中用API改变(相对于layout文件配置改变)Template文件指向。请看另一篇帖子对这种方法的解释
III.改变原来的入口 重写(rewrite) Block入口类
严格说,这种方法不是本文讨论的范畴,因为改变了入口,意味着你抛弃了原来的一切(Controller,Model,Template), 是全新的Module.请看本论坛内如何定制Module的文章