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>  

 

相关文章
|
设计模式 存储 架构师
ThinkPHP5源码阅读-类的自动加载register与autoload的实现
PHP快速入门与实战ThinkPHP是国内最流行的一款PHP框架,是国人自主研发的框架,起源于2006年,经过了十几年的不断发展。已经成为了一款被PHP广泛认可的性能开发效率兼具的利器。阅读框架源码有助于我们更好的学习语言基础,拓展设计模式等相关能力。同时很多设计与编码的思想也能更好的指导我们日常工作,尤其是想成为资深程序员或者架构师方面的同事,这是一个必须要学习的过程。今天是ThinkPHP5源码第一讲,关于类的自动加载,看看源码底层是怎么实现的。怕迷路的同学,先给个关注吧。
107 0
PHP的重写和重载是干什么的?区别是什么?底层原理是什么?
PHP的重写和重载是干什么的?区别是什么?底层原理是什么?
160 0
|
存储 PHP
PHP重的重载和重写的区别是什么?底层原理是什么?
PHP重的重载和重写的区别是什么?底层原理是什么?
160 0
|
Apache 开发工具 SEO
Apache Typecho框架启用地址重写
地址重写有利于SEO优化,开启地址重写可以去掉Typecho框架中的index.php后缀,该后缀如下。
355 0
Apache Typecho框架启用地址重写
|
PHP 开发者
PHP 继承——重写 Override|学习笔记
快速学习 PHP 继承——重写 Override
PHP 继承——重写 Override|学习笔记
|
缓存
Laravel-admin 重写源码 自定义排序回调
有几个业务相关的配置信息需要管理后台灵活配置,且返回的数据要进行排序 为了保证业务接口的请求速度,我们把这些配置信息接口做了缓存 在管理后台进行form表单提交的时候清空缓存,保证数据及时更新(比如删除、修改之后要刷新缓存) 测试阶段发现一个问题,laravel-admin 的 sortable 扩展和框架本身的form表单提交没有关系,执行排序的时候没有回调函数,导致排序操作后无法主动清除缓存。
358 0
Laravel-admin 重写源码 自定义排序回调
|
PHP
【PHP报错集锦】继承抽象类时的报错
【PHP报错集锦】继承抽象类时的报错
133 0
【PHP报错集锦】继承抽象类时的报错
ES6—04:使用类时注意事项
ES6—04:使用类时注意事项
124 0
ES6—04:使用类时注意事项