如何在app/code/core/Mage/Core/functions.php中覆盖Magento函数

Ada*_*oss 13 module function magento

我需要覆盖此文件中的函数:

应用程序/代码/核心/法师/核心/ functions.php的

问题是,这是核心,没有与之关联的类,可能是因为Core甚至不是一个模块.有没有人知道如何在没有类的情况下覆盖文件中的函数?

任何帮助,将不胜感激.

twe*_*mag 16

由于以下原因,不应使用将文件复制到app/code/local /Mage/Core/functions.php:

  1. 必须复制整个文件,这样我们才能更难识别所做的更改.

  2. 未来的升级可能会引入新功能,除非记住复制该文件的新版本并再次实施更改,否则这些功能将无法使用.

  3. 未来的升级可以解决我们将错过的核心错误,除非记住复制该文件的新版本并再次实施更改.

  4. 关于第2点和第3点,每次升级都可能改变工作方式,这意味着重新审视我们需要做出的改变.在某些情况下,对于覆盖方法也是如此,但至少我们可以很容易地确定这些变化对我们的影响.

  5. 如果另一个人想要使用相同的技术,你会怎么做?能够识别什么是核心代码以及什么是我们的代码变得越来越复杂.

  6. 将代码保存为"模块"变得更加困难,因为通过复制核心文件意味着我们已经有效地将其锁定为"保证"在我们复制原始代码的软件版本上运行.这也意味着重复使用这项工作要困难得多.

  7. 确定代码更改的原因,因为它超出了我们的命名空间,即与"Example_Module"相关的所有开发都在命​​名空间中:

/应用程序/代码/核心/本地/实施例/模块

而复制到app/code/core/local/Mage的代码仅表示我们已进行了更改以支持未知功能等.

此外,Magento偶尔会发布补丁来修复错误 - 这些补丁只会修补内核中的文件,而不会发送补丁文件.

我建议的是你编写自己的函数来做你想做的事情并覆盖函数来调用你的新函数.

  • 你建议他写自己的功能,但你不告诉他怎么做,这就是我认为他的问题. (13认同)
  • 我意识到这是一个老帖子,但如果"tweakmag"或任何其他人关心继续答案,我相信它会帮助人们(包括我自己).Tweakmag提供了很多很好的理由不将核心代码复制到本地然后修改,但是你没有真正回答如何做替代方案? (3认同)

use*_*772 8

也许我没有理解你的问题,但为什么不把这个文件复制到

app/code/**local**/Mage/Core/functions.php
Run Code Online (Sandbox Code Playgroud)

并以任何你想要的方式修改它?


Aja*_*sht 6

正如@tweakmag所提到的,创建文件夹结构和复制整个模型或控制器以实现单个函数覆盖的缺点,最重要的是,

"未来的升级可能会引入一些新功能,除非记住复制该文件的新版本并再次实施更改,否则这些功能将无法使用."

因此,解决方案可以是扩展核心类(模型或控制器)并只编写要覆盖的方法,而不是复制所有方法.

例如,如果你想说,在Mage_Catalog_Model_Category中覆盖方法getProductCollection,这里将是以下步骤:

  1. 在其中创建一个带有etc文件夹的自定义命名空间/模块文件夹
  2. 通过创建Namespace_Module.xmlapp/etc文件夹中注册模块
  3. Namespace/Module/etc /中设置config.xml:

    <?xml version="1.0"?>
      <config>
         <modules>
           <Namespace_Module>
             <version>1.0</version>
           </Namespace_Module>
          </modules>
          <global>
           <models>
            <catalog>
             <rewrite>
               <category>Namespace_Module_Model_Category</category>
             </rewrite>
            </catalog>
          </models>
         </global>
      </config>
    
    Run Code Online (Sandbox Code Playgroud)
  4. Namespace_Module中创建Model文件夹和Php文件Category.php

  5. 现在主要区别在于我们扩展了Magento的核心类而不是编写所有方法

    <?php
     /**
      * Catalog category model
     */
      class Namespace_Module_Model_Category extends Mage_Catalog_Model_Category
       {
       public function getProductCollection()
        {
         // Include your custom code here!
         $collection = Mage::getResourceModel('catalog/product_collection')
         ->setStoreId($this->getStoreId())
         ->addCategoryFilter($this);
         return $collection;
       }
     }
Run Code Online (Sandbox Code Playgroud)

重写getProductCollection方法,因此将调用它而不是核心模型类中定义的方法.

另外一点很重要:

覆盖模型中的任何方法时,应确保该方法的返回值的数据类型与基类方法的数据类型匹配.由于模型方法是从几个核心模块调用的,我们应该确保它不会破坏其他功能!

链接提供了一步一步的方法