Подтвердить что ты не робот

Как переопределить функцию Magento в приложении/коде/ядре/Mage/Core/functions.php

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

Приложение/код/​​ядро ​​/Mage/Ядро/functions.php

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

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

4b9b3361

Ответ 1

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

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

и изменить его там, где хотите?

Ответ 2

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

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

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

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

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

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

  • Сохранение нашего кода вместе с "модулем" становится более сложным, так как копирование в основном файле означает, что мы фактически заблокировали его, чтобы "гарантировать" выполнение на версии программного обеспечения, которое мы скопировали оригинальный код из. Это также означает, что повторное использование этой работы намного сложнее.

  • Определить, почему код был изменен намного сложнее, поскольку он находится за пределами нашего пространства имен, то есть вся разработка, связанная с "Example_Module", находится в пространстве имен:

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

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

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

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

Ответ 3

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

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

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

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

  • Создайте пользовательскую папку с именем/модулем с папкой и т.д..
  • Зарегистрируйте модуль в папке app/etc, создав Namespace_Module.xml
  • настройте 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>
    
  • создайте папку Model в Namespace_Module и файл Php Category.php

  • Теперь основное отличие здесь заключается в том, что мы расширяем основной класс 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 переопределяется, поэтому он будет вызываться вместо метода, определенного в классе базовой модели.

Также важно следующее:

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

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

Ответ 4

1. UOPZ

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

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

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

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

2. Composer post-install-cmd

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

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

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

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

3. Уродливое решение (уродливое, чем указано выше)

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

if(!function_exists("foo"){ 
  function foo() {...}
}
  • держитесь за кресло и
  • eval этот SOB;)