Operation error skip

Расширение, представляющее из себя XML файл, которое содержит набор инструкций о том в каких оригинальных файлах OpenCart-а, в каких местах, какой код нужно заменить, добавить или удалить...

OCMOD — Модификаторы в OpenCart — это разновидность расширений, позволяющих вносить изменения в функционал или внешний вид, не затрагивая оригинальные файлы. Тем самым обеспечивается неизменность оригинальных файлов самого OpenCart, при том, что появляется возможность заменять или расширять необходимый функционал.

История появления модификаторов началась с vQmod в opencart версии 1.5х, и уже в версии opencart 2x он был усовершенствоваван и преобразован в OCMOD. В отличии от vQmod который устанавливался отдельно, OCMOD внедрён по умолчанию как стандартный функционал в CMS OpenCart2х и выше.

OCMOD — Модификатор в OpenCart — расширение представляющее из себя XML файл, которое содержит набор инструкций о том, в каких оригинальных файлах OpenCart-а, в каких местах, какой код нужно заменить, добавить или удалить. OpenCart при выполнении инструкций xml файла создает копии исходных файлов в специальную директорию кэша модификаторов с внесёнными изменениями в этих копиях. В результате, при работе сайта используются измененные файлы, а не их оригинальные файлы.

Модификатор OCMOD может быть как самостоятельным модулем, изменяющим или расширяющим стандартный функционал, так и входить в состав полноценного модуля с дополнительными php, tpl или twig и прочими файлами.

Структура архива OCMOD модификатора

image/catalog/doc/ru/ocmod/ocmod.jpg

Название архива модификатора — должно быть задано в соответствии с требованиямя OCMOD — «название_файла».ocmod.zip , где вместо «название_файла» вы пишите свое название без кавычек. Таким образом, название архива всегда должно заканчиваться «.ocmod.zip«, иначе система проигнорирует модификатор.

Начиная с версии OpenCart 3x предполагается, что модификатор будет использоваться в составе полного модуля в виде архива — в отличии от OpenCart2x, где файл модификатора в виде «название_файла».ocmod.xml можно было загружать через установщик расщирений прямо в папку system, расположенную в корне сайта. Соответственно, при использовании файла модификатора в составе полного модуля и при его загрузке через административную часть в разделе Расширения > Установка расширений название файла-модификатора в архиве должно быть install.xml.

В OpenCart 3x  файл-модификатор также можно загрузить в папку system на постоянное размещение, используя FTP клиент, при условии, что название файла модификатора будет соответствовать требованиям OCMOD в виде «название_файла».ocmod.xml .

Директории

Кэш модификаторов — все изменённые модификатором файлы располагаются в папке system/storage/modification с такой же точно структурой папок, как и корень сайта, кроме папки image. Т.е. если вы сделали модификатор для файла /admin/controller/catalog/product.php то его измененная копия будет находится по пути system/storage/modification/admin/controller/catalog/product.php.

Логи модификаторов —  распалагаются в папке system/storage/logs , в ней находятся 2 основных лог-файла:

  • ocmod.log — ведет запись об оработке и последовательности выполнении инструкций модификаторов,
  • error.log — содержит ошибки, произошедшие при преобразовании.

Обновление кэша модификаторов

Чтобы система увидела файлы-модификаторы и выполнила их инструкции, необходимо нажать кнопку «Обновить» в правом верхнем углу на странице Модификаторы.

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

Синтаксис модификатора OCMOD

Файл модификатора OCMOD обязательно должен содержать общую описательную часть и инструкции по изменению файлов:

<?xml version="1.0" encoding="utf-8"?>
<modification>
  <name>Мod</name>                    <!-- Название модификатора -->
  <code>mod_dev</code>                <!-- Уникальный код модификатора -->
  <version>1.0</version>              <!-- Версия модификатора -->
  <author>Develop</author>            <!-- Автор модификатора -->
  <link>https://open-cart.dev</link>  <!-- Сайт разработчика -->
 
<file path="catalog/controller/product/category.php">  <!-- Файл который будет модифицироваться -->
  <operation>
    <search>                           <!-- Поиск кода в файле -->
      <![CDATA[
        $result['name'],
      ]]>
    </search>
    <add position="after">             <!-- Добавление модификации (после найденного куска кода) -->
      <![CDATA[
        'sku'      => $result['sku'],
      ]]>
    </add>
  </operation>
