Magento 覆写

magento的覆写很重要,在项目开发过程中经常需要修改核心的东西,但为了不影响magento系统升级,我们不能直接对magento的核心代码修改,我们只能覆写。下面介绍各个部件的覆写方法 。

如要覆写magento核心模块里面的php文件即app/code/core目录下的php文件,可以把core目录下的文件直接复制到 local目录 下,比如覆写/core/Mage/Catalog/Model/Product.php文件,那么把product复制放到local保持路径一至 /local/Mage/Catalog/Model/Product.php,然后Magento就会用local中这个文件而不是core里面的。顺 序是local→community→core→lib,意思是用这种方法连lib里面的文件都可以覆写。但 controller是不能用这种方法覆写的。这个覆写之所以起作用是因为Magento set_include_path的时候先加的是local,然后是community,然后是core,再然后才是lib。(见 app/Mage.php文件)但这种覆写方式不好,尽量不用

 

接下来说的覆写方法才是比较合理的。

etc的覆写

etc其实不需要覆写,如你要改其它模块的配置信息,直接在自己的模块配置文件里面改就行了,一样可以改过来。

来个例子吧,比如你要修改config/global/customer/address/formats/html的值,你不需要非得在customer模块中改。在任意的etc/config.xml文件都可以改 如下代码就OK。

Java代码  

  1. <global>  
  2.     <customer>  
  3.         <address>  
  4.             <formats>  
  5.                 <html>  
  6.                     <defaultFormat><![CDATA[  
  7. <strong>Character Name:</strong> {{var character_name}}<br />  
  8. <strong>Name:</strong> {{depend prefix}}{{var prefix}} {{/depend}}{{var firstname}} {{depend middlename}}{{var middlename}} {{/depend}}{{var lastname}}{{depend suffix}} {{var suffix}}{{/depend}}<br />  
  9. <strong>Country:</strong> {{var country}}<br />  
  10. {{depend telephone}}<strong>Tel: </strong> {{var telephone}}{{/depend}}  
  11.             ]]></defaultFormat>  
  12.                 </html>  
  13.             </formats>  
  14.         </address>  
  15.     </customer>  
  16. </global>  

Block, Model, Helper的覆写

Block, Model, Helper的覆写比较简单,而且方式一样,这里面只示例block的覆写 比如就在Helloworld模块的上,覆写page/html block。 在etc/config.xml的config/global/blocks里面添加以下代码

Java代码  

  1. <helloworld>            
  2.     <rewrite>  
  3.         <page_html>Namespace_Helloworld_Block_Page_Html</page_html>  
  4.     <adminhtml_import_edit>test_Sales_Block_Adminhtml_Import_Edit</adminhtml_import_edit>  
  5.     </rewrite>  
  6. </helloworld>  

 然后在此模块目录下的Block目录下新建Page目录,然后新建Html.php文件,文件内容为

Java代码  

  1. <?php     
  2. class Namespace_Helloworld_Block_Page_Html extends Mage_Page_Block_Html  
  3. {  
  4.     //override goes here.  
  5.     //在这里面可以尽情重写,  
  6. }  

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

Java代码  

  1. <global>  
  2.     <models>  
  3.         <customer>  
  4.             <rewrite>  
  5.                 <customer>App_Customer_Model_Customer</customer>  
  6.             </rewrite>  
  7.         </customer>  
  8.     </models>  
  9. </global>  

现在写你新的Model,在文件app/code/local/App/Customer/Model/Customer.php中新建类App_Customer_Model_Cutomer

Java代码  

  1. class App_Customer_Model_Customer extends Mage_Customer_Model_Customer {  
  2.      // 重写已存在的方法  
  3.      public function validate() {  
  4.          // Define new validate rules. From now magento call this validate method instead of existing method  
  5.          //return $errors;  
  6.          return true;  
  7.      }  
  8.     
  9.      // 你还可以创建新的方法  
  10.      public function newMethod() {  
  11.          // function logic  
  12.      }  
  13.  }  

用这种覆写方式的好处是,这里用到了继承,也就是没必要重写的可以不写出来,直接继承父类就行了。

controller的覆写

controller有两种覆写方法,假如我们想在浏览产品分类的时候用到的不是Mage_Catalog模块下的category控制器,而是Namespace_Helloworld模块下的catalog_category控制器。

Action覆写

