如何在创建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