Создаем модуль в OpenCart 2.х (OCMOD)

module_ocmod

Для понимания сути, немного предисловия…

 

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

Раньше установка модулей в OpenCart до версии 2.х происходила простым копированием директорий с файлами модуля в CMS. Желательно, чтобы файлы модуля не заменяли уже существующие файлы системы.

Я описывал ранее, как создавать модули для OpenCart до версии 2.х. Если в вкратце, то задача заключалась в создание 6-и файлов:

  1. файл представления модуля: catalog\view\theme\default\template\module\myModul.tpl
  2. контроллер модуля: catalog\controller\module\myModul.php
  3. языковой файл: catalog\language\russian\module\myModul.php
  4. файл представления модуля для панели администратора: admin\view\template\module\myModul.tpl
  5. контроллер модуля для панели администратора: admin\controller\module\myModul.php
  6. языковой файл модуля для панели администратора: admin\language\russian\module\myModul.php

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

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

Этот момент в OpenCart 2.х был продуман, как результат, была разработана система установки модулей OCMOD, модули стали называть расширениями.

 

 

Итак, как создавать модули (расширения) для OpenCart 2.x?

 

Итак, расширение в OpenCart 2.х это PHP, SQL и XML файлы в zip архиве, с именем имя_модуля.ocmod.zip.

Расширение состоит из:

  • upload (директория)
  • install.sql (файл)
  • install.php (файл)
  • install.xml (файл)

 

upload
Директория в которой расположены файлы, они будут загружены в корень директории OpenCart

install.sql
Файл sql запроса, который будет выполнен при установке расширения

install.php
PHP скрипт, который выполниться при установке расширения

install.xml
XML файл модификатор (что это такое, об этом позже)

 

Теперь важный момент! Наличие полного набора вышеуказанных файлов в расширение не обязательно, т.е. не обязательно иметь PHP, SQL и XML файлы в модуле. Рассмотрим два крайних варианта, из чего может состоять расширение:

  1. Расширение может состоять только из директории upload в архиве. В этом случае, расширение представляет собой «класический» модуль в OpenCart до версий 2.х, т.е. просто файлы, который скопируются в корень системы.
  2. Расширение может состоять из одного файла install.xml. В этом случае, файл должен иметь имя имя_модуля.ocmod.xml, загружается он в панель управления в «чистом» виде, не в архиве.

 

 

Вариант №1 — расширение состоит только из директории upload

 

Внутри директории, мы создадим 6 файлов как в статье «создаем модуль в OpenCart», но с поправками для OpenCart 2.х.

 

1. Языковой файл: catalog\language\russian\module\mymodul.php

В данном файле, мы описываем переменные с данными (обычно текстом), которые будем использовать в нашем модуле.

 

2. Контроллер: catalog\controller\module\mymodul.php

Первое, на что стоит обратить внимание, на имя класса «ControllerModulemymodul», первая часть «ControllerModule» стандартная, вторая «mymodul» это имя вашего модуля. В каждом файле нужно придерживаться одного имени.

В контроллере, с помощью массива $data[‘имя’] объявляют переменные, которые будут видны в файле представления модуля. Как правило, это данные (текст) полученные из языкового файла или данные полученные из моделей.

Если мы хотим получить данные из языкового файла, сначала, его необходимо подключить с помощью метода

Где

  • «директория» это имя директории, где находится языковой файл (обычно лежат в catalog/language/russian и в catalog/language/english)
  • «файл» это имя языкового файла без «.php»

 

Также в контролере модуля, можно сразу задать какие либо данные, используя

Но это не рекомендуется, т.к. данные желательно хранить в БД или в языковых файлах, а не в контроллерах.

 

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

Где

  • «директория» это имя директории где находится модель (модели располагаются в директории catalog/model)
  • «модель» это имя модели, по сути это имя файла модели без «.php».

 

Далее, можно использовать методы подключенной модели

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

В примере, метод getProduct возвращает массив данных с информацией по продукту, аргумент метода — id номер продукта. Под id 42, в свежем установленном OpenCart-е, должен быть монитор «Apple Cinema 30″».

 

3. Файл представления: модуля catalog\view\theme\default\template\module\mymodul.tpl

