Magento扩展覆盖资源文件

时间:2011-09-27 03:29:37

标签: magento resources

创建Magento扩展时如何覆盖如下所示的资源文件:

core/Mage/Catalog/Model/Resource/Product/Indexer/Price/Default.php

我知道您可以将此文件复制到本地路径并以这种方式覆盖它,但我正在尝试弄清楚如何覆盖/扩展它以用于扩展。具体来说,config.xml语法需要什么样?我想知道这是否可能,因为我在网上看到的是如何覆盖像这样的模型文件:

core/Mage/Catalog/Model/Product.php

您可以使用以下方法:

<models>
  <catalog>
    <rewrite>
      <product>My_Module_Catalog_Model_Product</product>
    </rewrite>
  </catalog>
<models>

或Eav / Mysql4目录中的此类资源文件:

core/Mage/Catalog/Model/Resource/Eav/Mysql4/Product.php

我认为你可以这样做:

<models>
  <catalog_resource_eav_mysql4>
    <rewrite>
       <product>My_Module_Catalog_Model_Resource_Eav_Mysql4_Product</attribute></product>
  </catalog_resource_eav_mysql4>
</models>

但是我没有看到如何处理Eav目录中的资源文件。有可能吗?

3 个答案:

答案 0 :(得分:10)

根据Zyava链接的已接受答案的评论,您可以查看原始模块的config.xml文件以查看定义的模型。一旦你知道,覆盖它们的语法是相同的。

目录模块为资源定义了此模型:

<global>
    <models>
        ....
        <catalog_resource>
            <class>Mage_Catalog_Model_Resource</class>
            ...
        </catalog_resource>
    </models>
</global>

(注意:没有Mage_Catalog_Model_Resource类,但这没关系,因为Magento将使用它作为调用所有相关模型的基础。)

现在我们知道我们应该使用catalog_resource作为重写的XML容器,我们知道我们应该使用Model的类名中“resource”之后的文本来构造引用特定的XML容器我们想要覆盖的模型。

core/Mage/Catalog/Model/Resource/Product/Indexer/Price/Default.php
xxxxxxxxxx----------------------|-----------------------------xxxx
                              split

Catalog/Model/Resource        -> catalog_resource
Product/Indexer/Price/Default -> product_indexer_price_default    

这是它在自定义模块的config.xml文件中的外观:

<global>
    <models>
        <catalog_resource>
            <rewrite>
                <product_indexer_price_default>CompanyName_ModuleName_Model_Catalog_Resource_Product_Indexer_Price_Default</product_indexer_price_default>
            <rewrite>
        </catalog_resource>
    </models>
</global>

您覆盖的类名究竟取决于您的Module的配置。我使用的样本(CompanyName_ModuleName_Model_Catalog_Resource_Product_Indexer_Price_Default)是适合我通常使用的文件结构的样本。你的看起来可能是这样的:

My_Module_Catalog_Model_Resource_Product_Indexer_Price_Default

答案 1 :(得分:2)

我现在对Magento类重写系统的理解是,当我提出这个问题时我不明白,我想要在扩展中覆盖的这个特殊类是不可以重写的。有问题的类实际上更像是一个类似抽象的类,它从不直接实例化,而是由其他类进行子类化,而这些类又是重写的候选者。因此,实现我想要的正确方法是选择适当的具体子类并以正常方式重写它,例如在这里通过losttime的答案概述。

你如何确定一个班级是否是重写的候选人?一种方法是在确定类的分组类名或URI(即catalog/product_index_price)之后,在Magento源中搜索它,看看它是否在任何地方用于实际实例化类。

答案 2 :(得分:0)

正如您所看到的,这也是core/Mage/Catalog/Model/目录下的模型文件,因此在config.xml(重写然后扩展)中扩展它看起来与任何其他模型一样。

如果你不完全覆盖它,那么只需复制到

local/Mage/Catalog/Model/Resource/Product/Indexer/Price/Default.php