记得有篇关于《Magento开发者最容易出现的3个错误》文章里面提到的一点就是——-修改 Magento 的核心文件, 这是很多新的magento开发者最容易犯的一个毛病, 一旦修改了magento的核心文件,以后如果要对magento进行升级, 那将是一个恶梦, 同时,也容易造成不同模块间的冲突, 背离magento模块之间低耦合的设计思想。
今天, 我们一起来回顾一下,如何对magento的model, block, controller 进行重写
首先, 我们要创建一个新的module, 具体方法可以参见这里
一个新的module是一个独立的模块, 还是重写magento核心的模块的关键在于, 配置config.xml文件, 那么如何通过配置config.xml来重写magento的model, block 和controller呢?
1. 针对block 和 model
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
<?xml version="1.0" encoding="UTF-8"?><config> <modules> <App_Catalog> <version>0.1.0</version> </App_Catalog> </modules> <global> <blocks> <catalog> <rewrite> <breadcrumbs>App_Catalog_Block_Breadcrumbs</breadcrumbs> </rewrite> </catalog> </blocks> <models> <customer> <rewrite> <customer>App_Customer_Model_Customer</customer> </rewrite> </customer> </models> </global></config> |
2. 针对contoller
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
<?xml version="1.0" encoding="UTF-8"?><config> <modules> <App_Catalog> <version>0.1.0</version> </App_Catalog> </modules> <global> <!-- This rewrite rule could be added to the database instead --> <rewrite> <!-- This is an identifier for your rewrite that should be unique --> <!-- THIS IS THE CLASSNAME IN YOUR OWN CONTROLLER --> <App_Shopping_cart> <from><![CDATA[#^/catalog/product/#]]></from> <!-- - Shopping module matches the router frontname below - checkout_cart matches the path to your controller Considering the router below, "/shopping/cart/" will be "translated" to "/App/Shopping/controllers/CartController.php" (?) --> <to>/catalog/product/</to> </App_Shopping_cart> </rewrite> </global> <frontend> <routers> <catalog> <use>standard</use> <args> <module>App_Catalog</module> <frontName>catalog</frontName> </args> </catalog> </routers> </frontend></config> |
有一点需要注意的是,你需要把这个模块的所有Controller都重写,这可能会带来很大的麻烦, 怎么可以避免这个问题呢, 情况下面的config.xml写法:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
<?xml version="1.0" encoding="UTF-8"?><config> <modules> <App_Catalog> <version>0.1.0</version> </App_Catalog> </modules> <frontend> <routers> <catalog> <use>standard</use> <args> <module>App_Catalog</module> <frontName>catalog</frontName> </args> </catalog> </routers> </frontend> <global> <routers> <catalog> <rewrite> <to>App_Catalog/catalog</to> <override_actions>true</override_actions> <actions> <noroute><to>App_Catalog/catalog/product</to></noroute> </actions> </rewrite> </catalog> </routers> </global></config> |
以上都是一些常见的重写方式, 以后我们还会添加一些特别的重写方法.