</file>
 
</modification>

Данный пример модификатора меняет файл category.php.
Он находит кусок строчки кода «$result[‘name’],» и сразу за ним добавляет «‘sku’      => $result[‘sku’],«.

В одном xml файле может быть любое количество секций <file> и возможность менять любое количество файлов одним модификатором.

Теги модификатора OCMOD и их функциональность

Тег — File

Указывает, в каком файле или файлах нужно внести изменения. Обязательный атрибут path содержит путь до изменяемого файла. Может указывать на один файл или на несколько. Для указания нескольких файлов, расположенных в разных папках, используется символ «|«. Например, внести изменения в category.php, manufacturer.php, search.php и в special.php .

<file path="catalog/controller/product/category.php|catalog/controller/extension/module/special.php">

Для сокращения кода можно использовать фигурные скобки, которые позволяют указать несколько значений через запятую: Например, внести изменения сразу в четыре файла category.php, manufacturer.php, search.php и в special.php. при этом суфикс .php можно вынести за фигурные скобки.

.

<file path="catalog/controller/product/{category,manufacturer,search,special}.php">

Так же можно использовать символы «*» и «?«, чтобы указать путь по «маске». Бывает полезно для модификации файлов шаблонов.

<file path="catalog/view/theme/*/template/product/category.twig">

Т.к. мы не знаем заранее, какие именно темы установлены в OpenCart, мы указали «*» после «theme«, тогда будут модифицироваться все category.twig во всех шаблонах, находящихся в папке «theme«.

Тег — Operation

Указывает начало секции производимой модификации. Внутри file секций <operation> может быть несколько. Т.е мы можем делать сразу несколько изменений в одном файле. Тег operation может иметь необязательный атрибут error, который может принимать значения:

  • skip — в случае ошибки пропустить текущую секцию <operation> и перейти к следующей <operation>
  • log (по умолчанию) — в случае ошибки пропустить всю секцию <file> и перейти к следующему <file>
  • abort — в случае ошибки прервать все модификации в xml файле

Например, найти в файле category.twig код «<div class=»caption»>»  и если его нет, тогда пропустить и перейти к следующей операции и найти «<p class=»price»>«.

<file path="catalog/view/theme/*/template/product/category.twig">
  <operation error="skip">
    <search><![CDATA[<div class="caption">]]></search>
    <add position="after"><![CDATA[
       <span class="sku">{{ product.sku}}</span>
    ]]></add>
  </operation>
  <operation error="skip">
    <search><![CDATA[<p class="price">]]></search>
    <add position="before"><![CDATA[
       <span class="sku">{{ product.sku}}</span>
    ]]></add>
  </operation>
</file>

Если не указать атрибут error=»skip», тогда на первом поиске текста «<div class=»caption»>» вся секция <file> будет прервана и проигнорирована.

Тег — Search

Указывает, какой текст необходимо найти в текущей операции. Содержит несколько правил использования тега:

  • Тег search может быть использован только 1 раз внутри секции operation.
  • Поиск можно делать только 1 строки целиком или части строки (нельзя искать несколько строк одновременно).
  • Искомый текст необходимо размещать строго между <![CDATA[ и ]]>.
  • Пробелы и переносы строки до искомого текста и после искомого текста игнорируются, текст можно написать или сразу после CDATA или с новой строки после CDATA, если только не указан атрибут trim=»false».
  • Изменения применятся ко всем найденным в файле строчкам кода или их частям, если не указан атрибут index .

Специальные теги <![CDATA[ и ]]> — используются в xml файлах для указания любых символьных данных, что означает, что между ними может находиться любой текст, содержащий скобки, значки больше, меньше и прочие, в том числе html и php код.

Тег search содержит следующие атрибуты, которые используются для наиболее точного определения места внесения изменения:

  • index — указывает, в каком по порядку найденном тексте внести изменения. Т.е. если в файле искомый текст встречается несколько раз, тогда index позволяет указать номер найденного по порядку текста (0 всегда первый найденный текст, 1 — второй и т.д.) Можно также указать несколько номеров через запятую.
  • trim — указывает игнорировать (true) или нет (false) пробелы и переносы строк до и после искомого текста.
  • regex — если установлено значении true, значит искомый текст представляет собой регулярное выражение для поиска.

Пример: поиск атрибутом index среди схожих строчек кода.

