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

时间:2011-05-12 12:42:01

标签: function magento module

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

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

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

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:16)

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

  1. 必须复制整个文件,以便我们更难识别所做的更改。

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

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

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

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

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

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

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

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

    Magento偶尔会发布补丁来修复错误 - 这些修补程序只修补核心内部的文件,而不会修补补丁文件。

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

答案 1 :(得分:8)

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

app/code/**local**/Mage/Core/functions.php

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

答案 2 :(得分:6)

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

  

“未来的升级可能会引入不会出现的新功能   除非记得在新版本中复制,否则可用   该文件并再次实施更改。“

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

例如,如果您想在 Mage_Catalog_Model_Category 中覆盖方法 getProductCollection ,则步骤如下:

  1. 使用 etc 文件夹创建自定义命名空间/模块文件夹
  2. 通过创建 Namespace_Module.xml
  3. app / etc 文件夹中注册模块
  4. 命名空间/模块/ 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>
    
  5. Namespace_Module 中创建模型文件夹,并在Php文件中创建 Category.php

  6. 现在主要区别在于我们扩展Magento的核心类而不是编写所有方法
  7.     <?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;
           }
         }
    

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

    同样重要的一点是:

      

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

    这个link逐步提供了它

答案 3 :(得分:1)

1。 UOPZ

有一种方法可以做到这一点,而无需从核心复制和维护functions.php文件,但它涉及扩展uopz(pecl install uopz),然后你可以重命名magento的功能(来自例如foofoo_uopzOLD并定义您自己的(https://secure.php.net/uopz

它适用于magento非常有用 - 通常你会碰到一些你无法改变的东西。 Uopz在这种情况下非常有帮助。

专业人士:工作;),每次更新Magento时都不必重做它(如果你做得对,因为在你内部仍然可以调用foo_uopzOLD,这样你可以保证一些向后兼容性。在某些情况下)。

缺点:它有点隐含

2。 Composer post-install-cmd

如果你不喜欢上述内容,但是你使用作曲家,你可以修补你想要的任何文件:

"scripts": {
    "post-install-cmd": "patch -p0 < change-core-functions.patch"
 }

专业:显式(当补丁失败时 - 编译器安装失败),并且因为它是明确的 - 您可以在每次升级magento时重新访问并修复补丁

缺点:您修改了核心文件,因此您可能希望将其添加到.gitignore

3。丑陋的解决方案(比上面那些更丑)

如果以上都不可能(真的,请尝试一下作曲家 - 没有理由不使用它)。但是当你真的无法想到我能想到的唯一方式时 - 创建app / local / Mage / Core / functions.php - 定义您需要的这一功能 - 加载原始/app/core/Mage/Core/functions.php - 使用

围绕每个function foo() {...}
if(!function_exists("foo"){ 
  function foo() {...}
}
  • 抓住你的椅子,
  • eval此SOB;)