我有一个覆盖核心文件的问题。基本路径为app/code/core/Mage/Catalog/Block/Product/List.php
模块结构:
CompanyName/
ModuleName/
Block/
Product/
List.php
etc/
config.xml
我的文件:应用程序/etc/模块/CompanyName_ModuleName.xml
<config>
<modules>
<CompanyName_ModuleName>
<active>true</active>
<codepool>local</codepool>
</CompanyName_ModuleName>
</modules>
</config>
. ./公司名称/ModuleName/etc/config . xml
<config>
<modules>
<CompanyName_ModuleName>
<version>1.0</version>
</CompanyName_ModuleName>
</modules>
<global>
<blocks>
<CompanyName_ModuleName>
<class>CompanyName_ModuleName_Block</class>
</CompanyName_ModuleName>
<catalog>
<rewrite>
<product_list>CompanyName_ModuleName_Block_Product_List</product_list>
</rewrite>
</catalog>
</blocks>
</global>
</config>
和 . ./公司名称/ModuleName/块/产品/list .
class CompanyName_ModuleName_Block_Product_List extends Mage_Catalog_Block_Product_List
{
public function _getProductCollection()
{
(...)
}
}
我不知道为什么它不工作。我看不出有什么错误。
您的案例中有一个错别字。在你的CompanyName_ModuleName.xml
中,它应该是
<codePool>local</codePool>
注意codePool
中的驼鹿字母P
。由于这个错字,magento很可能没有激活你的模块。这就是为什么在你的模块
同样在重写块时,你不需要定义块section。这在global
节点下的config.xml
就足够了
<blocks>
<catalog>
<rewrite>
<product_list>CompanyName_ModuleName_Block_Product_List</product_list>
</rewrite>
</catalog>
</blocks>
请注意您的模块应该驻留在local
代码池中。
总是尽量避免Namespace
和modulename
中不需要的驼峰字母。这其实并没有错。但是您可以使用Companyname_Modulename
而不是CompanyName_ModuleName
。这会帮助你避免不必要的错别字。
这是我个人的一个小小的建议
尽管您不需要config.xml中的以下部分,但我想在这里提到一件事。如果你的模块内部有自己的块,除了重写块,你应该在config.xml
中有这段代码<global>
<companyname_modulename> <!-- unique identifier; block reference -->
<class>CompanyName_ModuleName_Block</class>
<companyname_modulename>
....
</global>
稍后,您将使用唯一标识符companyname_modulename
引用您的块。指定此参考节点的规则是"它应该是唯一的"。按照约定,模块名称为用于这个。所以在这种情况下,惯例说,你必须使用modulename
作为块引用。但有时,如果我们只使用模块名作为引用,则有可能与其他自定义扩展发生冲突。因此,为了确保这一个是唯一的,我强烈推荐namespace_modulename
格式。注意,我用的是小写字母。在你的例子中,你也用了骆驼字母。这不是一个好的做法。
但是上面的事情与你的情况无关。因为你的模块不包含模块本身的任何块,而只是一个重写块。所以上面提到的部分代码对你来说是不必要的。这是因为,在重写部分,我们显式地告诉magento应该在哪里寻找重写块。在您的例子中,您指定它为CompanyName_ModuleName_Block_Product_List
。