S.Tominoff

Frontend / Backend developer

Как решить проблему конфликтующих модификаций OCMod в Opencart?

К сожалению, в силу того как реализована система модификации Opencart, а именно подсистема OCMod, многие пользователи сталкиваются с проблемой конфликтующих модулей. В этой статье рассмотрим способ решения проблемы с помощью модуля OCMOD Execution Order 3x.

OCMod по своей сути — довольно простой инструмент. Изучить его намного проще, чем, например систему хуков из CS:Cart.

При этом, начинающий разработчик может крайне легко сломать систему неаккуратным модификатором

 

 

Почему вообще возникают конфликты модификаторов? 🧐

 

Когда мы жмём кнопку "Обновить модификации", Opencart проходит по всем зарегистрированным активным модам, изменяет свои исходные файлы согласно правилам, заданным в ocmod скриптах и складывает новые версии исходников в папку "кэша".

 

Вот наглядная схема этого конвейера:

Схема конвейера OCMod

 

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

 

Конфликты при применении OCMod могут возникать, например, в случае, когда один из модификаторов мутирует код, т.е. берёт то что было и заменяет своей версией.

 

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

 

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

 

Пример ошибки применения модификаторов

 

В примере выше, мы видим статус операции NOT FOUND -- OPERATIONS ABORTED. Это означает, что модификация не была применена, поскольку в файле (FILE) не найдена точка зацепа (CODE).

 

Не паникуйте раньше времени 😱

Такие ошибки не всегда сигнализируют о несовместимости модификаторов. Зачастую модификаторы могут использоваться для изменения шаблонов темы оформления или интеграции с другими модулями. Если такие модули/темы не используются, то в логах могут появляться подобные ошибки - все зависит от того, как написан модификатор. 🤯

 

 

Как с этим бороться? 🤕

 

Часто, проблему можно решить с помощью изменения порядка применения модификаторов. Т.е. отложить выполнение проблемных модификаторов напоследок.

 

К сожалению, несмотря на то что проблема известная, в Opencart до сих пор нет штатного средства для управления порядком применения модификаторов.

 

Однако существует бесплатный пользовательский модуль, который позволяет внедрить такой функционал в Opencart — OCMOD Execution Order 3x за авторством AlexDW.

 

OCMOD Execution Order 3x

 

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

 

Существуют версии как для Opencart 3, так и для более раннего Opencart 2.

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

 

Мы сосредоточимся на свежем Opencart 3.

Во–первых, скачиваем с OpencartForum архив с модулем. Внутри запакованы версии под обе версии движка:

 

Состав архива. Для Opencart 3 берём файл ocmod-order-3x.ocmod.zip

 

Так как этот модуль желательно устанавливать в чистый движок — желательно отключить все модификаторы и обновить кэш модификаторов. 

 

 

Как только это сделано, можно приступить к установке модуля. Установка производится штатными средствами Opencart — заходим в раздел "Расширения" -> "Установка расширений", кликаем по кнопке "Загрузить" и выбираем наш файл ocmod-order-3x.ocmod.zip.

 

После того как модуль будет установлен, нужно перейти в раздел "Расширения" -> "Модификаторы" и два раза обновить кэш модификаторов.

 

Если всё сделано правильно — мы увидим в таблице модификаторов новую колонку "Порядок":

 

 

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

К сожалению, лог модификаторов не всегда может помочь в поиске проблемного модуля и тогда всё сводится к перебору.

 

Иногда могут встречаться ситуации, когда есть два и более проблемных модификаторов изменяющих точки зацепа в одном и том же файле и в таком случае даже изменение порядка применения модификаций может уже не помочь — останется лезть в исходники install.xml или ocmod.xml у проблемных модулей и действовать по обстоятельствам.

 

Нет серебряной пули ¯\_(ツ)_/¯

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

Иногда может понадобиться доработка самих модификаторов! 🤕