Эти минимальный вариант файла представления, я просто вывожу все переменные, которые я объявил в контроллере. В вашем случае, должен быть html код с php.

 

4. Языковой файл модуля для панели администратора: admin\language\russian\module\mymodul.php

Комментировать думаю нечего, данные текстовые данные будут видны в представление модуля для панели администратора.

 

5. Контроллер модуля для панели администратора: admin\controller\module\mymodul.php

В качестве донора я взял контроллер админки модуля категорииadmin\controller\module\category.php, единственное что я заменил:

Имя класса

на

 

Имя языкового файла

на

 

Имя модуля, в методе редактирования настроек модуля

на

 

Имя представления данного модуля для панели администратора

на

 

Имя модуля в определение переменной ‘action’

на

 

Имя параметра в приеме POST/GET сообщений

на

 

Имя модуля в методе validate()

на

 

Контроллер модуля для панели управления, это самая сложная часть. Он состоит из двух методов:

  • index()
  • validate()

 

Метод index() – принимает POST данные с файла представления модуля в админке (в настройках модуля), за это отвечает код до комментария «//ваши переменные», он обязателен для всех контроллеров.

После комментария «//ваши переменные», идет объявление переменных

  • $data[‘heading_title’],
  • $data[‘text_edit’],
  • $data[‘text_enabled’],
  • $data[‘text_disabled’],
  • $data[‘entry_status’]

Вы можете добавить свои переменные.

Текст берутся из языкового файла «module/mymodul», который был подключен ранее.

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

 

Далее, идет проверка разрешено-ли пользователю изменять настройки данного модуля (проверка есть ли переменная «warning»), если нет, формируем переменную $data[‘error_warning’] с текстом ошибки. Этот фрагмент кода обязателен.

После чего формируется массив «breadcrumbs», другими словами это «хлебные крошки» для файла представления.

 

 

mymodul_breadcrumbs

В конце метода index(), выбираем файл представления для вывода данных $data.

Метод index() вызывает метод validate(), он служит для проверки разрешено ли пользователю изменять настройки данного модуля, он обязателен.

 

6. Файл представления модуля для панели администратора: admin\view\template\module\mymodul.tpl

Донором был — модуль категории (admin\view\template\module\category.tpl), единственное что я сделал:

Заменил в теге <button>

на

 

Заменил в теге <form>

на

 

Заменил в теге <select>

на

 

Хочу обратить внимание, что связка контроллера модуля для админки (пункт 5) и представления модуля для админки (пункт 6) в данном случае, обеспечивают минимальную страницу настройки модуля. в данном случае будет выбор статуса «Включено» или «Отключено».

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

 

Поместим выше созданных 6-есть файлов в соответствующие директории (так, как бы они размещались в системе OpenCart), далее помещаем эти директории в директорию «upload», архивируем её в zip формат с именем с именем «mymodule.ocmod.zip»

 

Далее зайдем в панель администрирования, далее «Установка расширений», нажимаем загрузить и выбираем наш zip файл.

 

mymodul_setting

 

 

Система покажет нам, какие файлы будут загружены. Нажимаем «продолжить«.

Теперь, если перейти на вкладку «Модули», мы увидим наш модуль «Мой модуль».

 

mymodul_setting_2

 

 

За имя модуля в панели управления отвечает параметр $_[‘heading_title’]  языкового файла «admin\language\russian\module\mymodul.php»

 

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

 

mymodul_setting_3

Повторюсь, в модуле должна быть как минимум опция «статус», этим мы даем системе знать, использовать наш модуль или нет. При желание, можно дописать еще опции, но в этом случае, придется править файл представления.

и контроллер

Действовать также, по аналогии с другими модулями.

 

Далее нужно выбрать для какого макета (до версии 2.x это называлось «схемы») применить данный модуль. Переходим в «Макеты», выбираем в качестве примера макет главной страницы «Home» -> «Редактировать», нажимаем «Добавить», выбираем «Мой модуль», нажимаем «Сохранить».

 

mymodul_install

 

Теперь, если мы зайдем на главную страницу, то мы должны увидеть примерно следующие:

 

mymodul_work

На главной, в красной рамке я обвел, то-что вывел наш модуль. Модуль работает.
Скачать mymodule.ocmod.zip

 

Вариант №2 — расширение это файл «имя_модуля.ocmod.xml»

 

