OpenCart: руководство разработчика

OpenCart представляет собой отличную платформу для разработчиков, желающих понять, PHP, web-фреймворк в целом. Это один из самых простых способов изучить MVC фремворк. OpenCart позволяет узнать MVC framework, давая вам доступ к знакомы инструментам, такие как, PHP, mySQL и HTML-технологий, на которых она построена. Это руководство предполагает наличия у Вас базовых знания HTML, CSS, Javascript, PHP (в том числе классов и объектов), и mySQL, так как Мы будем описывать, каким образом они используются в OpenCart.

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

Введение в MVC(L)

OpenCart основан на шаблоне проектирования Модель-Отображение-Контроллер (Model-View-Controller). MVC — это шаблон (паттерн), который позволяет разделить логику от отображения. Это позволяет файлам с отображением содержать минимальное количество скриптов.

M — Model (Модель)
Модель предоставляет возможность взаимодействовать непосредственно с базой данных, получая данные и преобразуется его в формат, который подходит для вашего интерфейса. Как правило, модель состоит в основном из запросов к базе данных. Если вы привыкли писать запросы MySQL, Вам понравится OpenCart т.к он не использует ORM, позволяя Вам писать прямые запросы к базе данных.

V — View (Отображение)
View — отвечает за отображение информации (визуализацию). Идея Model и Controller это максимально отделить логику и сделать шаблоны проще, т.е по возможности в View должно быть минимум логики. Для того чтобы изменить дизайн магазина, вы просто измените представление, а M, C и L, останется такими же. Файлы представлений View в OpenCart имеют .tpl расширение

С — Controller (Контроллер)
Это то место, где обеспечивается связь между представлением и моделью или любыми другими ресурсами. Полученные данные от пользователя обрабатываются в контроллере и выводит результат в представление View

L — Language (Язык)
OpenCart расширяет MVC до MVCL, предоставляя простой способ разделения языковой информации для интернационализации. Вы можете использовать языковые файлы для хранения любого текста, такие как заголовки, текст кнопок и другое. Поэтому, для того чтобы перевести Ваш магазин на другой язык, Вам необходимо изменить текст в соответствующем языковом файле.

Разработка модулей OpenCart. Введение

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

Базовая структура модуля состоит из двух частей, это catalog и admin. В папке admin располагается функционал управления модулем, отображение его в панели администратора, а так же его установка и удаление. А в папке catalog, находятся файлы, отвечающие за функционал модуля и его отображение на витрине магазина.

Модуль в панели администратора

Если посмотреть на предыдущий рисунок, можно увидеть основные директории в папке admin, а именно controller | view | language

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

Давайте рассмотрим каждую из папок.

Controller

Тут располагается наш первый файл, контроллер интерфейса. Opencart автоматически подключает модули, просматривая директорию admin/controller/module Поэтому нет никакой необходимости где то что то добавлять или изменять файлы.

Любой модуль, расположенный в данной директории, будет автоматически подключен и показан в панели администратора в разделе Модули

В контроллере мы можем загрузить языковые файлы, библиотеки и другие ресурсы.
Подробнее о загрузки ресурсов, можно прочитать в разделе Загрузка файлов.
А так же, вам доступны функции установки и удаления модуля.
Подробнее можно прочитать в разделе Установка и Удаление модуля.

Доступ через URL
Controller (контроллер) это простой файл с классом, названный так, чтобы ассоциироваться с URL по которому он будет вызван.

В панели администратора URL выглядит следующим образом
пример: /admin/index.php?route=module/google_hangouts&token
При обращении к модулю, добавляется токен для безопасности сессии (данное правило с токеном, действительно только для модулей в панели администратора).

Откройте файл контроллера admincontrollermodulegoogle_hangouts.php

Рассмотрим пример URL: /admin/index.php?route=module/google_hangouts&token

Когда имя контроллера будет найдено в сегменте URL — он будет загружен.

Первым что загрузится, это функция index(). Функция «index» всегда будет загружаться по умолчанию, если вторая часть в URL не определена.

Вторая часть адреса определяет, какая функция контроллера должна быть вызвана.
Например, для URL /admin/index.php?route=module/google_hangouts/validate&token

будет вызвана функция validate.

Продолжим. Кратко пройдемся по коду.

В результате вызова функции index, контроллер загрузит языковые файлы и его переменные

$this->load->language('module/google_hangouts');
$this->document->setTitle($this->language->get('heading_title'));

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

$this->load->model('setting/setting');

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

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

Производится заполнение массива $data для передачи в «Отображение»
Массив заполняется текстовыми данными, которые мы получили из языкового файла, а так же заполняется другими данными необходимые для работы модуля и его отображения.

А в конце производим рендеринг данных $data для передачи в отображение view

