重写Magento模块(Module)

第一步,你需要创建属于你自己代码的命名空间,例如Wemvc,App等,为了方便与大家分享代码,我将空间命名为App 。

app/code/core/community/local/App/

假如你现在打算修改Mage/Catalog/Block/Breadcrumbs.php 这个文件,你可以在你的命名空间,App里添加一个新的 模块“Catalog”。接下来创建块(Block)目录,并复制Breadcrumbs.php到你的新目录中。这里还需要你创建一个 config.xml配置文件。

app/code/core/community/local/App/Catalog/Block/Breadcrumbs.phpetc/config.xml

修改Breadcrumbs.php的类名为App_Catalog_Block_Breadcrumbs ,并继承原类名 Mage_Catalog_Block_Breadcrumbs 。
现在,你需要激活你的新模块,这样magento才能够知道你的新模块。

创建文件app/etc/modules/App_All.xml,添加如下代码。

< ?xml version="1.0"?>
<config><modules><App_Catalog><active>true</active><codePool>local</codePool></App_Catalog></modules>
</config>

下面我们需要一个特殊的标签来复写掉Breadcrumbs,下面我们通过模块的配置文件来实现。

重写Magento区块(Blocks)

编辑文件“app/code/local/App/Catalog/etc/config.xml ”

<?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></global>
</config>

我们需要添加一个“blocks” 标签,或者在已经存在的“blocks”标签中添加内容。然后在模块名后面添加rewrite标签,在这个例子中模块名是“catalog”。然后我们看 “breadcrumbs”标签,这个标签帮助magento找到我们我们想修改的块。在我们的列子中,breadcrumbs是Magento核心代码 中的类名: app/code/core/Mage/Catalog/Block/Breadcrumbs.php 。如果你有更多的目录层级,可以用下滑线来分隔。例 如:

<blocks><catalog><rewrite><category_view>App_Catalog_Block_Category_View</category_view></rewrite></catalog></blocks>

在这个例子中,我们重写了app/code/core/Mage/Catalog/Block/Category/View.php 。

在breadcrumbs标签中的值是你的类名,这样Magento就可以获取你的类,因为类名与你的目录名一致。用过zend framework的人都知道,自动加载auto loader这个东西,它会跟你类名中的下滑线去你的目录中需要对应的类文件。记住一点,下滑线代表下一级别的文件夹,如果你的类名与你的文件目录名不一 致,那么Magento根本不会理睬你。
举例来说:

App_Catalog_Block_Breadcrumbs → /app/code/local/App/Catalog/Block/Breadcrumbs.php
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/App/Shopping/controllers
/app/code/local/App/Shopping/controllers/CartController.php

2、编辑/app/code/local/App/Shopping/etc/config.xml 文件,加入如下代码:

