Как создать модуль в opencart (ocstore) 3, 2 или 1,5
- Подробности
- Категория: ocShop (Opencart.pro)
- Просмотров: 707
Всегда хочется создать что-то свое...итак начнем...
Как создать модуль в opencart (ocstore) 3, 2 или 1,5
Начинаем разбираться... сперва напишем модуль для версии 3
1. Модуль состоит из бэк (админка) и фронт (видна всем на сайте) части. То есть, надо сделать 2 части - облегчение в том, что они располагаются в идентичных местах.
2. Opencart разработан по принципу MVCL, то есть:
- M - это модель (model - такая же и папка будет)
- V - это вид (называют представление) (view - такая же и папка будет)
- С - это контроллер (controller - такая же и папка будет)
-
- L - это как доп момент - это языки (language - такая же и папка будет)
3. Ранее в качестве отображения были файлы tpl, но в поздних версия opencart начал применяться twig
4. Заранее нужно понимать какие файлы будем создавать и где, их всего 8 - по 4 на бэк и фронт часть
!!! Обратите внимание в opencart 1.5 - нет папки extension в каталоге и в админке ложат тоже в папку module
- 1 - admin/controller/extension/module /имя_файла_модуля.php - Контроллер административной (back) части
- 2 - catalog/controller/extension/module/имя_файла_модуля.php - Контроллер пользовательской (front) части
3 - admin/model/extension/module /имя_файла_модуля.php - модель админ (back) части
4 - catalog/model/extension/module/имя_файла_модуля.php - модель пользовательской (front) части
- 5 - admin/view/extension/module /имя_файла_модуля.twig - Вид (представление) админ (back) части
- 6 - catalog/view/extension/module/имя_файла_модуля.twig - Вид (представление) пользовательской (front) части
ну и языковые файлы:
7 - admin/language/ru-ru/extension/module /имя_файла_модуля.php - Контроллер админ (back) части
8 - catalog/language/ru-ru/extension/module/имя_файла_модуля.php - Контроллер пользовательской (front) части
вместо ru-ru(русский язык) могут быть английский (en-gb) и другие - это такие называемая мультиязычность.
Вкратце можно описать так: у меня есть контроллер(controller) он берет данные из базы данных через модель(model) и представляет их зрителю через Вид (view) / и помимо всего прочего перед выводом обращается к языковым файлам и берет оттуда перевод - все теперь вы знаете, что происходит в opencart.
Вы должны понимать, что может быть всего лишь контроллер и использовать стандартные функции и не задействовать отдельные модели и виды, но в целом стандартный вид описан выше.
Давайте напишем модуль для примера в opencart 3
Для примера модуль будет называться mymodule, то есть файлы будут вида mymodule.php и mymodule.twig
1 файл - админ контроллер
Расположение:
admin/controller/extension/module /mymodule.php - Контроллер административной (back) части
class ControllerExtensionModuleMymodule extends Controller {
private $error = array(); // для отлова ошибок
// сперва пишется index общая функция - базовая страница модуля описывается и подгружается в ней все, что нужно
public function index() {
// Загружаем модель модуля - она нам далее понадобиться, поэтому загружаем ее сверху
$this->load->model('extension/module/mymodule'); // в 1,5 будет так $this->load->model('module/mymodule');
// Сохранение настроек модуля, когда пользователь нажал "Записать" - то есть нажата кнопка и данные нужно сохранить
if (($this->request->server['REQUEST_METHOD'] == 'POST')) {
// Вызываем метод "модели" для сохранения настроек
$this->model_extension_module_mymodule->SaveSettings();
// Выходим из настроек с выводом сообщения - служебные сообщения пишутся через сессии, если не писать их, то не понятно будет что происходит в системе
$this->session->data['success'] = 'Настройки сохранены';
$this->response->redirect($this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=module', true));
}
// Загружаем настройки через метод "модели". На самом деле интересно тут все загружается: создается массив data и в него все, что нужно грузится и потом через него все отображается, чтобы не было нагрузки на базу данных - довольно хитрый способ!
$data = array();
$data['module_mymodule_status'] = $this->model_extension_module_mymodule->LoadSettings();
// Загружаем языковой файл - обратите внимание на способ загрузки
$data += $this->load->language('extension/module/mymodule');
// Загружаем "хлебные крошки" - это отдельная функция, которая будет описана ниже, опять же она добавляется к нашей переменной data, которая является массивом.
$data += $this->GetBreadCrumbs();
// Кнопки действий - нам надо описать все кнопки, которые будут в админке модуля и как они будут реагировать, то есть куда будет вести ссылка
$data['action'] = $this->url->link('extension/module/example', 'user_token=' . $this->session->data['user_token'], true);
$data['cancel'] = $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=module', true);
// Загрузка шаблонов для шапки, колонки слева и футера - это тоже все мы описываем в функции index (в ней сейчас находимся)
$data['header'] = $this->load->controller('common/header');
$data['column_left'] = $this->load->controller('common/column_left');
$data['footer'] = $this->load->controller('common/footer');
// Выводим в браузер шаблон - и в последний момент делаем это
$this->response->setOutput($this->load->view('extension/module/example', $data));
}
// Хлебные крошки - в данном случае создается отдельная функция под пагинацию
private function GetBreadCrumbs() {
$data = array(); $data['breadcrumbs'] = array(); // опять создаются служебные массивы и потом их заполняем
$data['breadcrumbs'][] = array(
'text' => $this->language->get('text_home'),
'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true)
);
$data['breadcrumbs'][] = array(
'text' => $this->language->get('text_extension'),
'href' => $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=module', true)
);
$data['breadcrumbs'][] = array(
'text' => $this->language->get('heading_title'),
'href' => $this->url->link('extension/module/example', 'user_token=' . $this->session->data['user_token'], true)
);
return $data;
}
}
Далее 2ой файл в админке это модель
admin/model/extension/module /mymodule.php - то есть тут функции для работы с бд
<?php
class ModelExtensionModuleExample extends Model {
// Запись настроек в базу данных
public function SaveSettings() {
$this->load->model('setting/setting');
$this->model_setting_setting->editSetting('module_example', $this->request->post);
}
// Загрузка настроек из базы данных
public function LoadSettings() {
return $this->config->get('module_example_status');
}
}
Далее 3-ий файл в админке это вид или представление
admin/view/template/extension/module /mymodule.twig - данный файл отвечает за отображение модуля в админке
{{ header }}{{ column_left }}
<div id="content">
<div class="page-header">
<div class="container-fluid">
<!-- Выводим кнопки управления -->
<div class="pull-right">
<button type="submit" form="form-module" data-toggle="tooltip" title="{{ button_save }}" class="btn btn-primary"><i class="fa fa-save"></i></button>
<a href="/{{ cancel }}" data-toggle="tooltip" title="{{ button_cancel }}" class="btn btn-default"><i class="fa fa-reply"></i></a>
</div>
<!-- Выводим название модуля -->
<h1>{{ heading_title }}</h1>
<!-- Выводим хлебные крошки -->
<ul class="breadcrumb">
{% for breadcrumb in breadcrumbs %}
<li><a href="/{{ breadcrumb.href }}">{{ breadcrumb.text }}</a></li>
{% endfor %}
</ul>
</div>
</div>
<div class="container-fluid">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title"><i class="fa fa-pencil"></i> {{ text_edit }}</h3>
</div>
<div class="panel-body">
<form action="{{ action }}" method="post" enctype="multipart/form-data" id="form-module" class="form-horizontal">
<!-- Настройка: "Статус" -->
<div class="form-group">
<label class="col-sm-2 control-label" for="input-status">{{ entry_status }}</label>
<div class="col-sm-10">
<select name="module_example_status" id="input-status" class="form-control">
{% if module_mymodule_status %}
<option value="1" selected="selected">{{ text_enabled }}</option>
<option value="0">{{ text_disabled }}</option>
{% else %}
<option value="1">{{ text_enabled }}</option>
<option value="0" selected="selected">{{ text_disabled }}</option>
{% endif %}
</select>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
{{ footer }}
Далее 4-ый дополнительный в админке это языковый файл
admin/language/ru-ru/extension/module /mymodule.php - сюда добавляем перевод
<?php
$_['heading_title'] = 'Мой первый модуль';
$_['text_extension'] = 'Расширения';
$_['text_success'] = 'Настройки успешно изменены!';
$_['text_edit'] = 'Настройки модуля';
$_['entry_status'] = 'Статус';
$_['text_enabled'] = 'Включено';
$_['text_disabled'] = 'Выключено';
---
Далее идет по структуре практически такой же, но уже клиентская часть - фронтэнд
5 файл - клиент контроллер
Расположение:
catalog/controller/extension/module /mymodule.php - Контроллер клиентской (front) части
<?php
class ControllerExtensionModuleMymodule extends Controller {
public function index() {
// Загружаем "модель" - контроллер управляет моделью и обработанные данные посылает на вид (модель будет ниже)
$this->load->model('extension/module/mymodule');
$data = array(); // опять тот же прием - инициализация массива для временного хранения полученных данных
// Загружаем настройки (для проверки включен модуль или нет)
$data['module_mymodule_status'] = $this->model_extension_module_mymodule->LoadSettings();
// Загружаем языковой файл - 4-ая составляющая системы MVCL
$data += $this->load->language('extension/module/mymodule');
// Хлебные крошки
$data['breadcrumbs'][] = array(
'text' => $this->language->get('text_home'),
'href' => $this->url->link('common/home')
);
$data['breadcrumbs'][] = array(
'text' => $data['heading_title'],
'href' => $this->url->link('extension/module/example')
);
// Загружаем остальное - это левые и правые сайдбары, верхние и нижние части вида представления
$data['column_left'] = $this->load->controller('common/column_left');
$data['column_right'] = $this->load->controller('common/column_right');
$data['content_top'] = $this->load->controller('common/content_top');
$data['content_bottom'] = $this->load->controller('common/content_bottom');
$data['footer'] = $this->load->controller('common/footer');
$data['header'] = $this->load->controller('common/header');
// Выводим на экран - передаем в вид полученный массив data
$this->response->setOutput($this->load->view('extension/module/mymodule', $data));
}
}
Далее 2ой файл в "клиенте" это модель (по нашей нумерации 6 файл)
catalog/model/extension/module /mymodule.php - то есть тут функции для работы с бд
<?php
class ModelExtensionModuleMymodule extends Model {
// Загрузка настроек из базы данных
public function LoadSettings() {
return $this->config->get('module_mymodule_status');
}
}
Далее 3-ий файл во фронтэнде это вид или представление (7 файл в целом)
catalog/view/template/extension/module /mymodule.twig - данный файл отвечает за отображение модуля в админке
{{ header }}
<div id="information-information" class="container">
<ul class="breadcrumb">
{% for breadcrumb in breadcrumbs %}
<li><a href="/{{ breadcrumb.href }}">{{ breadcrumb.text }}</a></li>
{% endfor %}
</ul>
<div class="row">{{ column_left }}
{% if column_left and column_right %}
{% set class = 'col-sm-6' %}
{% elseif column_left or column_right %}
{% set class = 'col-sm-9' %}
{% else %}
{% set class = 'col-sm-12' %}
{% endif %}
<div id="content" class="{{ class }}">
{{ content_top }}
<!-- Выводим соответствующий текст, если модуль включен или выключен -->
{% if module_mymodule_status %}
<h1>{{ text_example }}</h1>
{% else %}
{{ text_error }}
{% endif %}
{{ content_bottom }}
</div>
{{ column_right }}
</div>
{{ footer }}
Ну и завершающий стришок - это 4-ый дополнительный в клиенткой части - это языковый файл
catalog/language/ru-ru/extension/module /mymodule.php - сюда добавляем перевод
<?php
$_['heading_title'] = 'Пример модуля';
$_['text_example'] = 'Пример модуля на OpenCart 3.x';
$_['text_error'] = 'Модуль выключен';
На примере, данного просто модуля для опенкарт, можно начать делать свои...
---
Есть разные подходы:
1. пример создания модуля для Menu
продолжение на форуме у нас - создание модуля меню для opencart 3
https://saitsozdanie.ru/forum/index.php?topic=9570.0
---
А тут разбор модуля для opencart 1.5
Также нужно знать, что такое VQMod