$this->response->setOutput($this->load->view('module/google_hangouts.tpl', $data));

Viev
View (отображение) отвечает за вывод данных, то есть шаблон, формирующий html код.
Сам файл шаблона находится в admin/view/template/module и файл имеет расширение tpl

В нашем случае, формируется форма для заполнения пользователем настроек модуля.

Если откроете файл adminviewtemplatemodulegoogle_hangouts.tpl то можно быстро понять его структуру, увидеть знакомые переменные, для которых мы подготавливали данные в контроллере.

Language
Language (язык) – представляет собой файл, в котором можно задавать некие языковые переменные для разных языков. В нашем случае таких языков два, и соответственно папок и файлов тоже 2
adminlanguageenglishmodulegoogle_hangouts.php

adminlanguagerussianmodulegoogle_hangouts.php

При ненадобности, данные файлы можно не создавать.

Model
Model (модель)содержит в себе функционал по работе с базой данных.
Файлы находятся в adminmodel

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

Модуль в Витрине магазина OpenCart

Интерфейс витрины модуля для отображения в витрине магазина, построен по принципу того же шаблона, что и интерфейс панели администратора, описанный выше, т.е MVCL. Модуль так же может получить доступ к любым model файлам, которые уже существуют в OpenCart, а так же вам не нужно создавать новые запросы базы данных, если они уже существуют. Например, модель catalog/product содержит много полезных запросов для выборки товаров. Использование существующих функций, предпочтительнее, чем писать то, что уже написано.

Отличительной особенностью структуры папок для модулей витрины, является расположение файла шаблона модуля. Он находится по пути catalog/view/theme/default/template/module

Это дает нам возможность, создавать свой шаблон отображения модуля для каждой темы интернет магазина.

Стоит отметить, что в модуле витрины, Вам будут предоставлен доступ к параметрам модуля, как через объект контроллера, так и через переменную $settings, которая передается в модуль, при помощи функции index($settings) контроллера. А также у Вас есть возможность контролировать отображение модуля, основываясь на параметры настройки.

Установка и удаление модуля OpenCart

Рекомендуется, чтобы разработчики модулей, включали в создаваемый модуль функции «установки и удаления» в файле controller. В OpenCart существуют стандартные функции, которые будут вызваны при установки или удалении. Это
public function install() и public function uninstall()

Установка
Пример:

public function install() {
$this->load->model('setting/extension');
$this->model_setting_extension->install('total', $this->request->get['extension']);
}

Удаление
Пример:

public function uninstall() {
$this->load->model('setting/extension');
$this->model_setting_extension->uninstall('total', $this->request->get['extension']);
$this->load->model('setting/setting');
$this->model_setting_setting->deleteSetting($this->request->get['extension']);
}

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

Загрузка файлов в контроллер

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

Рассмотрим каждый в отдельности.

Загрузка языковых файлов.

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

Ниже пример загрузки языкового файла и назначение.

$this->load->language('module/google_hangouts');
$this->document->setTitle($this->language->get('heading_title'));
$data['entry_code'] = $this->language->get('entry_code');

Если открыть языковый файл, например по пути, adminlanguageenglishmodulegoogle_hangouts.php

Мы увидим, что мы получили доступ к любому тексту через $this->language->get

А при рендеринге, каждый элемент массива $data будет доступен в виде переменой.

Пример $data[‘entry_code’] будет доступен в шаблоне tpl как $entry_code

Загрузка модели

Загрузка моделей в контролер, помогут вам использовать уже готовые встроенные функции OpenCart.

Разберем небольшой пример загрузки модели.

$this->load->model('setting/setting');

Код выше позволит нам загрузит методы класса, что обеспечит доступ к методам в пределах класса ModelSettingSetting файлаmodel контроллера.

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

Пример:

$this->model_setting_setting->editSetting('google_hangouts', $this->request->post);

Загрузка файла шаблона

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

$this->load->view('module/google_hangouts.tpl')

Загрузка файлов библиотек

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

Чтобы получить доступ к определенным функциям библиотек, используйте следующий синтаксис

$this->[тут имя файла библиотеки]->function()

Например, установка заголовка документа

$this->document->setTitle($this->language->get('heading_title'));

Введение в ocmod

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

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

OCMOD основан на кодах Qphoria’s VQMOD.

Установка и структура

Установка OCMOD файлов производится через панель управления в разделе Модули — Установка расширений.
Для установки расширения, достаточно загрузить файл .ocmod.zip или .ocmod.xml
Например: name_modificator.ocmod.zip или name_modificator.ocmod.xml

1. Загрузка модификатора через Меню — Модули — Установка расширений . Данный метод установки записывает код модификатора в базу данных, так же модификаторы видны в списке модификаторов. А если в архиве есть файлы sql и php то данные файлы выполнятся.