Java代码  

  1. <global>  
  2.     <rewrite>  
  3.            <App_Test_blog>  
  4.                <from><![CDATA[#^/test/index/index222/#]]></from>  
  5.                <to>/test/index/hello/</to>  
  6.            </App_Test_blog>  
  7.     </rewrite>     

方法一 修改etc/config文件,在config/global里面加上改下代码

Java代码  

  1. <rewrite>  
  2.     <helloworld_catalog_category>  
  3.         <from><![CDATA[#^(/)?catalog/category/#]]></from>  
  4.         <to><![CDATA[helloworld/catalog_category/]]></to>  
  5.     </helloworld_catalog_category>  
  6. </rewrite>  

这种方法实际上是正则替换把catalog/category/*替换成了helloworld/catalog_category/* 然后在Helloworld模块目录下的controllers目录下,新建Catalog目录,然后新建CategoryController.php 文件,内容为

Java代码  

  1. <?php  
  2. require_once 'Mage/Catalog/controllers/CategoryController.php';  
  3.   
  4. class Namespace_Helloworld_Catalog_CategoryController extends Mage_Catalog_CategoryController {  
  5.     /** 
  6.      * Category view action 
  7.      */  
  8.     public function viewAction()  
  9.     {  
  10.         echo 'controller override success';  
  11.         parent::viewAction();  
  12.     }  
  13.   
  14. }  
  15. ?>  

方法二 方法二与方法一的唯一不同是etc/config.xml的写法不一样,方法二的写法如下 在config下加下面的代码。

Java代码  

  1. </global>  
  2. <admin>  
  3.      <routers>  
  4.         <adminhtml>  
  5.             <args>  
  6.                 <modules>  
  7.                     <Namespace_Helloworld before="Mage_Adminhtml">Namespace_Helloworld</Namespace_Helloworld>  
  8.                 </modules>  
  9.             </args>  
  10.         </adminhtml>  
  11.     </routers>  
  12. </admin>    
  13. <frontend>  

 

时间: 2024-09-17 04:49:19

Magento 覆写的相关文章

c#.net中类的覆写(OverRide)

c#.net中类的覆写(OverRide)   public class MyBase...{   public virtual string Meth1()   ...{      return "MyBase-Meth1";   }   public virtual string Meth2()   ...{      return "MyBase-Meth2";   }   public virtual string Meth3()   ...{      r

[你必须知道的.NET]第十七回:貌合神离:覆写和重载

本文将介绍以下内容: 什么是覆写,什么是重载 覆写与重载的区别 覆写与重载在多态特性中的应用 1.引言 覆写(override)与重载(overload),是成就.NET面向对象多态特性的基本技术之一,两个貌似相似而实则不然的概念,常常带给我们很多的误解,因此有必要以专题来讨论清楚其区别,而更重要的是关注其在多态中的应用. 在系列中,我们先后都有关于这一话题的点滴论述,本文以专题的形式再次做以深度讨论,相关的内容请对前文做以参考. 2.认识覆写和重载 从一个示例开始来认识什么是覆写,什么是重载?

java-初学者求问覆写与否的方法调用问题

问题描述 初学者求问覆写与否的方法调用问题 在看Java开发实战经典的时候看到覆写一部分,大致代码如下: public class Hello { public static void main(String[] args) { new Student().fun(); } } class Person{ private void print() { System.out.println(""Person""); } void fun() { this.print(

覆写Activity的finish()方法

MainActivity如下: package cn.testfinish; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; /** * Demo描述: * 覆写Activity的finish()方法 * 一般情况下当调用finish()方法

详解java重载与覆写的区别_java

很多同学对于overload和override傻傻分不清楚,建议不要死记硬背概念性的知识,要理解着去记忆.先给出我的定义: 首先我们来讲讲:重载(Overloading) (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型.重载Overloading是一个类中多态性的一种表现. (2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义.调用方法时通过传递给它们的不同参数个数和参数类型来决定具

在ASP.NET页面中推荐使用覆写而不是事件处理

asp.net|页面 English Version: http://dflying.dflying.net/1/archive/101_prefer_overrides_to_event_handlers_in_aspnet_page.html 这个是我们熟悉的Page_Load()方法.实际上它是一个Event Handler,当定义在System.Web.UI.Page中的Load事件触发时,它开始执行. // use event handlerprotected void Page_Lo

一个较为安全的覆写文件函数

安全|函数 <?php// 安全覆盖文件写入,防止写入失败文件丢失,如果您的代码中有以"w"模式写入文件的代码// 推荐改用 f_xwrite() 的方式写入.// $Id: f_xwrite.php,v 1.2 2004/12/03 05:27:04 hightman Exp $ function f_xwrite($fpath, $buf, $length = -1) {    $ret = 0;        if ($length < 0) $length = st

objective-C 的OOP(下)-类(static)方法、实例方法、overwrite(覆写)、属性(property)

 先来定义一个Human父类 定义部分: // // Human.h // OOP // // Created by jimmy.yang on 11-2-9. // Copyright 2011 __MyCompanyName__. All rights reserved. // #import <Foundation/Foundation.h> @interface Human : NSObject { BOOL sex; } +(void) toString; -(void) showS

php实现parent调用父类的构造方法与被覆写的方法

 这篇文章主要介绍了php实现parent调用父类的构造方法与被覆写的方法,在上一篇关于使用类继承解决代码重复问题的基础上,进一步分析了parent调用父类的构造方法与被覆写的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了php实现parent调用父类的构造方法与被覆写的方法.分享给大家供大家参考.具体分析如下: 覆写:被重新设计. 在子类中定义构造方法时,需要传递参数给父类的构造方法,否则我们得到的可能是一个构造不完整的对象. 要调用父类的方法,首先要找到一个引用