<?xml version="1.0"?>
<config><modules><App_Shopping><version>0.1.0</version></App_Shopping></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[#^/checkout/cart/#]]></from><!--- Shopping module matches the router frontname below - checkout_cartmatches the path to your controller Considering the router below,"/shopping/cart/" will be "translated" to"/App/Shopping/controllers/CartController.php" (?)--><to>/shopping/cart/</to></App_Shopping_cart></rewrite></global><!--If you want to overload an admin-controller this tag should be <admin>instead, or <adminhtml> if youre overloading such stuff (?)--><frontend><routers><App_Shopping><!-- should be set to "admin" when overloading admin stuff (?) --><use>standard</use><args><module>App_Shopping</module><!-- This is used when "catching" the rewrite above --><frontName>shopping</frontName></args></App_Shopping></routers></frontend>
</config>

3、改写你自己的控制器 /app/code/local/App/Shopping/controllers/CartController.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(){# Just to make sureerror_log('耶~成功重写购物车!');parent::indexAction();}
}

在这段代码中,首先是类名,跟前面讲到的区块(Block)一样,我们自己的类名是App_Shopping_CartController 继承原先Mage_Checkout_CartController. 在indexAction 中我们记录了一段信息。

4、修改App_All.xml ,激活我们新的Shopping模块

<?xml version="1.0"?>
<config><modules><App_Catalog><active>true</active><codePool>local</codePool></App_Catalog><App_Shopping><active>true</active><codePool>local</codePool></App_Shopping></modules>
</config>

到这里,清除缓存后,你已经可以看到error_log成功记录了我们的信息,打开页面http://www.wemvc.dev/checkout/cart/ ,显示的是购物车页面,一切正常,但如果你访问http://www.wemvc.dev/shopping/cart/ ,你会发现是首页。。。。我们期望的购物车视图还没有出现,如何解决呢?让我们接下来往下看。

5、修改视图文件app/design/frontend/[myinterface]/[mytheme]/layout/checkout.xml
在layout标签中,添加下面内容:

   <app_shopping_cart_index><update handle="checkout_cart_index"/></app_shopping_cart_index>

注意,这里的大小写敏感。

到这里基本大功告成,但是,我建议你学习下正则表达式,因为刚刚的代码中,有这么一段:

<from>< ![CDATA[#^/checkout/cart/#]]></from>

这里是使用正则表达式进行匹配的。

还有一点,经过尝试,这里是可以支持同模块名覆盖的,例如Magento代码中商品详情页是Mage_Catalog_ProductController::viewAction() ,如果我们想重写这个Controller,我们可以这样做:

a.简历新的目录/app/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
{/*** View product action*/public function viewAction(){echo '覆盖过的....';parent::viewAction();}
}

b.编辑/app/code/local/App/Catalog/etc/config.xml ,代码如下:

<?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_cartmatches 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><blocks><catalog><rewrite><breadcrumbs>App_Catalog_Block_Breadcrumbs</breadcrumbs></rewrite></catalog></blocks></global><frontend><routers><catalog><use>standard</use><args><module>App_Catalog</module><frontName>catalog</frontName></args></catalog></routers></frontend>
</config>

清空缓存,刷新你的商品详情页,看是不是变了,呵呵。但是这个方法有个弊病,你需要把这个模块的所有Controller都复写掉,不然你会遇到比较大的麻烦。说到这,我再介绍一种重写方法.
仔细看配置文件的写法:

<?xml version="1.0"?>
<config><modules><App_Mycms><version>0.1.0</version></App_Mycms></modules><frontend><routers><mycms><use>standard</use><args><module>App_Mycms</module><frontName>mycms</frontName></args></mycms></routers></frontend><global><routers><cms><rewrite><index><to>App_Mycms/index</to><override_actions>true</override_actions><actions><noroute><to>App_Mycms/index/noroute</to></noroute></actions></index></rewrite></cms></routers></global>
</config>

综上所述,三种重写方法都各有千秋,关键看你用在什么地方。另外我们在实践中发现,Magento好像不建议你自己的模块名与现有系统中的模块名一 致,例如Mage_Customer是已有的,它的模块名叫Customer,如果你想复写它,那么最好你再建一个App_Customers 之类的。

重写Magento模型和动作助手(Model&Helper)

我们在改写Magento的过程中,为了实现自己的业务逻辑,难免要改它的业务模型。你可以尝试用模块下的配置文件配置你自己的类,继承你想重写的模型或者助手,然后调用自己的类。现在我们以用户模型为例深入讲解。

a.首先创建自己的模块文件夹

app/code/local/App/Customer
app/code/local/App/Customer/etc/config.xml
app/code/local/App/Customer/Model
app/code/local/App/Customer/Model/Customer.php

b.修改app/etc/modules/App_All.xml

<App_Customer><active>true</active><codePool>local</codePool></App_Customer>

c.修改自己的模块配置文件app/code/local/App/Customer/etc/config.xml

<?xml version="1.0" encoding="UTF-8"?>
<config><modules><App_Customer><version>0.1.0</version></App_Customer></modules><global><models><customer><rewrite><customer>App_Customer_Model_Customer</customer></rewrite></customer></models></global>
</config>

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 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 。

<?xml version="1.0" encoding="UTF-8"?>
<config><modules><App_Customer><version>0.1.0</version></App_Customer></modules><global><models><customer><rewrite><customer>App_Customer_Model_Customer</customer><address>App_Customer_Model_Address</address></rewrite></customer></models></global>
</config>

上面看出来了么,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. 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.xml 。

<?xml version="1.0" encoding="UTF-8"?>
<config><modules><App_Customer><version>0.1.0</version></App_Customer></modules><global><models><customer><rewrite><customer>App_Customer_Model_Customer</customer><address>App_Customer_Model_Address</address></rewrite></customer><customer_entity><rewrite><address>App_Customer_Model_Entity_Address</address></rewrite></customer_entity></models></global>
</config>

接下来创建类文件。

class App_Customer_Model_Entity_Address extends Mage_Customer_Model_Entity_Address {protected function _afterSave(Varien_Object $address) {// Write your code}
}

总结

在本章中我们学习了如何重写模块、重写控制器、重写区块,以及如何重写模型和助手,基本重写Magento代码对你来说已经不是难事了。文章至此, 要恭喜你,你已经掌握了大部分修改Magento的技能。下面的文章我们会进行更深入的研究。最后感谢所有Sasacake Team Member,是他们对待工作的热情和责任感促使我写这些教程。

原文链接:http://www.wemvc.com/1187.html

深入理解Magento-第九章-修改、扩展、重写Magento代码相关推荐

  1. 深入理解计算机系统——第九章 Virtual Memory

    深入理解计算机系统--第九章 Virtual Memory 9.1 Physical and Virtual Addressing 9.2 Address Spaces 9.3 VM as a Too ...

  2. java2实用教程第5版第九章_java2实用教程(例子代码)第4版第九章.doc

    java2实用教程(例子代码)第4版第九章 java2实用教程(例子代码)第4版第九章 例9_3 Lt4_3.java public clss Lt4_3 { public static void m ...

  3. 深入理解计算机系统--第九章虚拟存储器

    9.虚拟存储器 为了更加有效地管理存储器且少出错,现代系统提供了对主存的抽象概念,叫做虚拟存储器(VM). 虚拟存储器是硬件异常,硬件地址翻译,主存,磁盘文件和内核软件的完美交互. 为每个进程提供一个 ...

  4. 深入理解MAGENTO – 第九章 – 数据集合瓦瑞恩

    本来,作为一个PHP程序员,如果你想攒一组变量的相关你有一个选择,古老的 阵列 . 尽管共享一个地址的名称与C存储器的阵列,一个PHP数组是一种通用的字典可变数组索引像数值对象结合行为的影响. 在其他 ...

  5. linux动态分配全局置换,深入理解计算机系统 第九章 虚拟存储器

    虚拟存储器 定义: 对主存的抽象机制,是硬件异常.硬件地址翻译.主存.磁盘文件和内核软件的完美交互. 功能: 1. 将主存看成是一个存储在磁盘上的地址空间的高速缓存,在内存中只保存活动区域,并根据需要 ...

  6. 【机器学习实战 第九章】树回归 CART算法的原理与实现 - python3

    本文来自<机器学习实战>(Peter Harrington)第九章"树回归"部分,代码使用python3.5,并在jupyter notebook环境中测试通过,推荐c ...

  7. 《数学之美》——第九章 个人笔记

    数学之美 最近在读<数学之美>这本书,做一下个人笔记.看的是PDF,看完后会买一本的哦!版权意识还是有的. ps:图片文字都是这本书中的内容,侵权立删.会有点自己的理解. 第九章    图 ...

  8. 深入理解Magento – 第一章 – Magento强大的配置系统

    深入理解Magento 作者:Alan Storm 翻译:Hailong Zhang 第一章 – Magento强大的配置系统 Magento的配置系统就像是Magento的心脏,支撑着Magento ...

  9. 深入理解Java虚拟机(第二版) 第九章:类加载及执行子系统的案例与实战

    第九章 类加载及执行子系统的案例与实战 9.1 概述 9.2 Tomcat: 正统的类加载器架构 9.3 OSGi:灵活的类加载器架构 9.4 字节码生成技术与动态代理的实现 9.5 Retrotra ...

最新文章

  1. 百度绝对控股,小度科技独立融资,投后估值200亿元
  2. 枚举当前环境中打开的所有IE
  3. Mysql梳理(单表查询)
  4. 转hdmi_LT8619CHDMI转LVDS-HDMI支持高达4Kx2K_30Hz的分辨率
  5. PlSqlDev中执行INSERT SQL语句包含符号导致数据异常
  6. Mysql 报错:Unknown collation: ‘utf8mb4_0900_ai_ci‘
  7. MySQL 索引原理
  8. android 热补丁工具,Hotfix补丁工具报错排查步骤
  9. js教程实践(JS基础)
  10. c++ primer--容器的综合应用:文本查询程序
  11. java工作流框架jbpm_【Java EE 学习 67 上】【OA项目练习】【JBPM工作流的使用】
  12. java perm 查看_JVM 分析工具和查看命令,超详细
  13. 线性判别分析(Linear Discriminant Analysis, LDA)算法分析
  14. 微信小程序入门--快递查询小程序的制作
  15. deepin20.1操作系统安装无线网卡驱动(8821ce)
  16. PF-EPF-UPF的对比仿真
  17. 近期读书计划(2018.9.11~)
  18. 房产小程序APP功能
  19. 锐捷——Telnet登陆时使用密码登陆路由器
  20. 让win7彻底摆脱“脱机工作”的骚扰

热门文章

  1. 小鱼比可爱(洛谷-P1428)
  2. 计算机二级ms office知识点讲解,全国计算机二级MSOffice复习知识点
  3. icpc西部区域赛_信息学子在ACMICPC 2020中国(西部)大学生程序设计竞赛中喜获佳绩...
  4. 【十万个编程篇】Linux—Debian系列,deb包首次分析
  5. 一起学习C语言:C语言基本语法(五)
  6. python调用matlab函数_从 Python 调用 MATLAB 函数的三种方法
  7. pandas python2.3版本_python-像以前的版本一样,将pandas 0.13.0“ pri...
  8. delphi控件切图界面闪烁_先本设计教你跳过UI小程序的七个坑
  9. OpenCV辅助对象(help objects)(6)_InputArray和OutputArray
  10. vscode浏览器扩展(图文教程) - 设置篇