<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'       => 'new_menu',
        'icon'     => 'fa-menu',
        'name'     => 'New Menu',
        'href'     => 'new-menu/'
      );
    ]]></add>
  </operation>
</file>

В примере по index найдена первая строчка кода «$data[‘menus’][] = array(» и перед ней добавляем свой код.

Тег — Add

Тег add содержит текст, который будет заменён или добавлен до или после искомого текста.

Так же, как и тег search, тег add должен содержать <![CDATA[ и ]]>, между которыми вставляется текст кода, который будет добавлен или на который будет заменён искомый текст.

Тег add имеет свои атрибуты:

  • position — может принимать значения:

    • replace (по умолчанию) — замена найденного текста
    • before — добавить текст перед найденным текстом
    • after — добавить текст после найденного текста
  • offset — означает смещение относительно найденного текста на указанное количество строк. Если position=»before», тогда смещение будет вверх от найденного текста, если position=»after» или position=»replace», тогда смещение будет вниз от найденного текста.
  • trim — указывает игнорировать (true) или нет (false) пробелы и переносы строк до и после искомого текста.

Пример: Добавим ссылку «Link» в футер на фронтальной части.

<file path="catalog/view/theme/default/template/common/footer.twig">
  <operation>
    <search index="1" trim="true"><![CDATA[
      <ul class="list-unstyled">
    ]]></search>
    <add position="after" offset="1" trim="true"><![CDATA[
      <li><a href="#">Link</a></li>
    ]]></add>
  </operation>
</file>

Атрибут index=»1″ находит 2-й по порядку код <ul class=»list-unstyled»>, затем используя атрибут offset=»1″ на одну строку ниже найденного текста добавляет код <li><a href=»#»>Link</a></li>.

Модификатор OCMOD позволяет в OpenCart расширить возможности, не затрагивая оригинальные файлы, а для возврата в исходное состояние вам просто будет достаточно удалить его.

Модификаторы в OpenCart — это разновидность модулей, позволяющих вносить изменения в функционал или внешний вид, при этом не затрагивая оригинальные файлы. Таким образом обеспечивается неизменность файлов самого opencart-а, но при этом мы можем менять или добавлять функционал. В этой статье я расскажу как создать свой модификатор для OpenCart и какие есть возможности у модификаторов.

Изначально, история появления модификаторов началась с vQmod в версии 1.5 opencart-а, а затем его усовершенствовали и преобразовали в OCMOD, который стал постоянным стандартным функционалом OpenCart-а начиная с 2.1 версии. Итак, попробую дать определение понятию модификатор в OpenCart.

Модификатор в OpenCart — это модуль представляющий собой XML-файл, содержащий набор инструкций о том в каких оригинальных файлах OpenCart-а, в каких местах, какой код нужно заменить, добавить или удалить. OpenCart при выполнении инструкций xml-файла создает копии исходных файлов в специальную директорию (кэш модификаторов) и вносит изменения в этих копиях. В результате, при работе сайта используются измененные файлы, а не оригиналы.

Модификатор OCMOD может быть как самостоятельным модулем, изменяющим или дополняющим стандартный функционал, так и входить в состав полноценного модуля с дополнительными php, twig и другими файлами. О написании полного модуля читайте в предыдущей статье.

Имена файлов и директории

Имя файла модификатора — должно быть задано в соответствии с шаблоном <имя_файла>.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

Файл модификатора 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</link>  <!-- Сайт разработчика -->

<file path="admin/view/template/common/header.twig">  <!-- Какой файл будет модифицироваться -->
  <operation>
    <search>                           <!-- Найти код в файле -->
      <![CDATA[
        <div class="container-fluid">
      ]]>
    </search>
    <add position="after">             <!-- Добавление модификации (после найденного кода) -->
      <![CDATA[
        <p>Тест</p>
      ]]>
    </add>
  </operation>
</file>

</modification>

Итак, данный пример модификатора меняет файл header.twig. Он находит строчку «<div class=»container-fluid»>» и после нее добавляет «<p>Тест</p>».

В одном xml-файле может быть любое количество секций <file> и соответственно, мы можем менять множество файлов одним модификатором.

Разберем каждый тег модификатора и его возможности поподробнее.

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 во всех темах.

Operation

Указывает начало секции производимой модификации. Внутри File секций <operation> может быть несколько. Т.е мы можем делать сразу несколько изменений в одном файле. Тег Operation может иметь необязательный атрибут error, который может принимать значения:

  • skip — в случае ошибки пропустить текущую секцию <operation> и перейти к следующей <operation>
  • log (по-умолчанию) — в случае ошибки пропустить всю секцию <file> и перейти к следующему <file>
  • abort — в случае ошибки прервать все модификации в xml-файле

Например, найти в файле 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> была бы прервана и проигнорирована.

Search

Указывает какой текст необходимо найти в текущей операции. Есть несколько правил использования тега:

  • Тег Search может быть использован только 1 раз внутри секции Operation.
  • Поиск можно делать только 1 строки целиком или части строки (нельзя искать несколько строк одновременно).
  • Искомый текст необходимо размещать между <![CDATA[ и ]]>.
  • Пробелы и переносы строки до искомого текста и после искомого текста игнорируются (поэтому искомый текст можно написать или сразу после CDATA или с новой строки после CDATA, как больше нравится), если только не указан атрибут trim=»false» (описание ниже).
  • Изменения выполняются над всеми найденными в файле строками (или частями строк), если только не указан атрибут index (описание ниже).

Специальные теги <![CDATA[ и ]]> — используются в xml-файлах для указания любых символьных данных, что означает, что между ними может находиться какой угодно текст, содержащий скобки, значи больше, меньше и другие, в т.ч. и php-код, html-код и т.д.

Для более точного определения места внесения изменений в теге Search могут использоваться атрибуты:

  • index — указывает в каком по-порядку найденном тексте сделать изменения. Т.е. если в файле искомый текст встречается несколько раз, тогда index позволяет указать номер найденного по порядку текста (0 — первый найденный текст, 1 — второй и т.д.) Можно так же указать несколько номеров через запятую.
  • trim — указывает игнорировать (true) или нет (false) пробелы и переносы строк до и после искомого текста.
  • regex — если установлено значении true, значит искомый текст представляет собой регулярное выражение для поиска.

Пример: добавить пункт меню «ТЕСТ».

  <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(» и перед ним добавляем свой код.

Add

Тег содержит текст, который будет добавлен до/после найденного или на который будет заменен найденный текст.

Так же как и тег Search, должен содержать <![CDATA[ и ]]> между которыми пишется текст кода, который будет добавляться/заменяться.

В теге Add могут использоваться атрибуты:

  • position — может принимать значения:
    • replace (по умолчанию) — замена найденного текста
    • before — добавить текст перед найденным текстом
    • after — добавить текст после найденного текста
  • offset — означает смещение относительно найденного текста на указанное количество строк. Если position=»before», тогда смещение будет вверх от найденного текста, если position=»after» или position=»replace», тогда смещение будет вниз от найденного текста.
  • trim — указывает игнорировать (true) или нет (false) пробелы и переносы строк до и после искомого текста.

Пример: Добавить слово «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-е можно изменить практически всю систему, расширить ее возможности, при этом исходные файлы не будут затронуты и вы можете всё вернуть в первоначальный вид, просто убрав файл-модификатор (или отключив его, если он был загружен в базу данных).

Модификаторы — OCMOD

OCMOD — Модификаторы в OpenCart — это разновидность расширений, позволяющих вносить изменения в функционал или внешний вид, не затрагивая оригинальные файлы. Тем самым обеспечивается неизменность оригинальных файлов самого OpenCart, при том, что появляется возможность заменять или расширять необходимый функционал.

История появления модификаторов началась с vQmod в opencart версии 1.5х, и уже в версии opencart 2x он был усовершенствоваван и преобразован в OCMOD. В отличии от vQmod который устанавливался отдельно, OCMOD внедрён по умолчанию как стандартный функционал в CMS OpenCart2х и выше.

OCMOD — Модификатор в OpenCart — расширение представляющее из себя XML файл, которое содержит набор инструкций о том, в каких оригинальных файлах OpenCart-а, в каких местах, какой код нужно заменить, добавить или удалить. OpenCart при выполнении инструкций xml файла создает копии исходных файлов в специальную директорию кэша модификаторов с внесёнными изменениями в этих копиях. В результате, при работе сайта используются измененные файлы, а не их оригинальные файлы.

Модификатор OCMOD может быть как самостоятельным модулем, изменяющим или расширяющим стандартный функционал, так и входить в состав полноценного модуля с дополнительными php, tpl или twig и прочими файлами.

Структура архива OCMOD модификатора

image/catalog/doc/ru/ocmod/ocmod.jpg

Название архива модификатора — должно быть задано в соответствии с требованиямя OCMOD — «название_файла».ocmod.zip , где вместо «название_файла» вы пишите свое название без кавычек. Таким образом, название архива всегда должно заканчиваться «.ocmod.zip«, иначе система проигнорирует модификатор.

Начиная с версии OpenCart 3x предполагается, что модификатор будет использоваться в составе полного модуля в виде архива — в отличии от OpenCart2x, где файл модификатора в виде «название_файла».ocmod.xml можно было загружать через установщик расщирений прямо в папку system, расположенную в корне сайта. Соответственно, при использовании файла модификатора в составе полного модуля и при его загрузке через административную часть в разделе Расширения > Установка расширений название файла-модификатора в архиве должно быть install.xml.

В OpenCart 3x  файл-модификатор также можно загрузить в папку system на постоянное размещение, используя FTP клиент, при условии, что название файла модификатора будет соответствовать требованиям OCMOD в виде «название_файла».ocmod.xml .

Директории

Кэш модификаторов — все изменённые модификатором файлы располагаются в папке system/storage/modification с такой же точно структурой папок, как и корень сайта, кроме папки image. Т.е. если вы сделали модификатор для файла /admin/controller/catalog/product.php то его измененная копия будет находится по пути system/storage/modification/admin/controller/catalog/product.php.

Логи модификаторов —  распалагаются в папке system/storage/logs , в ней находятся 2 основных лог-файла:

  • ocmod.log — ведет запись об оработке и последовательности выполнении инструкций модификаторов,
  • error.log — содержит ошибки, произошедшие при преобразовании.

Обновление кэша модификаторов

Чтобы система увидела файлы-модификаторы и выполнила их инструкции, необходимо нажать кнопку «Обновить» в правом верхнем углу на странице Модификаторы.

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

Синтаксис модификатора OCMOD

Файл модификатора OCMOD обязательно должен содержать общую описательную часть и инструкции по изменению файлов:

<?xml version="1.0" encoding="utf-8"?>
<modification>
  <name>Мod</name>                    <!-- Название модификатора -->
  <code>mod_dev</code>                <!-- Уникальный код модификатора -->
  <version>1.0</version>              <!-- Версия модификатора -->
  <author>Develop</author>            <!-- Автор модификатора -->
  <link>https://open-cart.dev</link>  <!-- Сайт разработчика -->
 
<file path="catalog/controller/product/category.php">  <!-- Файл который будет модифицироваться -->
  <operation>
    <search>                           <!-- Поиск кода в файле -->
      <![CDATA[
        $result['name'],
      ]]>
    </search>
    <add position="after">             <!-- Добавление модификации (после найденного куска кода) -->
      <![CDATA[
        'sku'      => $result['sku'],
      ]]>
    </add>
  </operation>
</file>
 
</modification>

Данный пример модификатора меняет файл category.php.
Он находит кусок строчки кода «$result[‘name’],» и сразу за ним добавляет «‘sku’      => $result[‘sku’],«.

В одном xml файле может быть любое количество секций <file> и возможность менять любое количество файлов одним модификатором.

Теги модификатора OCMOD и их функциональность

Тег — File

Указывает, в каком файле или файлах нужно внести изменения. Обязательный атрибут path содержит путь до изменяемого файла. Может указывать на один файл или на несколько. Для указания нескольких файлов, расположенных в разных папках, используется символ «|«. Например, внести изменения в category.php, manufacturer.php, search.php и в special.php .

<file path="catalog/controller/product/category.php|catalog/controller/extension/module/special.php">

Для сокращения кода можно использовать фигурные скобки, которые позволяют указать несколько значений через запятую: Например, внести изменения сразу в четыре файла category.php, manufacturer.php, search.php и в special.php. при этом суфикс .php можно вынести за фигурные скобки.

.

<file path="catalog/controller/product/{category,manufacturer,search,special}.php">

Так же можно использовать символы «*» и «?«, чтобы указать путь по «маске». Бывает полезно для модификации файлов шаблонов.

<file path="catalog/view/theme/*/template/product/category.twig">

Т.к. мы не знаем заранее, какие именно темы установлены в OpenCart, мы указали «*» после «theme«, тогда будут модифицироваться все category.twig во всех шаблонах, находящихся в папке «theme«.

Тег — Operation

Указывает начало секции производимой модификации. Внутри file секций <operation> может быть несколько. Т.е мы можем делать сразу несколько изменений в одном файле. Тег operation может иметь необязательный атрибут error, который может принимать значения:

  • skip — в случае ошибки пропустить текущую секцию <operation> и перейти к следующей <operation>
  • log (по умолчанию) — в случае ошибки пропустить всю секцию <file> и перейти к следующему <file>
  • abort — в случае ошибки прервать все модификации в xml файле

Например, найти в файле category.twig код «<div class=»caption»>»  и если его нет, тогда пропустить и перейти к следующей операции и найти «<p class=»price»>«.

<file path="catalog/view/theme/*/template/product/category.twig">
  <operation error="skip">
    <search><![CDATA[<div class="caption">]]></search>
    <add position="after"><![CDATA[
       <span class="sku">{{ product.sku}}</span>
    ]]></add>
  </operation>
  <operation error="skip">
    <search><![CDATA[<p class="price">]]></search>
    <add position="before"><![CDATA[
       <span class="sku">{{ product.sku}}</span>
    ]]></add>
  </operation>
</file>

Если не указать атрибут error=»skip», тогда на первом поиске текста «<div class=»caption»>» вся секция <file> будет прервана и проигнорирована.

Тег — Search

Указывает, какой текст необходимо найти в текущей операции. Содержит несколько правил использования тега:

  • Тег search может быть использован только 1 раз внутри секции operation.
  • Поиск можно делать только 1 строки целиком или части строки (нельзя искать несколько строк одновременно).
  • Искомый текст необходимо размещать строго между <![CDATA[ и ]]>.
  • Пробелы и переносы строки до искомого текста и после искомого текста игнорируются, текст можно написать или сразу после CDATA или с новой строки после CDATA, если только не указан атрибут trim=»false».
  • Изменения применятся ко всем найденным в файле строчкам кода или их частям, если не указан атрибут index .

Специальные теги <![CDATA[ и ]]> — используются в xml файлах для указания любых символьных данных, что означает, что между ними может находиться любой текст, содержащий скобки, значки больше, меньше и прочие, в том числе html и php код.

Тег search содержит следующие атрибуты, которые используются для наиболее точного определения места внесения изменения:

  • index — указывает, в каком по порядку найденном тексте внести изменения. Т.е. если в файле искомый текст встречается несколько раз, тогда index позволяет указать номер найденного по порядку текста (0 всегда первый найденный текст, 1 — второй и т.д.) Можно также указать несколько номеров через запятую.
  • trim — указывает игнорировать (true) или нет (false) пробелы и переносы строк до и после искомого текста.
  • regex — если установлено значении true, значит искомый текст представляет собой регулярное выражение для поиска.

Пример: поиск атрибутом index среди схожих строчек кода.

<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'       => 'new_menu',
        'icon'     => 'fa-menu',
        'name'     => 'New Menu',
        'href'     => 'new-menu/'
      );
    ]]></add>
  </operation>
