S.Tominoff

Frontend / Backend developer

Как Opencart разработчику снизить риск возникновения конфликтов с OCMod модификатором? 😱

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

Я довольно много успел поработать с CMS Opencart. Разрабатывал модули под все ветки — начиная с версии 1.5 и вплоть до последних релизов третьей ветки.

 

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

 

 

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

 

1. Аккуратнее с точкой зацепа! ☠️


По моему опыту, большинство подобных проблем возникает из–за изменения точки зацепа (значение в теге search).

 

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

 

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

Это значительно облегчит поиск и дебаг возникших конфликтов у пользователей вашего модуля! 👍

 

Кроме того, может помочь приём с комментированием заменяемого кода, вместо его полной замены:

 

<!-- вместо -->
<operation>
  <search><![CDATA[$this->load->language('extension/module/mymodule');]]>
  <add position="replace"><![CDATA[$this->load->language('extension/module/anothermodule');]]>
</operation>

<!-- лучше так: -->
<operation>
  <search><![CDATA[$this->load->language('extension/module/mymodule');]]>
  <add position="replace"><![CDATA[
    // $this->load->language('extension/module/mymodule');
    $this->load->language('extension/module/anothermodule');
  ]]>
</operation>

 

 

 

2. Аккуратнее со звёздочками! 


Многие разработчики используют в атрибутах path звёздочки для применения модификаторов сразу к нескольким файлам.

 

Самый частый и оправданный кейс — модификация файлов в темах Opencart:

 

<file path="catalog/view/theme/*/template/extensions/modules/mymodule.twig">
  <!-- код модификатора -->
</file>

 

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

 

Если вам нужно применить модификатор к нескольким файлам в разных папках, то гораздо надёжнее использовать перечисление путей, либо glob паттерны:

 

<!-- пример перечисления -->
<file path="catalog/controller/catalog/product.php|catalog/controller/catalog/category.php">

<!-- пример glob паттерна -->
<file path="catalog/controller/catalog/{product,category}.php">

 

 

3. Используйте весь функционал OCMOD! 👻


Хоть OCMod это и упрощённая версия VQMod, он всё же позволяет делать многие полезные вещи!

 

Возьмём к примеру тег ignoreif. Я его практически никогда не встречал, однако он тоже может оказаться полезен.

 

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

 

<operation>
  <search><[CDATA[$this->language->load('something');]]></search>
  <ignoreif><[CDATA[$this->language->load('other');]]></ignoreif>
  <add position="after"><![CDATA[$this->language->load('something');]]></ignoreif>
</operation>

 

Ознакомьтесь со всеми возможностями OCMod на сайте проекта — https://github.com/opencart/opencart/wiki/Modification-System

 

 

Стоит всегда помнить — OCMod опасная штука! 🔥

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

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