1、深入理解Magento-第九章-修改、扩展、重写Magento代码 作为一个开发者的你,肯定要修改Magento代码去适应你的业务需求,但是在很多时候我们不希望修改Magento的核心代码,这里有很多原因,例如将来还希望升级Magento、还想使用更多的Magento代码。如果你正在寻找修改Magento代码的最佳方式,那么此篇文章将会是一个不错的教程。 适合对象:高级开发者 适合目标:开发者希望自定义修改Magento 当前版本:Magento versions: 1.4.0.1 作者:精东 最后修改时间:2010年7月13日 版本:V 0.3.0 重写Magento模块(M
2、odule) 第一步,你需要创建属于你自己代码的命名空间,例如Wemvc,App等,为了方便与大家分享代码,我将空间命名为App。 app/ code/ core/ community/ local/ App/ 假如你现在打算修改Mage/Catalog/Block/Breadcrumbs.php这个文件,你可以在你的命名空间,App里添加一个新的模块“Catalog”。接下来创建块(Block)目录,并复制Breadcrumbs.php到你的新目录中。这里
3、还需要你创建一个config.xml配置文件。 app/ code/ core/ community/ local/ App/ Catalog/ Block/ Breadcrumbs.php
4、 etc/
config.xml
修改Breadcrumbs.php的类名为App_Catalog_Block_Breadcrumbs,并继承原类名Mage_Catalog_Block_Breadcrumbs。
现在,你需要激活你的新模块,这样magento才能够知道你的新模块。
创建文件app/etc/modules/App_All.xml,添加如下代码。
< ?xml version="1.0"?>
5、
6、0" encoding="UTF-8"?>
7、readcrumbs>
8、log/Block/Breadcrumbs.php。如果你有更多的目录层级,可以用下滑线来分隔。例如:
9、alog/Block/Category/View.php。 在breadcrumbs标签中的值是你的类名,这样Magento就可以获取你的类,因为类名与你的目录名一致。用过zend framework的人都知道,自动加载auto loader这个东西,它会跟你类名中的下滑线去你的目录中需要对应的类文件。记住一点,下滑线代表下一级别的文件夹,如果你的类名与你的文件目录名不一致,那么Magento根本不会理睬你。 举例来说: App_Catalog_Block_Breadcrumbs → /app/code/local/App/Catalog/Block/Breadcrumbs.php
10、App_Catalog_Block_Category_View → /app/code/local/App/Catalog/Block/Category/View.php 重写Magento控制器(Controller)-正则表达式匹配式 重写Magento控制器我们我们以重写购物车为例。 1、首先在App下创建新的模块,依次创建如下文件: /app/code/local/App/Shopping /app/code/local/App/Shopping/etc /app/code/local/App/Shopping/etc/config.xml /app/code/local
11、/App/Shopping/controllers
/app/code/local/App/Shopping/controllers/CartController.php
2、编辑/app/code/local/App/Shopping/etc/config.xml文件,加入如下代码:
14、ewrite>
15、ndard
16、r.php 请将下面的代码添加到你的控制器中,我们唯一修改的地方是在index动作中添加一个error_log(); < ?php # 控制器不会自动加载,所以我们需要包含文件,这里与区块(Block)不一样 require_once 'Mage/Checkout/controllers/CartController.php'; class App_Shopping_CartController extends Mage_Checkout_CartController { #覆写indexAction方法 public function indexAction(
17、)
{
# Just to make sure
error_log('耶~成功重写购物车!');
parent::indexAction();
}
}
在这段代码中,首先是类名,跟前面讲到的区块(Block)一样,我们自己的类名是App_Shopping_CartController继承原先Mage_Checkout_CartController.在indexAction中我们记录了一段信息。
4、修改App_All.xml,激活我们新的Shopping模块
18、s>
19、log成功记录了我们的信息,打开页面http://www.wemvc.dev/checkout/cart/,显示的是购物车页面,一切正常,但如果你访问http://www.wemvc.dev/shopping/cart/,你会发现是首页。。。。我们期望的购物车视图还没有出现,如何解决呢?让我们接下来往下看。
5、修改视图文件app/design/frontend/[myinterface]/[mytheme]/layout/checkout.xml
在layout标签中,添加下面内容:
21、/code/local/App/Catalog/controllers/ProductController.php 代码如下: require_once 'Mage/Catalog/controllers/ProductController.php'; /** * Product controller * * @category Mage * @package Mage_Catalog */ class App_Catalog_ProductController extends Mage_Catalog_ProductController {
22、 /**
* View product action
*/
public function viewAction()
{
echo '覆盖过的....';
parent::viewAction();
}
}
b.编辑/app/code/local/App/Catalog/etc/config.xml,代码如下:
23、
24、
26、
27、
清空缓存,刷新你的商品详情页,看是不是变了,呵呵。但是这个方法有个弊病,你需要把这个模块的所有Controller都复写掉,不然你会遇到比较大的麻烦。说到这,我再介绍一种重写方法.
仔细看配置文件的写法:
28、
29、
30、
31、mer是已有的,它的模块名叫Customer,如果你想复写它,那么最好你再建一个App_Customers之类的。 重写Magento模型和动作助手(Model&Helper) 我们在改写Magento的过程中,为了实现自己的业务逻辑,难免要改它的业务模型。你可以尝试用模块下的配置文件配置你自己的类,继承你想重写的模型或者助手,然后调用自己的类。现在我们以用户模型为例深入讲解。 a.首先创建自己的模块文件夹 app/code/local/App/Customer app/code/local/App/Customer/etc/config.xml app/code/local/Ap
32、p/Customer/Model
app/code/local/App/Customer/Model/Customer.php
b.修改app/etc/modules/App_All.xml
33、encoding="UTF-8"?>
34、d.现在写你新的Model,在文件app/code/local/App/Customer/Model/Customer.php中新建类App_Customer_Model_Cutomer class App_Customer_Model_Customer extends Mage_Customer_Model_Customer { // 重写已存在的方法 public function validate() { // Define new validate rules. From now magento call this validate method instead of
35、existing method //return $errors; return true; } // 你还可以创建新的方法 public function newMethod() { // function logic } } e.我们再重写一个类,以加深理解。接下来我们重写Customer Address Model。 跟重写Customer Model一样,我们先编辑模块的配置文件app/code/local/App/Customer/etc/config.xml。
36、
37、 上面看出来了么,rewrite标签内的customer和address其实就是你要覆写的magento model。 接下来创建model class App_Customer_Model_Address,并写你要覆盖和新增的方法 class App_Customer_Model_Address extends Mage_Customer_Model_Address { // 重写已存在的方法 public function validate() { // Define new validate rules.
38、 From now magento call this validate method instead of existing method //return $errors; return true; } // 你还可以创建新的方法 public function newMethod() { // function logic } } f.我再讲下如何覆盖Magento的模型资源,这里以复写Address Entity Model class为例,我们先来修改模块的配置文件app/code/local/App/Customer/etc/config
39、xml。
40、/address>