</file>

В примере по index найдена первая строчка кода «$data[‘menus’][] = array(» и перед ней добавляем свой код.

Тег — Add

Тег add содержит текст, который будет заменён или добавлен до или после искомого текста.

Так же, как и тег search, тег add должен содержать <![CDATA[ и ]]>, между которыми вставляется текст кода, который будет добавлен или на который будет заменён искомый текст.

Тег add имеет свои атрибуты:

  • position — может принимать значения:

    • replace (по умолчанию) — замена найденного текста
    • before — добавить текст перед найденным текстом
    • after — добавить текст после найденного текста
  • offset — означает смещение относительно найденного текста на указанное количество строк. Если position=»before», тогда смещение будет вверх от найденного текста, если position=»after» или position=»replace», тогда смещение будет вниз от найденного текста.
  • trim — указывает игнорировать (true) или нет (false) пробелы и переносы строк до и после искомого текста.

Пример: Добавим ссылку «Link» в футер на фронтальной части.

<file path="catalog/view/theme/default/template/common/footer.twig">
  <operation>
    <search index="1" trim="true"><![CDATA[
      <ul class="list-unstyled">
    ]]></search>
    <add position="after" offset="1" trim="true"><![CDATA[
      <li><a href="#">Link</a></li>
    ]]></add>
  </operation>
</file>

Атрибут index=»1″ находит 2-й по порядку код <ul class=»list-unstyled»>, затем используя атрибут offset=»1″ на одну строку ниже найденного текста добавляет код <li><a href=»#»>Link</a></li>.

Модификатор OCMOD позволяет в OpenCart расширить возможности, не затрагивая оригинальные файлы, а для возврата в исходное состояние вам просто будет достаточно удалить его.

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and
privacy statement. We’ll occasionally send you account related emails.

Already on GitHub?
Sign in
to your account


Closed

AlexDWZ opened this issue

May 2, 2015

· 3 comments


Closed

OCMOD <operation error=»skip»> ABORTING

#2972

AlexDWZ opened this issue

May 2, 2015

· 3 comments

Comments

@AlexDWZ

Hi!
I have problem with OCMOD modifications — if used < operation error=»skip» > and into < search > some code < /search > not found — all code after (until < /file >) are IGNORED

for fix — in file admincontrollerextensionmodification.php

find code:
// Skip current operation
if ($error == ‘skip’) {
break;
}

and replace:
// Skip current operation
if ($error == ‘skip’) {
// break;
$log[] = ‘SKIP!’;
}

@AlexDWZ

UPD: tested with Opencart 2.0.2.0 and 2.0.1.1

@danielkerr

its does not need a «$log[] = ‘SKIP!’;» in there because you might use a wild card on the files in which case every file that is accessed would log a skip!

also the current way is correct! you want to skip the operation if the code is not found, not continue it!

@AlexDWZ

Maybe skip this if not found, and continue code after, but not abort all code (another < operations >) after (until< /file >) ?
(as it is done in VQMOD — I normally use < skip > in VQMOD for compatibility between different Opencart versions)

PS: sorry for my English, is not my native language

2 participants

@danielkerr

@AlexDWZ

С версии opencart 2 в поставке CMS уже встроена система модификации файлов OCMOD. Она пришла на замену VQMOD и имеет некоторые отличия как в принципах формирования файлов xml так и в установке файлов модификаций. Очень большим плюсов OCMOD является тот, что он уже встроен в opencart и не нуждается в дополнительной установке.

Структура папок модуля для OCMOD

Весь модуль должен быть упакаван в zip архів и иметь название xxx.ocmod.zip где ххх – любое слово латиницей.

Внутренняя структура архива:

  • папка

    upload

     - обязательная папка в которой находяться файлі модуля с подпапками
    • папка admin - папка с файлами модуля
    • папка catalog - папка с файлами модуля
    • и так далее - другие папки
  • файл

    instal.xml

     - файл с изменениями которые нужно внести в файлы ядра opencart
  • файл

    instal.php

     - php файл с функциями которые надо выполнить во время установки модуля
  • файл

    instal.sql

     - sql файл с командами insert, update или delete которые надо выполнить во время установки модуля

Подробнее о структуре файла instal.xml

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

   Просмотреть все созданные файлы можно в папке system/storage/modification в данной папке повторяется полная структура папок ядра где размещается модифицированый файл.

Поговорим о самой структуре файла.

Пример файла:

[php]<?xml version=”1.0″ encoding=”utf-8″?>
<modification>
<name>Modification Default</name>
<version>1.0</version>
<author>OpenCart Ltd</author>
<link>http://www.opencart.com</link>
<file path=”catalog/controller/common/home.php”>
<operation>
<search><![CDATA[
$data[‘column_left’] = $this->load->controller(‘common/column_left’);
]]></search>
<add position=”replace”><![CDATA[
test123
]]></add>
</operation>
</file>
</modification>[/php]

Атрибуты:

“name”

- название модификатора должно быть уникалное в разрезе всех установленных модификаторов. Обязательно к заполнению.

“version”

- версия вашего модификатора/модуля. Не обязательно но желательно к заполнению.

“author”

 - автор модуля/модификатора.Не обязательно но желательно к заполнению.

“link”

 - линк на любой сайт. Можете указать свой сайт ии оставить пустым.

Теги:

file

- в данном теге прописывается путь и название файла в который мы будем вносить изменения.

[php]<file path=”catalog/controller/common/home.php”>[/php]

изменения будут вноситься в файл

home.php который находится в папке catalog/controller/common

[php]<file path=”catalog/controller/{common,product}/home.php”>[/php]

поиск файла home.php будет происходить уже в двух папках в 

catalog/controller/common и

catalog/controller/product.
То есть можно укозать несколько папок для поиска файла. Для єтого нужно просто указать все папки между двух "{}" через запятую.
Если указать путь к файлу так:

[php]<file path=”catalog/controller/*/home.php”>[/php]

То поиск файла home.php будет происходить во всех подпапках папки controller.

Так же есть возможность задать несколько файлов в которые мы хотим внести изменения.

Для нескольких файлов :

[php]<file path=”catalog/controller/common/{home,header}*.php”>[/php]

Для всех файлов с разширением .php директории “common":

[php]<file path=”catalog/controller/common/*.php”>[/php]

operation

 - тег в котором заключено описание что именно искать и что делать с найденным элементом. 
Для каждлго задания данный тег открывается и закрывается отдельно.
В теге может быть указан атрибут:
  • error = "skip" - (работает только начина с версии opencart - 2.3) позволят пропускать задачу при возникновении ошибки, без прерывания выполнения всех задач.

[php]<operation error = “skip”> … </operation>[/php]

“search” – 

в данном теге указываем элемент поиска. То, что нужно найти в файле/файлах указаных в теге

file

.
 В теги serch можно указывать несколько атрибутов:
  • trim="(true|false)" - удалять пробелы в указаном искомом тексте
  • regex="(true|false)" - используется только когда поиск текста происходит через регулярное выражение
  • index="(number)" - указывает к какому по очереди искомому тексту применять изменения описанные в теге "add"(о нем ниже).  Тоесть если указаный код выглядит так:

[php]<search index=”2″><![CDATA[$data[‘column_left’]]]></search>[/php]

то, если в указаном файле, код – “$data[‘column_left’]” встречается несколько раз, то изменения будут применены только ко второму по счету
совпавшему кексту.

 "add" -

в данном теге указывается текст который надо вставить в искомый файл.
Место куда именно внужно вставить указывается атрибутами:
  • trim="(true|false)" - перед вставкой уода будут удалены все ненужные пробелы. (не обязателен)
  • position="(Replace|Before|After)" - обязателен атрибут.
    • replace - заменить найденый текст (который указаный в теге "search") на текст который указан в теге "add"
    • before - вставить  текст с теге "add" над котом указаный в теге "search"
    • after - вставить  текст с теге "add" под котом указаный в теге "search"
  • offset="(число)" - атрибут указывает сколько строчек отступить от кода указаного в теге "search" и только потом вставить новый код. Если тег "add" будет иметь атрибут position="before" и offset="5"

    [php]<add position=”before” trim=”true” offset=”5″>[/php]

    . То будет найдена искомая строка, потом от нее будет отсчитано 5 строк вверх и после пятой строки встится новый код. Обратите внимание если указать

    [php]<add position=”replace ” trim=”true” offset=”5″>[/php]

    , то система найдет искомый код отступить от него в низ 5 строчек и заменить сам искомый текст и эти 5 строк на новый код.

Все тексты которые мы ищим и те которые хотим вставить должны  заключаться в специальные теги в  начале  “<![CDATA[” и закрываться в конце “]]>". Пример:

[php]
<search><![CDATA[ искомый текст  ]]></search>
<add position="replace"><![CDATA[ добавляемый текст ]]></add>[/php]

И так, давайте теперь разберем код который  я наводил в начале статьи:
[php]

<?xml version=”1.0″ encoding=”utf-8″?>
<modification>
<name>Modification Default</name>
<version>1.0</version>
<author>OpenCart Ltd</author>
<link>http://www.opencart.com</link>
<file path=”catalog/controller/common/home.php”>
<operation>
<search><![CDATA[
$data[‘column_left’] = $this->load->controller(‘common/column_left’);
]]></search>
<add position=”replace”><![CDATA[
test123
]]></add>
</operation>
</file>
</modification>
[/php]

Что он делает?

Ответ:

  1. ищем файл catalog/controller/common/home.php
  2. в данном файле ищем строку
    $data['column_left'] = $this->load->controller('common/column_left');
  3.  найденную строку замеяем на ” test123″

Спасибо всем за внимание. Надеюсь я хоть чуточку улучшил вам понимание в даном моде и в том как с ним работать.

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Operation error log
  • Operation could not be completed error 0x00000709
  • Operating unit communication error
  • Operating system not found на ноутбуке что делать acer как исправить
  • Operating system error code 1326

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии