OCMOD в четвёртой версии
OCMOD — способ изменить код ядра, не правя сами файлы. Файл XML описывает изменение: в каком файле какую строку найти и что рядом с ней добавить. Магазин строит изменённую копию файла и использует её вместо оригинала. Во второй и третьей версиях это был основной способ расширять магазин; в четвёртой его место заняли события.
Когда он нужен
| Задача | Средство |
|---|---|
| Изменить данные шаблона, HTML, аргументы или результат метода | Событие |
| Заменить шаблон | Событие, меняющее путь к шаблону |
| Изменить строку в середине метода ядра, куда не дотягивается ни одно событие | OCMOD |
OCMOD — крайняя мера: только когда в нужном месте нет триггера.
Доступность
В первых выпусках четвёртой версии — 4.0.0 и 4.0.1 — OCMOD не было совсем. Он вернулся в 4.0.2. Если в вашем выпуске он есть, в панели есть пункт Extensions → Modifications.
Файл модификации
<?xml version="1.0" encoding="utf-8"?>
<modification>
<name>Acme Hello: заметка в корзине</name>
<code>acme_hello_cart</code>
<version>1.0.0</version>
<author>Acme</author>
<link>https://example.com</link>
<file path="catalog/controller/checkout/cart.php">
<operation>
<search><![CDATA[$data['footer'] = $this->load->controller('common/footer');]]></search>
<add position="before"><![CDATA[
$data['acme_note'] = $this->config->get('module_acme_hello_text');
]]></add>
</operation>
</file>
</modification>Файл говорит: в контроллере корзины найти строку, которая загружает подвал, и вставить перед ней новую строку. Переменная acme_note станет доступна в шаблоне корзины.
| Тег | Смысл |
|---|---|
code | Уникальный код модификации |
file path | Изменяемый файл, путь от корня сайта |
search | Строка для поиска — точно как в файле |
add position | Куда поставить новый код: before, after или replace |
Куда положить файл
Имя файла заканчивается на .ocmod.xml, и он входит в архив дополнения. Где именно в архиве он должен лежать и как называться, решает установщик, и это различается между выпусками — посмотрите документацию своего выпуска или работающее дополнение с OCMOD для него.
Применение
После установки пакета откройте Extensions → Modifications и нажмите кнопку обновления. Магазин перечитает все файлы модификаций и построит изменённые копии в system/storage/ — исходные файлы в catalog/ и admin/ остаются прежними. Откройте страницу корзины — новая переменная доступна в её шаблоне.
То же обновление нужно после каждого изменения файла XML и после обновления магазина.
Та же задача событием
Примеру выше OCMOD не нужен. Обработчик триггера catalog/view/checkout/cart/before добавляет ту же переменную в $data — без поиска строки кода, которая может измениться в следующем выпуске.
Частая ошибка
В строке search есть фрагмент, который в другом выпуске отличается, — лишний пробел, переименованная переменная. Строка не находится, модификация молча пропускается, и возможность исчезает после обновления. Ищите самый короткий устойчивый фрагмент, а после каждого обновления проверяйте журнал модификаций на той же странице.