Как переопределить функцию Magento в app / code / core / Mage / Core / functions.php - PullRequest
13 голосов
/ 12 мая 2011

Мне нужно переопределить функцию в этом файле:

app / code / core / Mage / Core / functions.php

Проблема в том, что это настолько ядро, что нет классасвязано с этим, вероятно, потому что Core даже не модуль.Кто-нибудь знает, как переопределить функцию в файле без класса?

Любая помощь будет оценена.

Ответы [ 4 ]

16 голосов
/ 13 мая 2011

Копирование файла в app / code / local / Mage / Core / functions.php не должно использоваться по следующим причинам:

  1. Необходимо скопировать весь файл, чтобы нам было сложнее определить, какие изменения были внесены.

  2. В будущих обновлениях могут появиться новые функции, которые будут недоступны, если не будет запомнено копирование в новую версию этого файла и повторное внесение изменений.

  3. В будущих обновлениях могут быть исправлены ошибки с ядром, которые мы бы пропустили, если только не вспомнили, что скопировали новую версию этого файла и снова внедрили изменения.

  4. Что касается пунктов 2 и 3, каждое обновление может изменить способ работы, что означает пересмотр изменений, которые нам необходимо внести. В некоторых случаях это будет справедливо и для переопределенных методов, но, по крайней мере, мы можем легко определить, где эти изменения влияют на нас.

  5. Что вы делаете, если другой человек хочет использовать ту же технику? Возможность определить, что является основным кодом, а что нашим, становится все более и более сложной.

  6. Хранить наш код в виде «модуля» становится все труднее, поскольку копирование в файл ядра означает, что мы фактически заблокировали его, чтобы он «гарантированно работал» на той версии программного обеспечения, которую мы скопировали. оригинальный код от. Это также означает, что повторное использование этой работы намного сложнее.

  7. Идентификация того, почему код был изменен, намного сложнее, поскольку он находится за пределами нашего пространства имен, т.е. вся разработка, связанная с «Example_Module», находится в пространстве имен:

/ приложение / код / ​​ядро ​​/ локальный / Пример / Модуль

тогда как код, скопированный в app / code / core / local / Mage, указывает только на то, что мы внесли изменения для поддержки неизвестной функции и т. Д.

Также Magento иногда выпускает патчи, которые исправляют ошибки - они будут только патчить файлы внутри ядра, оставляя скопированный файл без патча.

Вместо этого я бы сказал, что вы пишете свою собственную функцию, которая делает то, что вы хотите, и переопределяете функцию для вызова новой функции.

8 голосов
/ 12 мая 2011

Может быть, я не правильно понял ваш вопрос, но почему бы просто не скопировать этот файл в

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

и изменить его там любым удобным для вас способом?

6 голосов
/ 26 июня 2016

Как упомянул @tweakmag, недостатки создания структуры папок и копирования всей модели или контроллера для переопределения одной функции, наиболее важным из которых является

"В будущих обновлениях могут появиться новые функции, которые могутне будет доступен, если не будет запомнено копирование в новую версию этого файла и повторное внесение изменений. "

Таким образом, может быть решение, расширить базовый класс (Модель или контроллер) и просто напишите метод, который вы хотите переопределить, вместо копирования всех методов.

Например, если вы хотите сказать, переопределите метод getProductCollection в Mage_Catalog_Model_Category , здесь будут шаги:

  1. СоздатьПользовательская папка Пространство имен / Модуль с папкой и т. д. в ней
  2. Зарегистрируйте модуль в папке app / etc , создав Namespace_Module.xml
  3. настройка config.xml в Пространство имен / Модуль / etc / :

    <?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>
    
  4. create Model папка в Namespace_Module и файл 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;
       }
     }

Метод getProductCollection переопределяется, поэтому он будет вызываться вместо метода, определенного в классе базовой модели.

Также важным моментом является:

Когда вы переопределяете любые методы в моделях, вы должны убедиться, чтотип данных возвращаемого значения этого метода совпадает с типом данных метода базового класса.Поскольку методы модели вызываются из нескольких основных модулей, мы должны убедиться, что они не нарушают другие функции!

Эта ссылка дает пошаговый подход к ней

1 голос
/ 16 декабря 2015

1. UOPZ

Есть способ сделать это без необходимости копировать и поддерживать файл functions.php из ядра, но он включает расширение uopz (pecl install uopz), тогда вы можете переименовать функцию magento (например, с foo до foo_uopzOLD). ) и определите свое собственное (https://secure.php.net/uopz)

Это работает и очень полезно для magento - обычно вы сталкиваетесь с чем-то, что не можете изменить. Uopz очень помогает в таких случаях.

профи: работает;), вам не нужно повторять его каждый раз, когда вы обновляете Magento (если вы все делаете правильно, потому что внутри вы все равно можете вызвать foo_uopzOLD, чтобы вы могли обеспечить некоторую обратную совместимость ... в некоторых случаях ).

минусы: это немного неявно

2. Композитор post-install-cmd

Если вам не нравится вышеперечисленное, но вы используете composer, вы можете исправить любой файл, который вы хотите:

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

плюсы: явные (когда сбой патча - установка композитора не удалась), а так как он явный - вы можете пересматривать и исправлять патч каждый раз при обновлении magento

cons: вы изменили основной файл, поэтому, возможно, вы захотите добавить его в .gitignore

3. Уродливое решение (более страшное, чем приведенное выше)

Если ничего из вышеперечисленного невозможно для вас (на самом деле, попробуйте с помощью composer - нет оправдания тому, что вы его не используете). Но когда ты действительно не можешь единственным способом, я могу думать о - создать приложение / local / Mage / Core / functions.php - определите эту функцию, которая вам нужна - загрузить оригинал /app/core/Mage/Core/functions.php - окружать каждый function foo() {...} с

if(!function_exists("foo"){ 
  function foo() {...}
}
  • держись за стул и
  • eval это SOB;)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...