надо срочно сюда
что-нибудь добавить
Модификаторы в OpenCart представляют собой особый тип модулей, которые позволяют вносить изменения в функциональность или дизайн без вмешательства в оригинальные файлы системы. Это обеспечивает стабильность основных файлов OpenCart, в то же время позволяя модифицировать или расширять возможности платформы. В данной статье будет описано, как создать собственный модификатор для OpenCart и какие возможности предоставляют модификаторы.
Первоначально, концепция модификаторов была введена с vQmod в версии 1.5 OpenCart, а затем она была улучшена и превращена в OCMOD, который стал стандартным функционалом OpenCart, начиная с версии 2.1. Таким образом, модификатор в OpenCart - это инструмент для внесения изменений в систему без непосредственного воздействия на основные файлы.
Модификатор OpenCart является модулем в виде XML-файла, который содержит ряд указаний о том, какие изменения в коде оригинальных файлов OpenCart необходимо произвести: заменить, добавить или удалить. OpenCart выполняет эти инструкции путем создания дубликатов исходных файлов в отдельной папке (кэш модификаторов) и вносит изменения в эти копии. Таким образом, при использовании сайта применяются измененные файлы вместо оригинальных.
OCMOD-модификатор может действовать как независимый модуль, модифицирующий или расширяющий стандартные возможности, или быть частью полнофункционального модуля, включающего дополнительные php, twig, js, css и другие файлы.
Имя файла модификатора - должно быть задано в соответствии с шаблоном <имя_файла>.ocmod.xml , где вместо <имя_файла> вы пишите свое название. Таким образом имя файла всегда должно заканчиваться ".ocmod.xml", иначе система не "увидит" модификатор и проигнорирует его.
Исключение: когда предполагается использовать модификатор в составе полного модуля в виде архива - в этом случае имя файла-модификатора в архиве должно быть install.xml.
Расположение файла модификатора - папка system в корне сайта. Файл-модификатор так же можно загрузить в базу данных на постоянное размещение с помощью загрузки расширений. Тем не менее, во время разработки удобнее записать файл в system и редактировать его там, проверяя какой получается результат, а когда разработка завершена, модификатор загружают как модуль в базу данных.
Расположение кэша модификаторов - папка /storage/modification с такой же структурой, как корень сайта. Т.е. если вы сделали модификатор для файла /admin/controller/catalog/product.php то его измененная копия будет находится в /storage/modification/admin/controller/catalog/product.php. В нем вы и увидите те изменения которые производит ваш модификатор.
Расположение логов - папка /storage/logs В ней есть 2 основных лог-фала: ocmod.log - который показывает как обрабатывались файлы-модификаторы, в какой последовательности и как выполнялись инструкции и лог-файл error.log - который содержит ошибки, произошедшие при преобразовании.
Чтобы система распознала файлы-модификаторы и применила их инструкции, нужно нажать кнопку "Обновить" на странице модификаторов.
Иногда после обновления кэша изменения на сайте не отображаются. Обычно это происходит из-за того, что на сайте используются дополнительные кэширующие модули или инструменты для ускорения загрузки и прочее, где, возможно, также требуется обновление кэша.
Файл модификатора OCMOD должен содержать общую описательную часть и инструкции по изменению файлов. Начну разбор синтаксиса с простого примера, который добавляет слово "Test" в шапке администраторского раздела:
<!--?xml version="1.0" encoding="utf-8"?--> <modification> <name>Test</name> <!-- Название модификатора --> <code>Test</code> <!-- Уникальный код модификатора --> <version>1.0</version> <!-- Версия --> <author>Test</author> <!-- Автор --><link />http://www.test.ru <!-- Сайт разработчика --> <file path="admin/view/template/common/header.twig"> <!-- Какой файл будет модифицироваться --> <operation> <search> <!-- Найти код в файле --> <!--[CDATA[ <div class="container-fluid"--> ]]> </search> <add position="after"> <!-- Добавление модификации (после найденного кода) --> <!--[CDATA[ <p-->Тест<p> </p> ]]> </add> </operation> </file> </modification>
Итак, данный пример модификатора меняет файл header.twig. Он находит строчку "<div class="container-fluid">" и после нее добавляет "<p>Тест</p>".
В одном xml-файле может быть любое количество секций <file> и соответственно, мы можем менять множество файлов одним модификатором.
Разберем каждый тег модификатора и его возможности поподробнее.
Указывает в каком файле или файлах нужно внести изменения. Обязательный атрибут path содержит путь до изменяемого файла. Может указывать на один файл или на несколько. Для указания нескольких файлов используется символ "|". Например, внести изменения в action.php и в loader.php
<file path="system/engine/action.php|system/engine/loader.php">
Для сокращения кода можно использовать фигурные скобки, которые позволяют указать несколько значений через запятую:
<file path="system/engine/{action,loader}.php">
Так же можно использовать символы "*" и "?", чтобы указать путь по "маске". Часто бывает полезно для модификации файлов-шаблонов.
<file path="catalog/view/theme/*/template/product/product.twig">
Т.к. мы не знаем заранее, какие именно темы установлены в OpenCart, мы указали "*" после "theme" и тогда будут модифицироваться все product.twig во всех темах.
Указывает начало секции производимой модификации. Внутри File секций <operation> может быть несколько. Т.е мы можем делать сразу несколько изменений в одном файле. Тег Operation может иметь необязательный атрибут error, который может принимать значения:
Например, найти в файле header.twig текст "navbar-rightnav" и если его нет, тогда пропустить и перейти к следующей операции и найти "navbar-right":
<file path="admin/view/template/common/header.twig"> <operation error="skip"> <search><![CDATA[ navbar-rightnav ]]></search> <add position="after"><![CDATA[ <li>Test1</li> ]]></add> </operation> <operation error="skip"> <search><![CDATA[ navbar-right ]]></search> <add position="after"><![CDATA[ <li>Test2</li> ]]></add> </operation> </file>
Если не указывать атрибут error="skip", тогда на первом поиске текста "navbar-rightnav" вся секция <file> была бы прервана и проигнорирована.
Указывает какой текст необходимо найти в текущей операции. Есть несколько правил использования тега:
Специальные теги <![CDATA[ и ]]> - используются в xml-файлах для указания любых символьных данных, что означает, что между ними может находиться какой угодно текст, содержащий скобки, значи больше, меньше и другие, в т.ч. и php-код, html-код и т.д.
Для более точного определения места внесения изменений в теге Search могут использоваться атрибуты:
Пример: добавить пункт меню "ТЕСТ".
<file path="admin/controller/common/column_left.php"> <operation> <search index="0" trim="true"><![CDATA[ $data['menus'][] = array( ]]></search> <add position="before"><![CDATA[ $data['menus'][] = array( 'id' => 'menu-test', 'icon' => 'fa-play', 'name' => 'TEST', 'href' => '#' ); ]]></add> </operation> </file>
В данном примере находим первое "$data['menus'][] = array(" и перед ним добавляем свой код.
Тег содержит текст, который будет добавлен до/после найденного или на который будет заменен найденный текст.
Так же как и тег Search, должен содержать <![CDATA[ и ]]> между которыми пишется текст кода, который будет добавляться/заменяться.
В теге Add могут использоваться атрибуты:
Пример: Добавить слово "Test" в админ-панели в списке товаров.
<file path="admin/view/template/catalog/product_list.twig"> <operation> <search index="1" trim="true"><![CDATA[ panel-body ]]></search> <add position="after" offset="1" trim="true"><![CDATA[ <p>Test</p> ]]></add> </operation> </file>
Находим 2-й по порядку текст "panel-body" (первый - это фильтр справа от товаров, а второй - сам список товаров) и затем добавляем код "<p>Test</p>" на одну строку ниже найденного текста.
Обратите внимание: position="before" и position="after" добавляют код не в середину строки, где было найдено "panel-body", а в следующую (или предыдущую) строку. Если нужно сделать добавление в середине строки, следует использовать position="replace" и повторив тот же самый найденный текст мы добавляем свой.
Пример: Добавить текст перед версией opencart-а в футере
<file path="admin/view/template/common/footer.twig"> <operation> <search><![CDATA[ {{ text_version }} ]]></search> <add position="replace" trim="true"><![CDATA[ <p>Test</p>{{ text_version }} ]]></add> </operation> </file>
Создав модификатор OCMOD в OpenCart-е можно изменить практически всю систему, расширить ее возможности, при этом исходные файлы не будут затронуты и вы можете всё вернуть в первоначальный вид, просто убрав файл-модификатор (или отключив его, если он был загружен в базу данных).