作为一个开发人员的你,肯定要改动Magento代码去适应你的业务需求,可是在非常多时候我们不希望改动Magento的核心代码,这里有非常多原因, 比如将来还希望升级Magento、还想使用很多其它的Magento代码。假设你正在寻找改动Magento代码的最佳方式,那么此篇文章将会是一个不错的教程。

适合对象:高级开发人员

适合目标:开发人员希望自己定义改动Magento

当前版本号:Magento versions: 1.4.0.1

作者:精东

重写Magento模块(Module)

第一步,你须要创建属于你自己代码的命名空间,比如MagentoNotes,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根本不会理睬你。
举例来说:

1
2
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();

# 控制器不会自己主动载入,所以我们须要包括文件,这里与区块(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>

到这里,清空Magento缓存后,你已经能够看到error_log成功记录了我们的信息,打开页面magentonotes.com/checkout /cart/,显示的是购物车页面,一切正常,但假设你訪问magentonotes.com/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>

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

到这里基本大功告成,可是,我建议你学习下正則表達式,由于刚刚的代码中,有这么一段:

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

这里是使用正則表達式进行匹配的。

另一点,经过尝试,这里是能够支持同模块名覆盖的,比如Magento代码中商品详情页是Mage_Catalog_ProductController::viewAction(),假设我们想重写这个Controller,我们能够这样做:
1) 建立新的文件夹/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();}
}

2) 编辑/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>

清空Magento缓存,刷新你的商品详情页,看是不是变了,呵呵。可是这种方法有个弊病,你须要把这个模块的全部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的过程中,为了实现自己的业务逻辑,难免要改它的业务模型。你能够尝试用模块下的配置文件配置你自己的类,继承你想重写的模型或者助手,然后调用自己的类。如今我们以用户模型为例深入解说。

1) 首先创建自己的模块目录

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

2) 改动app/etc/modules/App_All.xml

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

3) 改动自己的模块配置文件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>

4) 如今写你新的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}
}

5) 我们再重写一个类,以加深理解。接下来我们重写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}
}

6)我再讲下怎样覆盖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代码相关推荐

  1. 深入理解Magento-第九章-修改、扩展、重写Magento代码

    重写Magento模块(Module) 第一步,你需要创建属于你自己代码的命名空间,例如Wemvc,App等,为了方便与大家分享代码,我将空间命名为App . app/code/core/commun ...

  2. wangEditor-3.1.1 自己扩展的,增加代码块行号

    wangEditor-3.1.1 没有行号这个功能,自己扩展一下,增加代码块行号 效果图 详情查看 累行客 http://www.leixingke.com/article/detail/qM0ew6 ...

  3. 如何设置IIS实现无扩展名重写

    打开站点或者虚拟目录的属性框,在"目录"页里面点击"配置..."按钮 弹出"应用程序配置"框后,点击下面的"插入..." ...

  4. 放弃坚持15年的原生开发,1Password用Electron重写全部代码,用户炸了!

    编译 | Tina.核子可乐 跨平台开发更便宜,原生开发更优质? 作为世界上极受欢迎的密码管理器,1Password 放弃了 15 年来始终坚持的原生开发方式,转向了 Electron 框架,并彻底地 ...

  5. 实践,制作一个高扩展、可视化低代码前端,详实、完整

    RxEditor是一款开源企业级可视化低代码前端,目标是可以编辑所有 HTML 基础的组件.比如支持 React.VUE.小程序等,目前仅实现了 React 版. RxEditor运行快照: 项目地址 ...

  6. 函数重写 java_java 函数的重载和重写实例代码

    在java中多态分为两种编译时多态(重载)和运行时多态(重写),编译时多态又叫前绑定,运行时多态又叫后绑定. 下面用一个例子说明: public class OverloadAndOverwrite ...

  7. RabbitMQ安装及PHP扩展安装(最后的代码可以测试连接是否成功)

    RabbitMQ 标签(空格分隔): 未分类 安装RabbitMQ 安装 Erlang Erlang依赖库: GCC 编译使用 Ncurses 可以在Linux终端中写出字符用户界面的一个库 Open ...

  8. java重写的代码_java tostring方法重写代码示例

    当需要将一个对象输出到显示器时,通常要调用他的toString()方法,将对象的内容转换为字符串.java中的所有类默认都有一个toString()方法 默认情况下 System.out.printl ...

  9. 领导让我重写测试代码,我该怎么办?

    我有一个朋友,有一天问我这样的一个问题:"说现在他们公司有五个 python 测试工程师.但是有一天领导要求他把所有的自动化测试代码,全部都转化成 Java 语言." 虽然说他们在 ...

最新文章

  1. 最新:2020年度陈嘉庚科学奖出炉!施一公获生命科学奖
  2. 岗位内推 | 微软亚洲互联网工程院自然语言处理组招聘
  3. 计算机信息系统安全保护条例最新,计算机信息系统安全保护条例.doc
  4. Android安卓APK反编译逆向
  5. Spcok简约图片分享网站Typecho主题
  6. MapReduce实现倒排索引(Inverted Index)
  7. 【云原生之Docker实战】使用docker部署Memos碎片化知识管理工具
  8. Web测试的各个测试点
  9. senseTime,FaceU人脸识别技术
  10. 马尔萨斯人口论与数学模型
  11. Excel汉字转全拼以及首字母
  12. 视频转mp3格式怎么弄?
  13. hfss天线方向图导入matlab,MATLAB在天线方向图中应用和研究.PDF
  14. 计算机论文指导记录16次,论文指导记录怎么写 你知道吗
  15. 如何用人工智能高效选研究题目?
  16. 微软Azure AI Gallery 预测性维护案例
  17. gohttp断点续传文件服务器,go文件断点续传功能
  18. 艾迈斯半导体创新推出全球最高精度的数字温度传感器,适用于可穿戴设备和数据中心
  19. python 获得一个月有多少天
  20. 多组学分析及可视化R包

热门文章

  1. 【Hadoop】伪分布式安装---MapReduce程序运行到YARN上,编写MapReduce程序---HDFS yarn
  2. JMETER目录结构详解
  3. graphics | 基础绘图系统(五)——plot函数功能再探和低级绘图函数
  4. 广西大学计算机英语复试的内容,广西大学计算机专业的研究生复试时
  5. 自学 HTML 和 CSS,有哪些好的教材和网站教程推荐?
  6. 10 分钟,带你快速入门前端三大技术(HTML、CSS、JavaScript)
  7. java 爬虫 图片_java实现爬虫爬取小姐姐图片
  8. Qt 该文件不能在当前页码(936)中表示字符
  9. 无限级导航PHP,jQuery多级无限级导航下拉菜单代码
  10. 计算机系统结构课程所设计总结,高级计算机系统结构-课程总结(13页)-原创力文档...