重写Magento块,模型,助手和控制器
没有一个项目是使用原有的框架,都是时不时地要修改些东西。增加新的东西或者重写已经写好的东西。由于很多原因,修改核心文件是一个坏习惯,不被推荐。因此,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模型,但是资源文件和集合文件呢?和核心模型文件一样,资源和集合文件的重写和其它文件一样。文件将扩展:
- Mage_Tag_Model_Tag
- Mage_Tag_Model_Resource_Tag
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>
接着,创建下面这些文件:
- app/code/local/Alwayly/Tag/Model/Tag.php
- app/code/local/Alwayly/Tag/Model/Resource/Tag.php
- app/code/local/Alwayly/Tag/Model/Resource/Tag/Collection.php.
注意:这里只是个示例,在你的项目里只重写你需要的类。
重写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
}
电商网站开发服务。