Pull to refresh

Не переписывайте классы в Magento

Reading time2 min
Views5.1K
Уже порядка двух лет я плотно работаю системой Magento. За это время довелось работать с чужими модулями и проектами и я понял, что в нашей компании код на хорошем уровне. Наверно, потому что мы узко специализируемся на Magento.

Так вот, часто приходится наблюдать ошибки и проблемы совместимости в чужих модулях. О конкретной проблеме большинства модулей и пойдет речь в этой статье.

Если вы новичок в Magento и хотите как-то изменить или расширить ее базовую функциональность, то на просторах интернета вам, наиболее вероятно, посоветуют:
1. внести изменения прямо в core файлы;
2. скопировать файл класса со структурой папок из app/code/core в app/code/local и внести изменения в локальную копию;
3. переписать класс через XML конфигурацию в своем модуле.

Первый вариант не стоит рассматривать вообще. Второй – в редких случаях, если вам очень нужно переписать какой-то абстрактный класс или класс библиотеки. Третий – если вы переписываете класс модели, блока, хелпера или контроллера.

Я предлагаю четвертый вариант:
4. Не переписывайте классы в Magento!


Почему четвертый вариант? Первые два варианта плохи, потому что не совместимы с обновлением ядра. А это весомая проблема, так как Magento развивается быстро и версии выходят стабильно часто. Вариант с переписыванием через XML конфигурацию позволяет унаследовать переписываемый класс, поэтому не так привязан к версии ядра. Но есть и существенный недостаток такого подхода — если тот же класс переписывает другой модуль, то использоваться будет только одна версия, ваша либо чужая. Приоритет алфавитный и будет зависеть от названия вашего модуля. То есть, если ваш модуль называется Abc_ModuleOne, а чужой — Zyx_ModuleTwo, то, увы, ваш rewrite использоваться не будет. И даже если вы назовете свой модуль Zzzzzz_Zzz, проблема не уйдет — после установки вашего модуля у кого-нибудь что-нибудь сломается и владельцы магазинов обвинят в конечном счете вас.

Альтернатива — использование наблюдателей событий (event observer), благо событий в Magento предусмотрено достаточно много. Не поленитесь, поищите в ядре событие, которое вам было бы удобно использовать. Если такое событие не нашлось, попробуйте использовать наиболее близкое по ходу выполнения программы. Во многих случаях задачу можно решить с помощью обработчиков событий. То, как использовать наблюдатели в Magento, можно легко найти в интернете, но могу подготовить статью и здесь, если будет интересно.

Для некоторых задач существуют и специфические методы решения. Например, если вам каким-то образом нужно изменить метод подсчета итоговой суммы заказа или какой-либо составляющей этой суммы. Все это в Magento называется totals. В базовой поставке существуют subtotal, shipping, tax, discount, grandtotal, которые выполняются в определенном порядке. Но вы легко можете добавить свой обработчик в любом месте totals-цепочки через XML. Также легко добавляются платежные методы и методы доставки. Если изъявите желание в комментариях, могу осветить эти темы более подробно.
Tags:
Hubs:
Total votes 29: ↑21 and ↓8+13
Comments18

Articles