2. Возможно просто скопировать файл модификатора ocmod.xml в папку system . Данный метод не записывает код в базу, а использует его напрямую. Удобен тем, что можно код редактировать дальше не делая повторных загрузок.

Пример структуры OCMOD сжатого файла

— upload
— install.sql
— install.php
— install.xml

upload
Директория в которой расположены файлы (например библиотека или модуль).

install.sql
Файл sql запроса для выполнения запроса к базе данных ;

install.php
Содержит PHP код который необходимо выполнить при устаовке расширения .

install.xml
XML файл модификатор.

Документация по XML модификатору

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

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

<?xml version="1.0" encoding="utf-8"?>
  <modification>
  <name>Modification Default</name>
  <code>modification_id</code>
  <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>


Описание тегов

File Файл или файлы для изменений

Система модификатора использует PHP функцию glob для поиска файлов
http://hk1.php.net/manual/ru/function.glob.php

Пример:
Путь к файлу.

<file path="catalog/controller/common/home.php">

Если необходимо произвести изменения в нескольких файлах или в файлах «по маске», используйте следующий пример:

<file path="system/engine/action.php,system/engine/loader.php,system/library/config.php,system/library/*.php">

Operation Действия над файлом / файлами

Атрибуты:

  • error=»(skip|abort)» — пропустить при ошибке | прервать работу модификатора

Search Поиск кода

Атрибуты:

  • trim=»(true|false)» — удалить пробелы
  • regex=»(true|false)» — использовать регулярное выражение
  • index=»(число)» — выбор определенной найденной позиции по числу

Пример:

<?xml version="1.0" encoding="utf-8"?>
<modification>
  <name>Modification Default</name>
  <code>modification_id</code>
  <version>1.0</version>
  <author>OpenCart Ltd</author>
  <link>http://www.opencart.com</link>

      <file path="catalog/controller/common/home.php">
          <operation>
              <search trim="true|false" offset="1" limit="2"><![CDATA[
                  $data['column_left'] = $this->load->controller('common/column_left');
              ]]></search>
              <add position="replace"><![CDATA[
                  test123
              ]]></add>
          </operation>
      </file>

</modification>

Add Добавить или заменить.

Атрибуты:

  • position=»(Replace|Before|After)» — Заменить | Вставить до | Вставить после
  • trim=»(true|false)» — удалить пробелы
  • offset=»(число)» — перейти на указанное кол-во строк (можно использовать отрицательное значение)

(внимание, атрибут position не может быть использован если применяется поиск с регулярным выражением).

Пример

<?xml version="1.0" encoding="utf-8"?>
<modification>
  <name>Modification Default</name>
  <code>modification_id</code>
  <version>1.0</version>
  <author>OpenCart Ltd</author>
  <link>http://www.opencart.com</link>

  <file path="catalog/controller/common/home.php">
      <operation>
          <search trim="true|false" offset="1" limit="2"><![CDATA[
              $data['column_left'] = $this->load->controller('common/column_left');
          ]]></search>
          <add position="Replace|Before|After"><![CDATA[
              test123
          ]]></add>
      </operation>
  </file>

</modification>

Regex — регулярное выражение

Атрибуты:

  • limit=»(число)» — ограничение кол-во найденных одинаковых значений

Пример:

<?xml version="1.0" encoding="utf-8"?>
<modification>
  <name>Regex Example</name>
  <code>modification_id</code>
  <version>1.0</version>
  <author>OpenCart Ltd</author>
  <link>http://www.opencart.com</link>

  <file path="system/{engine,library}/{action,loader,config,language}*.php">
      <operation>
          <search regex="true" limit="3"><![CDATA[
              ~(require|include)(_once)?(([^)]+)~
          ]]></search>
          <add><![CDATA[
              $1$2(modification($3)
          ]]></add>
      </operation>
  </file>

</modification>

Когда вы используете regex вы не можете использовать атрибут position, trim or offset . Атрибут limit доступен для использования.
В примере ниже можно увидеть как в третьей найденой позиции меняется ‘foo’ на ‘bar’:

lorem ifoopsum foo lor foor ipsum foo dolor foo
^1 ^2 ^3 ^4 ^5
Выражение:
s/(.{-}zsfoo){3}/bar/
Результат:
lorem ifoopsum foo lor barr ipsum foo dolor foo
^1 ^2 ^3=bar ^4 ^5

Больше информации по регулярным выражением в PHP вы можете узнать по ссылке ниже:
http://hk2.php.net/manual/ru/function.preg-replace.php
Информацию по регулярным выражением можно получить по ссылке ниже:
http://www.regular-expressions.info

По материалам в общедоступных источниках