Модифікатори в 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" в адмін-панелі у списку товарів.
\\ \ \\\ \\Test\ \]]>\
Знаходимо 2-й за порядком текст "panel-body" (перший - це фільтр праворуч від товарів, а другий - сам список товарів) і потім додаємо код "\
Test\
" на один рядок нижче знайденого тексту.
Зверніть увагу: position="before" і position="after" додають код не в середину рядка, де було знайдено "panel-body", а в наступний (чи попередній) рядок. Якщо потрібно зробити додавання в середині рядка, слід використовувати position="replace" і повторивши той самий знайдений текст, ми додаємо свій.
Приклад: Додати текст перед версією opencart-а у футері
\\ \ \\\ \\Test\ \{{ text\_version }} ]]>\
Створивши модифікатор OCMOD в OpenCart можна змінити практично всю систему, розширити її можливості, при цьому вихідні файли не будуть зачеплені, і ви можете все повернути в початковий вигляд, просто видаливши файл-модифікатор (або відключивши його, якщо він був завантажений у базу даних).