Создание модификатора для Opencart 1.5

В системе управления Opencart существуют так называемые модификаторы, которые позволяют внедрять свой php код в уже готовые скрипты движка. Благодаря модификатору, можно заменить любую строку кода в php скрипте, тем самым не повредив файл. то есть в любой момент можно удалить XML модфикатор, если например допустили ошибку, и ваш сайт будет снова работать, в отличие от ручной правки созданных файлов Opencart.
Что нужно для его создания?
1. Создать XML файл, например my_mod.xml
2. Добавить в файл необходимые тэги, содержащие Версию, автора,а так же название модификатора
3. Для opencart 1.5 и ниже загрузить xml файл в папку /vqmod/xml
И так по порядку.
В созданный файл my_mod.xml добавляем следующие строки
<?xml version="1.0" encoding="UTF-8"?> <modification> <name>Новое поле в настройках</name> <code>my_mod</code> <version>1.0</version> <author>Иванов Алексей</author> <link>https://ivacms.ru</link> </modification>
name — название модификатора
code — кириллическое имя модификатора без расширения *xml
version — версия вашего модификатора
author — автор модификатора
link — ссылка на сайт автора
Это основные параметры которые требуются для работы модификатора, но этого не достаточно ведь нам необходимо что-то сделать. Я решил добавить дополнительную опцию в настройки магазина, после опции «Время работы».
В первую очередь нам необходимо создать новое поле в шаблоне, который будет находится вот тут /admin/view/template/setting/setting.tpl. Путь нам известен, теперь нужно в наш модификатор добавить несколько строчек, которые добавят html код после данной опции.
В системе модификатора существует несколько параметров:
- replace — замена строки
- after — вставка после кода
- before — вставка перед кодом
Нам нужно добавить несколько строчек, поэтому используем параметр after, но куда именно их добавлять и как? Для это необходимо открыть файл setting.tpl, и найти HTML код с опцией Время работы. Вот он:
Соответственно в параметрах модификатора мы укажем, что нужно добавить наш код именно после этих строк. Чтобы быть точнее, я взял лишь кусок HTML кода после которого нужно добавить новый код.
Какой код добавить в xml файл?
<file name="admin/view/template/setting/setting.tpl"> <operation> <search position="after"> <![CDATA[<td><input type="text" name="config_time" value="<?php echo $config_time; ?>" size="40"/></td>]]> </search> <add><![CDATA[ <tr><td>Новая настройка</td><td><input type="text" name="config_new" value="<?php if(isset($config_new))echo $config_new; ?>" size="40"/></td></tr> ]]> </add> </operation> </file>
Что к чему?
<file name=»admin/view/template/setting/setting.tpl»> — указываем путь до файла в котором будет проходить поиск.
<search position=»after»> — говорит о том, что нам необходимо найти строку, и добавить новый код после неё.
<![CDATA[ ]]> — Между 2 и 3 фигурной скобкой добавляется поисковый код, а так же новый html или php код.
<input type=»text» name=»config_new» — Обратите внимание, что имя нового поля должно быть уникальным, в данном случае это config_new
В итоге получится следующий код:
<?xml version="1.0" encoding="UTF-8"?> <modification> <name>Новое поле в настройках</name> <code>my_mod</code> <version>1.0</version> <author>Иванов Алексей</author> <link>https://ivacms.ru</link> <file name="admin/view/template/setting/setting.tpl"> <operation> <search position="after"> <![CDATA[<td><input type="text" name="config_time" value="<?php echo $config_time; ?>" size="40"/></td>]]> </search> <add> <![CDATA[ <tr><td>Новая настрока</td><td><input type="text" name="config_new" value="<?php if(isset($config_new))echo $config_new; ?>" size="40"/></td></tr> ]]></add> </operation> </file> </modification>
Обратите внимание, что HTML код в файле модификатора должен полностью соответствовать HTML коду в файле settings.tpl, иначе скрипт не будет работать. Так же текстовому полю нужно добавить новое имя, в данном случае «config_new».
Вот оно новое поле с настройкой:
Но этого не достаточно, ведь нам нужно чтобы скрипт вывел данные сохранённые в бд в новое input поле, а для этого служит уже другой файл admin/controller/setting/setting.php. В этом файле есть строки, которые проверяют поле «Время работы», и заносит его в переменную.
После этих строк нам нужно добавить точно такой же код, только с названием нашего поле «config_new».
if (isset($this->request->post['config_new'])) { $this->data['config_new'] = $this->request->post['config_new']; } else { $this->data['config_new'] = $this->config->get('config_new'); }
Но, чтобы в модификаторе не указывать все эти строки я решил добавить код перед строчкой:
if (isset($this->request->post['config_title'])) {
Данная строчка кода расположена чуть ниже в файле setting.php
Данный код добавляем в модификатор, но вместо параметра position=»after», добавляем position=»before»
<?xml version="1.0" encoding="UTF-8"?> <modification> <name>Новое поле в настройках</name> <code>my_mod</code> <version>1.0</version> <author>Иванов Алексей</author> <link>https://ivacms.ru</link> <file name="admin/view/template/setting/setting.tpl"> <operation> <search position="after"><![CDATA[ <td><input type="text" name="config_time" value="<?php echo $config_time; ?>" size="40"/></td> ]]></search> <add><![CDATA[ <tr> <td>Новая настрока</td> <td><input type="text" name="config_new" value="<?php if(isset($config_new))echo $config_new; ?>" size="40"/></td> </tr> ]]></add> </operation> </file> <file name="admin/controller/setting/setting.php"> <operation> <search position="before"><![CDATA[ if (isset($this->request->post['config_title'])) { ]]></search> <add><![CDATA[ if (isset($this->request->post['config_new'])) { $this->data['config_new'] = $this->request->post['config_new']; } else { $this->data['config_new'] = $this->config->get('config_new'); } ]]></add> </operation> </file> </modification>
Если файл загружен на сервер, то новое поле будет отображаться в общих настройках сайта, и конечно сохраняться.
Если данную опцию нужно где-то показать в шаблоне, используется простая конструкция:
<?php echo $this->config->get('config_new');?>
Так же шаблон можно исправить и с помощью модификатора, для этого нужно знать что именно нужно редактировать. Предположим нам нужно изменить TITLE интернет магазина на тот , что расположен в новом поле. В Файле catalog/view/theme/default/template/common/header.tpl есть строка <title><?php echo $title; ?></title>, вот её нам и надо заменить. Для этого добавляем ещё один код в наш модификатор:
<file name="catalog/view/theme/*/template/common/header.tpl"> <operation> <search position="replace"> <![CDATA[<title><?php echo $title; ?></title>]]> </search> <add> <![CDATA[<title><?php echo $this->config->get('config_new'); ?></title>]]> </add> </operation> </file>
Обратите внимание, что в пути до файла с шаблоном вместо DEFAULT я установил * — которая говорит о том, что изменения касаются всех шаблонов.
Если что-то пошло ни так, перестала открываться админка, или не работает сайт, значит в модификаторе допущена ошибка. Его можно либо удалить, либо искать ошибку самостоятельно.