创建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目录中不的资源文件。有可能吗?
答案 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