西部数码主机 | 阿里云主机| 虚拟主机 | 服务器 | 返回乐道官网
当前位置: 主页 > php教程 > magento教程 >

重写Magento块,模型,助手和控制器

时间:2017-01-30 09:43来源:未知 作者:好模板 点击:
没有一个项目是使用原有的框架,都是时不时地要修改些东西。增加新的东西或者重写已经写好的东西。由于很多原因,修改核心文件是一个坏习惯,不被推荐。因此,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
}
(责任编辑:好模板)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
热点内容