Magento覆盖核心文件


Magento overriding the core files

我有一个覆盖核心文件的问题。基本路径为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代码池中。

总是尽量避免Namespacemodulename中不需要的驼峰字母。这其实并没有错。但是您可以使用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