在使用magento的过程中,几乎没有人会一成不变的使用magento框架所自带的功能,无论什么项目几乎都会有多多少少在功能上的变化需求,如添加一个新的功能,或者重写现有的功能模块。但是如果我们直接修改magento的核心代码结构,这是一个非常不好的习惯,而且我们也不推荐开发者这样来做。因此magento为大家提供了一系列非常好的方式方法来重写或者覆盖现有的方法。
我们在上一篇文章中已经提到了如何来重写一个model,但是如果我们有需求来重写helpers,blocks或者controllers(包括前台controller和后台controller),怎么办?下面我们来介绍一下如何来重写magento的blocks, models, helpers ,controllers。
1,重写magento blocks。 我们从重写magento核心block标签开始,例如重写Mage_Tag_Block_Product_List 类,我们想在这里添加我们自己的类,并且拓展当前的核心类目以及方法。首先我们要做的就是在当前新建的模块中的配置文件添加如下代码:
<config>
<global>
<blocks>
<tag>
<rewrite>
<product_list>Magease_Tag_Block_Product_List</product_list>
</rewrite>
</tag>
</blocks>
</global>
</config>
之后,在当前模块中新建block文件,app/code/community/Magease/Tag/Block/Product/List.php
class Magease_Tag_Block_Product_List extends Mage_Tag_Block_Product_List{
/**
/*
/* 代码
/*
/**
}
同理,我们可以用相同的规则来实现对Mage_Adminhtml_Block_Tag_Edit 类的重写。
<config>
<global>
<blocks>
<adminhtml>
<rewrite>
<tag_edit>Magease_Tag_Block_Adminhtml_Tag_Edit</tag_edit>
</rewrite>
</adminhtml>
</blocks>
</global>
</config>
按照如上配置文件中的类名,新建app/code/community/Magease/Tag/Block/Adminhtml/Tag/Edit.php文件,
class Magease_Tag_Block_Adminhtml_Tag_Edit extends Mage_Adminhtml_Block_Tag_Edit{
/**
/*
/* 代码
/*
/**
}
2.重写magento helpers 按照相同的规则我们来重写magento的helper类,模块配置代码如下:
<config>
<global>
<helpers>
<tag>
<rewrite>
<data>Magease_Tag_Helper_Data</data>
</rewrite>
</tag>
</helpers>
</global>
</config>
接下来我们新建helper类文件,app/code/community/Magease/Tag/Helper/Data.php
class Magease_Tag_Helper_Data extends Mage_Tag_Helper_Data{
/**
/*
/* 代码
/*
/**
}
3.重写magento models 我们在上一篇文章中讲到了如何来重写magento models,但是resource类和collection 类如何来从写呢?与重写model类同理,resource类和collection类也可以很容易的重写掉,我们来拓展以下三个类:
Mage_Tag_Model_Tag
Mage_Tag_Model_Resource_Tag
Mage_Tag_Model_Resource_Tag_Collection
配置文件写法如下:
<config>
<global>
<models>
<tag>
<rewrite>
<!-- Model -->
<tag>Magease_Tag_Model_Tag</tag>
</rewrite>
</tag>
<tag_resource>
<rewrite>
<!-- Resource -->
<tag>Magease_Tag_Model_Resource_Tag</tag>
<!-- Collection -->
<tag_collection>Magease_Tag_Model_Resource_Tag_Collection</tag_collection>
</rewrite>
</tag_resource>
</models>
</global>
</config>
下面到模块中新建如下文件:
app/code/community/Magease/Tag/Model/Tag.php
app/code/community/Magease/Tag/Model/Resource/Tag.php
app/code/community/Magease/Tag/Model/Resource/Tag/Collection.php.
需要注意的是,在这里我们重写这三个类,只是为了演示给开发者看,具体到现实环境中,还需要根据自身的项目需求来重写你需要的类即可。
4.重写magento controllers
重写magneto controller跟我们之前看的这些重写models,重写blocks,重写helpers都有很大得区别,那么如何来重写magneto的控制器呢,以Mage_Tag模块为例,下面我们来看一下如何重写magento controller,首先先看config.xml文件。
<config>
<frontend>
<routers>
<tag>
<args>
<modules>
<magease_tag before="Mage_Tag">Magease_Tag</magease_tag>
</modules>
</args>
</tag>
</routers>
</frontend>
</config>
你是否注意到了,我们在这里并没有定义一些文件,我们在这里只是定义了一个路径,这个路径可以通过名字来找到controllers的类文件。所以如果你想重写app/code/core/Mage/Tag/controllers/TagController.php这个控制器,我们应该在app/code/community/Magease/Tag/controllers/TagController.php下创建一个一模一样名字的控制器文件。 这里在文件中的写法也是跟其他文件的重写方法不一样,如:
require_once(Mage::getModuleDir('controllers','Mage_Tag').DS.'TagController.php');
class Magease_Tag_TagController extends Mage_Tag_TagController{
/**
/*
/* 代码
/*
/**
}
重写adminhtml的控制器也是同样的方法,在config.xml中按照如下格式:
<config>
<admin>
<routers>
<adminhtml>
<args>
<modules>
<magease_tag before="Mage_Adminhtml">Magease_Tag_Adminhtml</magease_tag>
</modules>
</args>
</adminhtml>
</routers>
</admin>
</config>
新建文件app/code/local/community/Magease/controllers/Adminhtml/TagController.php
require_once(Mage::getModuleDir('controllers','Mage_Adminhtml').DS.'TagController.php');
class Magease_Tag_Adminhtml_TagController extends Mage_Adminhtml_TagController{
/**
/*
/* 代码
/*
/**
}
到这里,magento的模块重写的内容方法基本已经全都在这里了,剩下的就是通过你自己的方法和技术,来写下你自己想要的模块功能或拓展吧。