Файл «имя_модуля.ocmod.xml» называют «модификатор», согласно нему, происходит создание виртуальных копий файлов, которые требуют изменений. Примерно так написано в переводе на русский в официальной документации. Другими словами, в этом файле написано, что «на лету» нужно добавить или убрать в выбранных файлах, т.е. изменения будут виртуальными, файлы останутся без изменений.

Это решает проблему, которую я обозначил в начале статьи, что иногда, приходится править файлы системы и для отката назад, необходимо копировать оригинальные файлы обратно. В случае использования «модификаторов», для отката назад, мы просто отключаем его.

Файл «имя_модуля.ocmod.xml» имеет следующую структуру:

 

 

Теги name, code, version, author, link носят информационный характер, не буду на них акцентировать внимание.

Нам важен тег file и все его содержимое. Атрибут path указывает путь к изменяемому файлу, также есть возможность использовать маски и множественный выбор сразу несколько файлов (см. php функцию glob, модификаторы используют данную функцию). Тегов file может быть несколько.

Тег operation согласно документации не имеет атрибутов

Тег search, говорит, что нужно найти в вышеуказанном файле. Атрибут trim (true|false) указывает удалять ли пробелы, index – номер найденной позиции (например, по данному search найдутся три строки, так index это выбор с какой именно мы работаем). Атрибут regex (true|false) говорит, будут ли использоваться регулярные выражения при поиске.

В теле <![CDATA[ … ]]> мы указываем, что нам нужно найти, обычно это фрагмент кода.

Тег add говорит, что нужно сделать с найденной строкой, атрибут position описывает:

  • replace – заменить;
  • before – вставить до;
  • after – вставить после.

Атрибут trim указывает удалять ли пробелыoffset позволяет перейти на указанное количество строк относительно найденной строки. Значение может быть отрицательное.

В теле <![CDATA[ … ]]> мы прописываем на что мы хотим заменить найденную строку (или что хотим вставить до или после найденной строки).

 

Создадим пробный модификатор — файл mymodul2.ocmod.xml. Его задача очень простая, модуль «категории» выводит список категорий с количеством позиций в скобках.

 

category_before

 

Мы хотим, чтобы модуль больше не выводил количество позиций в категориях (т.е. без скобок). Для этого нужно, в контроллере модуля (catalog/controller/module/category.php) 58 строку:

заменить на

 

Файл «mymodul2.ocmod.xml» наполним следующим содержимым:

 

Для установки модификатора, как обычно заходим в «установка расширений», нажимаем «загрузить» и выбираем наш xml файл. Теперь наш модификатор установлен, если мы зайдем в «модификаторы», то в списке мы увидим наш модификатор с именем «Категории без количества».

 

modificator_list

 

Модификатор включен, но для его запуска, необходимо обновить кэш, для этого жмем кнопку «Обновить» (при каждом включение/выключение модификаторов необходимо обновлять кэш.).

 

Теперь модуль «категории» выводит список категорий без количества наименований.

 

category_after

 

Если нам нужно вернуть как было раньше, отключаем модификатор и жмем «Обновить».

 

Для отладки, думаю вам захочется посмотреть, как выглядит измененный файл. В директории system/storage/modification находятся директории с файлами, это результат работы модификаторов. Наш файл находится по адресу system/storage/modification/catalog/controller/module/category.php. Если мы в него заглянем, то на 58 строке увидим:

Т.е. модификатор сработал, так как мы задумывали.
Скачать mymodul2.ocmod.xml (пр.кн.мышки сохранить как)

 

Итог

 

Теперь, когда мы рассмотрели два крайних варианта модуля, не составит труда создавать «смешанные» модули, где есть папка upload и файл install.xml. Если вы хотите, чтобы ваш модуль использовал свои таблицы в БД или свои столбцы в уже созданных таблицах, то вы, можете обогатить его, с помощью файла install.sql. Он содержит SQL запрос, который выполнится при установке модуля.

 

Про install.php могу сказать, что он запускается при установке модуля, пример применения я привести не могу, т.к. не использовал его на практике.




Буду признателен если вы поделитесь данным постом

