Принцип работы OCMOD
В последнее время всё чаще встречаются вопросы: что такое OCMOD? или как работает OCMOD? Попробуем разобраться.
OCMOD — это такой программный комплекс, который позволяет изменять (дополнять) интернет-магазин на OpenCart не изменяя и не перезаписывая исходные файлы интернет-магазина. Да! Изменять, не изменяя! Если OCMOD дополнение создано правильно, то при его удалении просто восстанавливается предыдущее состояние интернет-магазина. Красота!!!
После установки, файл OCMOD-модификатора создает временный файл в папке system/storage/modification/ который и используется движком OpenCart. Эти файлы обновляются каждый раз, когда Вы нажимаете кнопку "Обновить" в "Менеджере дополнений" административной части.
Обратите внимание: если Вы вносите изменения непосредственно в файлы, расположенные в папке system/storage/modification/ Вы потеряете все изменения сразу же после нажатия кнопки "Обновить"! Эти файлы можно использовать для проверки работоспособности вносимых изменений, но затем все изменения должны быть перенесены в OCMOD файл!
Установка OCMOD
OCMOD идёт в стандартной поставке OpenCart, начиная со 2-ой версии и его не требуется устанавливать! Ветка на github находится здесь.
Из чего состоит OCMOD модификатор
OCMOD модификатор может состоять из одного файла с расширением xml. В этом случае на сервер ничего кроме него не загружается, а только выполняются инструкции из этого файла. Есть обязательное правило для имени такого файла: расширение файла должно быть .ocmod.xml
Если помимо инструкций нам необходимо загрузить на сервер дополнительные файлы (допустим файлы модуля), тогда файл должен представлять из себя zip-архив с расширением .ocmod.zip. При этом структура архива тоже должна подчиняться определенным правилам:
- папка upload, которая содержит все загружаемые на сервер файлы в соответствии со структурой папок OpenCart (до версии OpenCart 3 папка upload обязательна и без нее архив невозможно загрузить через установщик в админке. И даже если дополнение не имеет собственных файлов и файлы загружать ненужно, она должна присутствовать обязательно пустая)
- файл install.xml, который содержит инструкции для модифицирования исходных файлов интернет-магазина.
- файл install.sql, который содержит запросы SQL выполняемые во время установки дополнения.
- файл install.php, который содержит PHP код выполняемый во время установки дополнения.
Помимо этого, OCMOD модификатор может содержать необходимые SQL и PHP-инструкции, но в этой статье мы их рассматривать не будем.
Ошибка в Установщике дополнений OCMOD — неверный тип файла
Один из способов установки zip-архива дополнения OCMOD — распаковать файл у себя на компьютере, залить через ftp или через панель хостинга содержимое папки uplod на сервер, а затем через установщик дополнений установить xml-файл. Однако, если Вы попытаетесь загрузить install.xml непосредственно в "Установщик дополнений OCMOD" — Вы получите ошибку "неверный тип файла". Как этого избежать? Легко — просто переименуйте файл в, например, name.ocmod.xml то есть Вы должны устанавливать только файлы с расширением .ocmod.xml
Перейдём непосредственно к структуре OCMOD XML файла
<?xml version="1.0" encoding="utf-8"?>
<modification>
<name>Количество просмотров в товаре</name>
<code>product-page-views</code>
<version>1.0</version>
<author>https://ocmod.net</author>
<link>https://ocmod.net</link>
<file path="catalog/controller/product/product.php">
<operation>
<search>
<![CDATA[$data['images'] = array();]]>
</search>
<add position="after">
<![CDATA[
$data['view'] = $product_info['viewed'];
]]>
</add>
</operation>
</file>
<file path="catalog/language/en-gb/product/product.php">
<operation>
<search>
<![CDATA[$_['text_search']]]>
</search>
<add position="before">
<![CDATA[
$_['text_view'] = 'View: ';
]]>
</add>
</operation>
</file>
<file path="catalog/language/ru-ru/product/product.php">
<operation>
<search>
<![CDATA[$_['text_search']]]>
</search>
<add position="before">
<![CDATA[
$_['text_view'] = 'Просмотров: ';
]]>
</add>
</operation>
</file>
<file path="catalog/language/uk-ua/product/product.php">
<operation>
<search>
<![CDATA[$_['text_search']]]>
</search>
<add position="before">
<![CDATA[
$_['text_view'] = 'Переглядів: ';
]]>
</add>
</operation>
</file>
<file path="catalog/view/theme/*/template/product/product.twig">
<operation>
<search index="2">
<![CDATA[{% if review_status %}]]>
</search>
<add position="before">
<![CDATA[
<h4>{{ text_view }}{{ view }}</h4>
]]></add>
</operation>
</file>
</modification>К обязательным элементам структуры OCMOD файла относятся:
- заголовок <?xml version="1.0″ encoding="utf-8″?>
- <modification> </modification> — без параметров
- <code> </code> — содержит уникальный код (можете придумать любой, состоящий из цифр и латинских букв)
- <name> </name> — содержит имя модификатора
- <version> </version> — версия модификатора
- <author> </author> — автор модификатора
Необязательные элементы:
- <link> </link> — ссылка на сайт автора или ещё куда-либо.
Далее идёт код, который отвечает за модификацию файлов:
- <file path="catalog/controller/product/product.php"> </file> — указывает путь к файлу, в котором необходимо сделать изменения. Если необходимо заменить / изменить одинаковый кусок кода можно использовать звёздочку (*), фигурные скобки и запятые:
- <file path="catalog/view/theme/*/template/product/product.twig"> </file> (удобно использовать для замены во всех темах).
- <file path="catalog/controller/module/{bestseller.php,featured.php,latest.php,special.php}"> </file> (Обратите внимание: перечисление должно быть без пробелов!!!)
- <operation> </operation> — так как к одному и тому же файлу могут применяться разные операции, таких тегов может быть несколько в одном файле.
Тег <search> </search>
Далее идёт поиск вхождения: <search> </search>.
Обратите внимание: поиск осуществляется по одной целой строке, если необходимо заменить более одной строки необходимо использовать либо атрибут regex для тега <search> </search>, либо атрибут offset.
Здесь остановимся подробнее. Часто задают вопрос: как адаптировать модуль под какую-либо тему. Вот здесь и кроется ответ на этот вопрос! <search> </search> осуществляет поиск вхождения какой-либо части кода. Вот часть кода из файла install.xml:
<file path="catalog/view/theme/*/template/product/product.twig">
<operation>
<search index="2">
<![CDATA[{% if review_status %}]]>
</search>
<add position="before">
<![CDATA[
<h4>{{ text_view }}{{ view }}</h4>
]]></add>
</operation>
</file>Данный код осуществляет поиск в файле catalog/view/theme/*/template/product/product.twig части кода:
{% if review_status %}Это — код проверки наличия отзывов у товара. В стандартном шаблоне он встречается 3 раза.
В других шаблонах / темах этот код может встречаться более или менее раз. Именно поэтому модификатор не может найти необходимое вхождение кода и добавить Количество просмотров в товаре в нужном нам месте.
Необязательный атрибут тега <search> </search>: index, который необходимо использовать если код, который Вы ищете, не уникальный в данном файле, как в нашем случае. Мы можем найти первое вхождение этого кода указав <search index="0″> </search>.
Обратите внимание: первое вхождение имеет index="0″, а не index="1″.
Необязательный атрибут для тега <search> </search>: regex, который позволяет искать часть кода по регулярному выражению.
Рекомендуем пользоваться вот этим тестером регулярных выражений http://uvsoftium.ru/php/regexp.php
Тег <add> </add>:
Как раз в нём указывается код, который будет добавлен в исходный файл. При этом у него есть важный и обязательный атрибут position, который может принимать значения:
- before — как видно из названия, добавляемый код будет вставлен до кода, найденного тегом <search> </search>
- after — как видно из названия, добавляемый код будет вставлен после кода, найденного тегом <search> </search>
- replace — как видно из названия, добавляемый код будет вставлен вместо кода, найденного тегом <search> </search>
Еще раз посмотрим на код:
<file path="catalog/view/theme/*/template/product/product.twig">
<operation>
<search index="2">
<![CDATA[{% if review_status %}]]>
</search>
<add position="before">
<![CDATA[
<h4>{{ text_view }}{{ view }}</h4>
]]></add>
</operation>
</file>Как видим: в данном случае код количества просмотром добавляется перед (before) третьим вхождением кода для проверки наличия отзывов
Необязательный атрибут тега <add> </add>: offset, который позволяет сделать отступ от найденной части кода.
<file path="catalog/view/theme/*/template/product/product.twig">
<operation>
<search index="2">
<![CDATA[{% if review_status %}]]>
</search>
<add position="before" offset="4">
<![CDATA[
<h4>{{ text_view }}{{ view }}</h4>
]]></add>
</operation>
</file>Говоря понятным языком, найти вхождение кода
{% if review_status %}и, отступив 4 строки добавить код
<h4>{{ text_view }}{{ view }}</h4>










































Комментарии