深入理解Magento-第九章-修改、扩展、重写Magento代码.doc_第1页
深入理解Magento-第九章-修改、扩展、重写Magento代码.doc_第2页
深入理解Magento-第九章-修改、扩展、重写Magento代码.doc_第3页
深入理解Magento-第九章-修改、扩展、重写Magento代码.doc_第4页
深入理解Magento-第九章-修改、扩展、重写Magento代码.doc_第5页
已阅读5页,还剩8页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

深入理解Magento第九章修改、扩展、重写Magento代码作为一个开发者的你,肯定要修改Magento代码去适应你的业务需求,但是在很多时候我们不希望修改Magento的核心代码,这里有很多原因,例如将来还希望升级Magento、还想使用更多的Magento代码。如果你正在寻找修改Magento代码的最佳方式,那么此篇文章将会是一个不错的教程。适合对象:高级开发者适合目标:开发者希望自定义修改Magento当前版本:Magento versions: 作者:精东最后修改时间:2010年7月13日版本:V 0.3.0重写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.php etc/ config.xml修改Breadcrumbs.php的类名为App_Catalog_Block_Breadcrumbs,并继承原类名Mage_Catalog_Block_Breadcrumbs。现在,你需要激活你的新模块,这样magento才能够知道你的新模块。创建文件app/etc/modules/App_All.xml,添加如下代码。 true local 下面我们需要一个特殊的标签来复写掉Breadcrumbs,下面我们通过模块的配置文件来实现。重写Magento区块(Blocks)编辑文件“app/code/local/App/Catalog/etc/config.xml” 0.1.0 App_Catalog_Block_Breadcrumbs 我们需要添加一个“blocks” 标签,或者在已经存在的“blocks”标签中添加内容。然后在模块名后面添加rewrite标签,在这个例子中模块名是“catalog”。然后我们看“breadcrumbs”标签,这个标签帮助magento找到我们我们想修改的块。在我们的列子中,breadcrumbs是Magento核心代码中的类名: app/code/core/Mage/Catalog/Block/Breadcrumbs.php。如果你有更多的目录层级,可以用下滑线来分隔。例如: App_Catalog_Block_Category_View 在这个例子中,我们重写了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.php2、编辑/app/code/local/App/Shopping/etc/config.xml文件,加入如下代码:0.1.0/shopping/cart/!-If you want to overload an admin-controller this tag should be instead, or if youre overloading such stuff (?)-standardApp_Shoppingshopping3、改写你自己的控制器/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模块 true local true local 到这里,清除缓存后,你已经可以看到error_log成功记录了我们的信息,打开页面http:/www.wemvc.dev/checkout/cart/,显示的是购物车页面,一切正常,但如果你访问http:/www.wemvc.dev/shopping/cart/,你会发现是首页。我们期望的购物车视图还没有出现,如何解决呢?让我们接下来往下看。5、修改视图文件app/design/frontend/myinterface/mytheme/layout/checkout.xml在layout标签中,添加下面内容:注意,这里的大小写敏感。到这里基本大功告成,但是,我建议你学习下正则表达式,因为刚刚的代码中,有这么一段:这里是使用正则表达式进行匹配的。还有一点,经过尝试,这里是可以支持同模块名覆盖的,例如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,代码如下: 0.1.0 /catalog/product/ App_Catalog_Block_Breadcrumbs standard App_Catalog catalog 清空缓存,刷新你的商品详情页,看是不是变了,呵呵。但是这个方法有个弊病,你需要把这个模块的所有Controller都复写掉,不然你会遇到比较大的麻烦。说到这,我再介绍一种重写方法.仔细看配置文件的写法: 0.1.0 standard App_Mycms mycms App_Mycms/index true App_Mycms/index/noroute 综上所述,三种重写方法都各有千秋,关键看你用在什么地方。另外我们在实践中发现,Magento好像不建议你自己的模块名与现有系统中的模块名一致,例如Mage_Customer是已有的,它的模块名叫Customer,如果你想复写它,那么最好你再建一个App_Customers之类的。重写Magento模型和动作助手(Model&Helper)我们在改写Magento的过程中,为了实现自己的业务逻辑,难免要改它的业务模型。你可以尝试用模块下的配置文件配置你自己的类,继承你想重写的模型或者助手,然后调用自己的类。现在我们以用户模型为例深入讲解。a.首先创建自己的模块文件夹app/code/local/App/Customerapp/code/local/App/Customer/etc/config.xmlapp/code/local/App/Customer/Modelapp/code/local/App/Customer/Model/Customer.phpb.修改app/etc/modules/App_All.xml true local c.修改自己的模块配置文件app/code/local/App/Customer/etc/config.xml0.1.0App_Customer_Model_Customerd.现在写你新的Model,在文件app/code/local/App/Customer/Model/Customer.php中新建类App_Customer_Model_Cutomerclass 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 logice.我们再重写一个类,以加深理解。接下来我们重写Customer Address Model。 跟重写Customer Model一样,我们先编辑模块的配置文件app/code/local/App/Customer/etc/config.xml。0.1.0App_Customer_Model_CustomerApp_Customer_Model_Address上面看出来了么,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 logicf.我再讲下如何覆盖Magento的模型资源,这里以复写Address Entity Model class为例,我们先来修改模块的配置文件app/code/local/App/Customer/etc/config.xml。0.1.0App_Customer_Model_CustomerApp_Customer_Model_AddressApp_Customer_Model_Entity_Address接下来创建类文件。class App_Customer_Model_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论