Комментарии
  1. Андрей пишет:

    В контроллере модуля для клиентской части в последней строке заменил:
    return $this->load->view(‘module/pricerange.tpl’, $data);
    вместо:
    return $this->load->view(‘default/template/module/pricerange.tpl’, $data);

    Т.е., убрал из пути к представлению «default/template/», а то с ним неверный путь к файлу получался:
    Notice: Error: Could not load template /home/www-data/009-site/public_html/opencart2/catalog/view/theme/default/template/default/template/module/pricerange.tpl! in /home/www-data/009-site/public_html/opencart2/system/library/template/basic.php on line 26

    P.S. OpenCart 2.2.0.0

  2. admin пишет:

    Спасибо за замечание Андрей!

    Андрей, ваш файл pricerange.tpl был в директории «default/template/» или он в вашей теме?

  3. Гость пишет:

    Вот есть install.sql, а есть ли какой-то remove.sql? Чтобы при удалении модуля удалялись и таблицы им созданные.

  4. admin пишет:

    Хм, на сайте документации OpenCart про данный момент ничего не сказано.
    Значит нет =)

    Думаю, хорошая идея написать им в техподдержку и предложить данный вариант.

  5. Иван пишет:

    Спасибо за подробную статью. Прочитал очень внимательно, изучил примеры кода. Все очень хорошо написано, но есть маленькая ошибочка. В коде контроллера админки admin\controller\module\mymodul.php при формировании массива хлебных крошек. Последний элемент выдаст ссылку на модуль категории, поскольку код $this->url->link(‘module/category’, ‘token=’ . $this->session->data[‘token’], ‘SSL’) вернет именно ссылку на категорию. Здесь, как я понимаю, нужно заменить ‘module/category’ на ‘module/mymodul’

  6. VarIzo пишет:

    Добрый день. А есть ли возможность с помощью xml изменить index.php лежащий в корне сайта? Нужно добавить новые строки по типу $aesctr = new Aesctr($registry); $registry->set(‘aesctr’, $aesctr); но что то никак.

  7. admin пишет:

    Добрый день Varlzo!

    Теоретически можно, но я не пробовал. Попробуйте, а потом скажите нам =)

  8. test пишет:

    Link на mymodule.ocmod.zip не работает

  9. admin пишет:

    Спасибо! Подправил.

  10. Виталий пишет:

    Спасибо)

  11. Михаил пишет:

    Добрый день. Помогите пожалуйста: создаю файл имя_модуля.ocmod.xml который должен добавить строку 514 background: #ccc; в stylesheet.css

    Каталог главная страница
    mymodule
    1.0
    OpenCart Ltd
    http://www.opencart.com

    но после всех действий по установке, подключению и обновлению на странице и в .css ничего не меняется.

    вот лог из админки:

    —————————————————————-
    MOD: Каталог главная страница

    FILE: catalog/view/theme/test/stylesheet/stylesheet.css
    CODE: .list-group a {
    LINE: 515
    —————————————————————-
    Может подскажете в чём дело?

  12. admin пишет:

    Добрый день Михаил.

    Хм, посмотрите файл в кэше vqmod, там должен появиться модернизированный stylesheet.css. Он там есть?

  13. Mega пишет:

    Как работать с база данных через код?

  14. admin пишет:

    Добрый день.

    Вам нужно написать свою модель (или дополнить любую другую), далее подключить эту модель в контроллере и выводить результата запроса к БД в файл представления (.tpl)
    В OpenCart запросы делают так:

    $this->db->query(» ваш SQL запрос «);

  15. awaro пишет:

    ocmod предназначен только для работы с html php и БД и всё

  16. Евгений пишет:

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

    Notice: Undefined variable: button_save in
    /home/user/html/opencart2.domenion.bz.ua/www/admin/view/template/extension/module/sale.tpl
    on line 6

    Код из страницы пришлось выдрать.
    В контроллере этой переменной нет. Откуда она должна появиться?
    Благодарю.

  17. admin пишет:

    Добрый день!

    Логично, что такая переменная должна быть, мне трудно сказать почему у вас данная ошибка.
    Попробуйте провести поиск по файлам с текстом data[‘button_save’], возможно данная переменная объявлена где то в другом месте.

    P.S. Поиск по файлам удобно производить в Notepad++



Ваш комментарий


Ответ в цифрах

 
© s-engineer.ru, 2012-2017 | Все права защищены