Magento扩展覆盖资源文件



如何在创建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目录中不是的资源文件。这可能吗?

从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容器,并且我们知道我们应该使用模型类名中"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>

用什么类名重写取决于你的模块的配置。我使用的示例(CompanyName_ModuleName_Model_Catalog_Resource_Product_Indexer_Price_Default)适合我通常使用的文件结构。你的可能是这样的:

My_Module_Catalog_Model_Resource_Product_Indexer_Price_Default

我现在对Magento类重写系统的理解是,当我提出这个问题时,我不理解的是,我想在扩展中重写的这个特定类是不可重写的。所讨论的类实际上更像是一个抽象类,它从来没有被直接实例化,而是被其他类子类化,而这些类又可以被重写。因此,实现我想要的正确方法是选择适当的具体子类,并以正常的方式重写它,如此处losttime的答案所概述的那样。

如何确定一个类是否适合重写?一种方法是在确定类的分组类名或URI(即catalog/product_index_price)之后,在Magento源代码中搜索它,并查看是否在任何地方使用它来实际实例化类。

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

如果你不想完全覆盖它,那就复制到

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

最新更新