Как создать модуль в opencart

Всегда хочется создать что-то свое...итак начнем...

 

Как создать модуль в opencart (ocstore)

Начинаем разбираться...

1. Модуль состоит из бэк (админка) и фронт (видна всем на сайте) части. То есть, надо сделать 2 части - облегчение в том, что они располагаются в идентичных местах.

2. Opencart разработан по принципу MVCL, то есть:

  • M - это модель  (model - такая же и папка будет)
  • V - это вид (называют представление) (view - такая же и папка будет)
  • С - это контроллер (controller - такая же и папка будет)
    • L - это как доп момент - это языки (language - такая же и папка будет)

 

3. Ранее в качестве отображения были файлы tpl, но в поздних версия opencart начал применяться twig

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

admin/controller/extension/module /имя_файла_модуля.php - Контроллер административной (back) части
catalog/controller/extension/module/имя_файла_модуля.php - Контроллер пользовательской (front) части

admin/model/extension/module /имя_файла_модуля.php - модель админ (back) части
catalog/model/extension/module/имя_файла_модуля.php - модель пользовательской (front) части

admin/view/extension/module /имя_файла_модуля.twig - Вид (представление) админ (back) части
catalog/view/extension/module/имя_файла_модуля.twig - Вид (представление) пользовательской (front) части

ну и языковые файлы:

admin/language/ru-ru/extension/module /имя_файла_модуля.php - Контроллер админ (back) части
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 {

    // сперва пишется index общая функция - базовая страница модуля описывается и подгружается в ней все, что нужно
    public function index() { 

        // Загружаем модель модуля - она нам далее понадобиться, поэтому загружаем ее сверху
        $this->load->model('extension/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

Добавить комментарий


Защитный код
Обновить

Вы здесь: Сайтостроение CMS ocShop (Opencart.pro) Как создать модуль в opencart