Как решить проблему конфликтующих модификаций OCMod в Opencart?
К сожалению, в силу того как реализована система модификации Opencart, а именно подсистема OCMod, многие пользователи сталкиваются с проблемой конфликтующих модулей. В этой статье рассмотрим способ решения проблемы с помощью модуля OCMOD Execution Order 3x.
OCMod по своей сути — довольно простой инструмент. Изучить его намного проще, чем, например систему хуков из CS:Cart.
При этом, начинающий разработчик может крайне легко сломать систему неаккуратным модификатором
Почему вообще возникают конфликты модификаторов? 🧐
Когда мы жмём кнопку "Обновить модификации", Opencart проходит по всем зарегистрированным активным модам, изменяет свои исходные файлы согласно правилам, заданным в 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 — заходим в раздел "Расширения" -> "Установка расширений", кликаем по кнопке "Загрузить" и выбираем наш файл ocmod-order-3x.ocmod.zip.
После того как модуль будет установлен, нужно перейти в раздел "Расширения" -> "Модификаторы" и два раза обновить кэш модификаторов.
Если всё сделано правильно — мы увидим в таблице модификаторов новую колонку "Порядок":
Теперь самое сложное. Нужно подобрать порядок применения модификаторов чтобы исключить конфликты. Тут уже лог модификаторов в помощь: находим в логе первую строку с ошибкой, смотрим какой модификатор был применён на том же файле до него, увеличиваем значение в колонке "Порядок" у модификатора.
К сожалению, лог модификаторов не всегда может помочь в поиске проблемного модуля и тогда всё сводится к перебору.
Иногда могут встречаться ситуации, когда есть два и более проблемных модификаторов изменяющих точки зацепа в одном и том же файле и в таком случае даже изменение порядка применения модификаций может уже не помочь — останется лезть в исходники install.xml или ocmod.xml у проблемных модулей и действовать по обстоятельствам.
Нет серебряной пули ¯\_(ツ)_/¯
Во многих случаях изменение порядка применения модификаторов может сработать, но это не 100% решение всех проблем.
Иногда может понадобиться доработка самих модификаторов! 🤕