Создание модуля для OpenCart 2 (OCMOD)

Привет всем! Недавно перешел с одной сборки Opencart на другую, с сожалением осознав, что все мои правки на прошлой сборки канули в лету. Решил разобраться с тем, как работают модули в OpenCart 2. Мне понадобился функционал простейших модулей на xml, которые бы просто добавляли или удаляли какой-либо код в исходные файлы. В этом посте я опишу создание простого модуля, который фиксит проблему циклической ссылки с главной страницы, которая ведет, соответственно, на главную (это может негативно сказаться на SEO).

Для начала теория.

Структура XML модуля выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<modification>
<name>Homepage link fix</name>
<code>mymodule</code>
<version>1.0</version>
<author>Awakum for OpenCart Pro CMS</author>
<link>//www.opencart.pro</link>
<file path="catalog/view/theme/default/template/common/header.tpl">
<operation>
<search trim="true"><![CDATA[
<div id="logo">
]]></search>
<add position="replace"><![CDATA[
sqooqa.ru
]]></add>
</operation>
</file>
</modification>

Тэги Name, Code, Version, Author и Link исключительно информативные, поэтому не вижу смысла расписывать их подробно. Только меняйте Name и Code в каждом новом модуле, иначе OCMOD будет ругаться.

Далее следует тэг File, в котором указывается путь к файлу, который нам необходимо изменить. При указании пути действуют маски. Например, если указать «catalog/view/theme/default/template/{common,information}/header.tpl», то система будет пытаться найти файл header.tpl и в папке common, и в information.
Маска «catalog/view/theme/default/template/common/*.tpl» укажет системе искать все файлы с расширением .tpl в указанной папке.
А если указать заменить звездочкой папку «catalog/view/theme/default/template/*/header.tpl», то система будет искать файл header.tpl во всех вложенных в папку template подпапках.

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

Тэг Search даст системе команду найти необходимую строку в файле. В нашем примере мы велим модулю найти строку
<div id="logo">в файле header.tpl.
Данный тэг может иметь некоторые атрибуты:
Атрибут trim="(true|false)" — удалять лишние пробелы в указанном тексте или нет. Не обязателен.
regex="(true|false)" — позволяет использовать регулярные выражения при поиске.
index="(номер)" — указывает какое именно вхождение будет редактироваться. Например, если в исходном файле строка
<div id="logo">
встречается дважды, то данным атрибутом мы должны указать с каким именно вхождением нужно работать. Внимание: Если вхождение искомой строки в файле только одно, не указывайте значение index="1" — в логе будет выдаваться ошибка, что код не найден.

Следующий тэг: Add. В нем указывается что необходимо сделать после того как искомая строка будет найдена. Он тоже имеет атрибуты:
Не обязательный и уже названный trim="(true|false)". Функционал см. выше.
position="(Replace|After|Before)" — указывает нужно ли заменить найденный текст (Replace), вставить что-либо после него (After) или перед ним (Before).
offset="(число)" — сообщает системе сколько строк нужно отступить (или на сколько подняться наверх) после того как искомая в Search строка будет найдена. Может принимать отрицательное значение.
Если мы укажем, например , то указанный в тэге текст будет вставлен на три строки выше искомой строки. А вот интересный момент: сообщив OCMOD , мы тем самым заменим искомую строку и еще три строки ниже. Это нам понадобится в сегодняшнем примере.

Стоит добавить, что искомый и сравниваемый текст ставится между открывающим <![CDATA[ и закрывающим кодом ]].

А теперь перейдем к практике. Приступим к созданию модуля!
Напомню, что я взялся пофиксить циклическую ссылку главной страницы, которая ссылается сама на себя, с помощью модуля OCMOD для Opencart.
Чтобы исправить этот баг, необходимо написать модуль, который в файле catalog/view/theme/default/template/common/header.tpl
найдет код:
<div id="logo">
<?php if ($logo) { ?>
<a href="<?php echo $home; ?>"><img src="<?php echo $logo; ?>" title="<?php echo $name; ?>" alt="<?php echo $name; ?>" class="img-responsive" /></a>
<?php } else { ?>
<h1><a href="<?php echo $home; ?>"><?php echo $name; ?></a></h1>
<?php } ?>
</div>

И исправит его на это:
<div id="logo">
<?php if ($logo) { ?>
<?php if ($class == "common-home") { ?>
<img src="<?php echo $logo; ?>" title="<?php echo $name; ?>" alt="<?php echo $name; ?>" class="img-responsive" />
<?php } else { ?>
<a href="<?php echo $home; ?>"><img src="<?php echo $logo; ?>" title="<?php echo $name; ?>" alt="<?php echo $name; ?>" class="img-responsive" /></a>
<?php } ?>
<?php } else { ?>
<h1><a href="<?php echo $home; ?>"><?php echo $name; ?></a></h1>
<?php } ?>
</div>

Пишем модуль:
<?xml version="1.0" encoding="utf-8"?>
<modification>
<name>Homepage link fix</name>
<code>mymodule</code>
<version>1.0</version>
<author>Sqooqa.ru for OpenCart Pro CMS</author>
<link>//www.opencart.pro</link>
<file path="catalog/view/theme/default/template/common/header.tpl">
<operation>
<search trim="true"><![CDATA[
<div id="logo">
]]></search>
<add position="replace" trim="true" offset="6"><![CDATA[
<div id="logo">
<?php if ($logo) { ?>
<?php if ($class == "common-home") { ?>
<img src="<?php echo $logo; ?>" title="<?php echo $name; ?>" alt="<?php echo $name; ?>" class="img-responsive" />
<?php } else { ?>
<a href="<?php echo $home; ?>"><img src="<?php echo $logo; ?>" title="<?php echo $name; ?>" alt="<?php echo $name; ?>" class="img-responsive" /></a>
<?php } ?>
<?php } else { ?>
<h1><a href="<?php echo $home; ?>"><?php echo $name; ?></a></h1>
<?php } ?>
</div>
]]></add>
</operation>
</file>
</modification>

Принцип работы. Высота искомого кода 7 строк. Модуль находит строку
<div id="logo">
, и заменяет её и 6 строчек ниже правильным кодом. Всё! Теперь сохраняем файл, назвав его (произвольное_имя).ocmod.xls. Имя лучше писать на латинице. Далее заходим в админку Opencart -> Модули -> Установка модулей, указываем на только что созданный файл, нажимаем на кнопку обновления сверху.

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

Модуль нашел код и отдал номер строки
Модуль нашел код и отдал номер строки

Для корректировки кода, вы можете посмотреть как изменился файл под воздействием модуля. Наш файл будет находиться тут: system/storage/modification/catalog/view/theme/default/template/common/header.tpl. Как вы уже наверняка поняли, весь изначальный путь расположения файла повторяется после system/storage/modification/, поэтому если вы будете подключать модули к другим файлам, ищите их в другом расположении.

Важное замечание! Нельзя внести изменения в .css и .js файлы посредством OCMOD. А жаль.

Вот и всё что я хотел донести. Если у вас возникли проблемы, пишите в комментариях. Всем Успехов! 🙂