没有一个项目是使用原有的框架,都是时不时地要修改些东西。增加新的东西或者重写已经写好的东西。由于很多原因,修改核心文件是一个坏习惯,不被推荐。因此,Magento带来一种很好的方式来重写/覆盖这些文件。 我们已经写过如何重写Magento模型类,但需要修改助手,块和控制器,不论是前端还是后台。 重写Magento块让我们以重写核心标签块开始。假设要对Mage_Tag_Block_Product_List类做些改变。我们要做的是在这个类的基础上添加我们自己的文件来扩展它。所有要做的就是添加下面的代码到当前模块的config.xml文件中。 <config> <global> <blocks> <tag> <rewrite> <product_list>Alwayly_Tag_Block_Product_List</product_list> </rewrite> </tag> </blocks> </global> </config> 由类名可以得出,文件要被创建在app/code/local/Alwayly/Tag/Block/Product/List.php,其中要定义类: class Alwayly_Tag_Block_Product_List extends Mage_Tag_Block_Product_List { // some code } 等效于上面的例子,同样的规则可以应用在aminhtml中,当我们想要重写Mage_Adminhtml_Block_Tag_Edit类时。 <config> <global> <blocks> <adminhtml> <rewrite> <tag_edit>Alwayly_Tag_Block_Adminhtml_Tag_Edit</tag_edit> </rewrite> </adminhtml> </blocks> </global> </config> 那么需要创建app/code/local/Alwayly/Tag/Block/Adminhtml/Tag/Edit.php,在文件中写下类的代码: class Alwayly_Tag_Block_Adminhtml_Tag_Edit extends Mage_Adminhtml_Block_Tag_Edit { // some code } 重写Magento助手按照同样的规则,Magento助手也可以轻松地被重写。config.xml中的代码: <config> <global> <helpers> <tag> <rewrite> <data>Alwayly_Tag_Helper_Data</data> </rewrite> </tag> </helpers> </global> </config> 创建app/code/local/Alwayly/Tag/Helper/Data.php文件并定义类: class Alwayly_Tag_Helper_Data extends Mage_Tag_Helper_Data { // some code } 重写Magento模型我们已经重写过Magento模型,但是资源文件和集合文件呢?和核心模型文件一样,资源和集合文件的重写和其它文件一样。文件将扩展:
Config.xml代码: <config> <global> <models> <tag> <rewrite> <!-- Model --> <tag>Alwayly_Tag_Model_Tag</tag> </rewrite> </tag> <tag_resource> <rewrite> <!-- Resource --> <tag>Alwayly_Tag_Model_Resource_Tag</tag> <!-- Collection --> <tag_collection>Alwayly_Tag_Model_Resource_Tag_Collection</tag_collection> </rewrite> </tag_resource> </models> </global> </config> 接着,创建下面这些文件:
注意:这里只是个示例,在你的项目里只重写你需要的类。 重写Magento控制器重写控制器比上面的示例要难一点,和我们之前例子中看到的Magento重写规则不一样。那如何重写Mage_Tag控制器呢?让我们看看代码吧。在config.xml中: <config> <frontend> <routers> <tag> <args> <modules> <alwayly_tag before="Mage_Tag">Alwayly_Tag</alwayly_tag> </modules> </args> </tag> </routers> </frontend> </config> 在配置结点的孩子定义我们是否正在改变前端或者管理文件。我们定义的路由器结点将用它的参数重写核心标签模型。在底部结点出现当前模块前端的域名(alwayly_tag)和我们的模块名(Alwayly_Tag)。 你注意到,这里没有严格定义的文件。这样我们需要由控制器名定义这个路径下的文件。如果我们要重写app/code/core/Mage/Tag/controllers/TagController.php,那么具有相同名称的文件将被创建在app/code/local/Alwayly/Tag/controllers/TagController.php。 在新文件中定义类: require_once(Mage::getModuleDir('controllers','Mage_Tag').DS.'TagController.php'); class Alwayly_Tag_TagController extends Mage_Tag_TagController { // some code } 类似地,要修改后台控制器的话。Config.xml代码: <config> <admin> <routers> <adminhtml> <args> <modules> <alwayly_tag before="Mage_Adminhtml">Alwayly_Tag_Adminhtml</alwayly_tag> </modules> </args> </adminhtml> </routers> </admin> </config> 创建app/code/local/Alwayly/Tag/controllers/Adminhtml/TagController.php文件并定义类: require_once(Mage::getModuleDir('controllers','Mage_Adminhtml').DS.'TagController.php'); class Alwayly_Tag_Adminhtml_TagController extends Mage_Adminhtml_TagController { // some code }(责任编辑:好模板) |