Как предотвратить конфликт классов при переписывании модулей в Magento

9

У меня есть проблема переписывания классов в Magento Onepage Checkout, так как у меня есть пользовательский модуль в локальном пуле кода и стороннее расширение в пуле кода сообщества, оба расширяющие один и тот же класс ...

Я попытался добавить зависимый узел в файл ModuleA_Name.xml одного модуля, а затем расширить класс ModuleB в файле Onepage.php, но это не сработало.

Может ли кто-нибудь дать мне понять, как это сделать, я знаю, что есть другой способ сделать это с помощью Обозревателя, но мне действительно может понадобиться решение в данный момент? Кроме того, было бы опасно для меня использовать зависимость, так как ModuleB может быть включен только для разных хранилищ / представлений, что будет означать, что зависимый модуль больше не будет работать?

Заранее спасибо за помощь ...

ModuleA

<global>
  <rewrite>
      <moduleA>
          <from><![CDATA[#^/checkout/onepage/#]]></from>
          <to>/moduleA/onepage/</to>
      </moduleA>
      <moduleA>
          <from><![CDATA[#^/checkout/cart/add/#]]></from>
          <to>/moduleA/cart/add/</to>
      </moduleA>
  </rewrite>

ModuleB

<global>
    <models>
      <salesrep>
        <class>ModuleB_SalesRep_Model</class>
        <resourceModel>salesrep_mysql4</resourceModel>
      </salesrep>

      <salesrep_mysql4>
        <class>ModuleB_SalesRep_Model_Mysql4</class>
        <entities>
          <salesrep>
            <table>salesrep</table>
          </salesrep>
        </entities>
      </salesrep_mysql4>

      <checkout>
        <rewrite>
          <type_onepage>ModuleB_SalesRep_Model_Type_Onepage</type_onepage>
        </rewrite>
      </checkout>

      <modulebadminthemecontroller>
        <class>LucidPath_SalesRep_Controller</class>
      </modulebadminthemecontroller>
    </models>
</global>
user1704524
источник
1
Какой Onepageконкретно класс, блок или модель?
отметки

Ответы:

20

У вас есть 3 варианта разрешения конфликтов:

  • Объединить код из одного конфликтующего файла в другой и отключить перезаписать config.xml в одном
  • Отключите перезапись в одном config.xml, а затем разрешите конфликтующее расширение PHP-файл расширить другое расширение
  • Используйте <depends>возможность сделать одно расширение зависимым от другого. Затем они перепишут в таком порядке

Пример (вариант № 2)

class A_Extension_Model_Type_Onepage extends Mage_Checkout_Model_Type_Onepage

Вы бы изменили его на:

class A_Extension_Model_Type_Onepage extends B_Extension_Model_Type_Onepage

См. Https://stackoverflow.com/questions/14815717/multiple-modules-overriding-same-core-file-in-magento

Ренон Стюарт
источник
@benmarks Я добавил код из каждого файла config.xml
user1704524
Что ж, мне удалось решить проблему переписывания классов, расширив класс moduleA классом moduleB
user1704524
Поскольку я использую OPCheckout, и модуль появляется на новом шаге, но он не вызывается файлом opcheckout.js, по какой-то причине он пропускает шаг. Я посмотрел в консоли и вижу класс: section allowно он не становится активным ...
user1704524