Magento覆盖了核心文件

时间:2014-08-01 12:25:54

标签: php magento

我在覆盖核心文件时遇到问题。 基本路径是 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>

../公司名称/模块名的/ 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>

../ CompanyName / ModuleName / Block / Product / List.php

class CompanyName_ModuleName_Block_Product_List extends Mage_Catalog_Block_Product_List
{
    public function _getProductCollection()
    {
      (...)
    }
}

我不知道为什么它不起作用。我看不出错误。

1 个答案:

答案 0 :(得分:2)

你的案子中有一个拼写错误。在CompanyName_ModuleName.xml中,它应该是

<codePool>local</codePool>

请注意P中的驼峰字母codePool。由于这个错字,magento很可能没有激活你的模块。这就是为什么通过你的模块没有任何事情发生

另外,对于重写块,您不需要定义块部分。这在config.xml节点

下的global就足够了
     <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来引用您的块。指定此参考节点的规则是&#34;它应该是唯一的&#34;。按照惯例,模块名称是 用于此。因此,惯例说,在这种情况下,您必须使用modulename作为块引用。但是有一段时间,如果我们仅使用模块名称作为参考,则有机会与其他自定义扩展冲突。所以为了确保这一点是唯一的,我强烈推荐namespace_modulename格式。请注意,我使用了小写字母。在你的情况下你也使用了Camel字母。这不是一个好习惯。

但上述情况与您的情况无关。由于您的模块本身不包含模块的任何块,而只包含重写块。所以上面提到的部分代码对你来说并不是必需的。这是因为,在重写部分,我们明确地告诉magento它应该在哪里寻找重写块。在您的情况下,您将其指定为CompanyName_ModuleName_Block_Product_List

希望有意义。