Пишем простой модуль для OpenСart

03-июл-2017, 17:19
WhitePerson
149
Сегодня мы расскажем, как написать простой модуль для Opencart.

Модуль будет состоять только из файлов отвечающих за вывод и работу модуля в админ-панели, без установщика и вывода в шаблон сайта.
Пишем простой модуль для OpenСart
Минимальный модуль должен состоять из:
1. Файла контроллера
2. Файла отображения
3. Файла модели (на самом деле можно и без него)
4. Языкового файла (на самом деле можно и без него)

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

Файлы модуля отвечающие за работу админ-части модуля находятся в директории “admin”, которая находится в корне сайта.

Создадим файлы:
admin/controller/module/test.php #файл контроллера
admin/model/module/test.php #файл модели
admin/language/russian/module/test.php #языковый файл
admin/view/template/module/test.tpl #файл отображения
В первую очередь заполним языковый файл следующим содержимым:
<?php
// Heading
$_['heading_title'] = 'Тестовый модуль';

// Text
$_['text_module'] = 'Модули';
$_['text_success'] = 'Настройки успешно изменены!';
$_['text_module_control'] = 'Управление модулем';
$_['text_label'] = 'Поле ввода текста';

// Entry
$_['entry_name'] = 'Название модуля';
$_['entry_title'] = 'Заголовок';
$_['entry_description'] = 'Текст';
$_['entry_status'] = 'Статус';

// Error
$_['error_permission'] = 'У Вас нет прав для управления данным модулем!';

?>
Как оговаривалось ранее, нам понадобится записывать данные в базу данных.
Это будет одно строковое поле, которое можно будет изменить в админ-панели, после чего сохранить.
Для этого нам понадобится написать несколько методов в модели:
1. Получения данной строки из БД
2. Запись данной строки в БД

Также, поскольку в данной статье мы не приводим примера написания установщика модуля, вносить данные о модуле будем также из модели, с помощью метода install()
Модель будет выглядеть так:
<?php
// файл: admin/model/module/test.php
class ModelModuleTest extends Model {

 public function install()
 {
 //Если таблица test_module не существует - создаем ее
 //В таблице 2 поля, id и test_text (которое и будет перезаписываться из админ-панели)
 $this->db->query("CREATE TABLE IF NOT EXISTS " . DB_PREFIX . "test_module (
 id INT NOT NULL,
 test_text VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
 PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci");
 //Запишем в таблицу данные, id = 1, строку test_text оставим пустой
 $this->db->query("INSERT INTO " . DB_PREFIX . "test_module (id, test_text) VALUES
 ('1', '')"
 );
 }

 public function set_test_text($text)
 {
 //Редактируем текстовое поле, подставляем вместо текущего значения - $text
 $this->db->query("UPDATE " . DB_PREFIX . "test_module SET test_text = '$text' WHERE id = '1'");
 }

 public function get_test_text()
 {
 //Делаем выборку из таблицы test_module
 $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "test_module");
 //Если в таблице существует test_text
 if (isset($query->row['test_text'])){
 //Возвращаем test_text
 return html_entity_decode($query->row['test_text'], ENT_QUOTES, 'UTF-8');
 }
 }
}

?>
Теперь, методы модели модуля мы будем обрабатывать в контроллере.
Заполним контроллер следующим содержимым:
<?php
// файл: admin/controller/module/test.php
 class ControllerModuleTest extends Controller
 {
 private $error = array();
 private $module_name = 'test';

 public function index(){
 // Подключаем языковый пакет: admin/language/russian/module/test.php
 $this->load->language('module/'. $this->module_name);

 $this->document->setTitle($this->language->get('heading_title'));
 $this->load->model('extension/module');
 $this->load->model('setting/setting');
 $this->load->model('module/'. $this->module_name);
 // Заполняем массив $data для дальнейшего использования переменных в файле шаблона админ-панели модуля
 // Значение переменных берем из языкового пакета, заполняем ими массив.
 $data['heading_title'] = $this->language->get('heading_title');
 $data['text_module_control'] = $this->language->get('text_module_control');
 // Получаем значение из базы данных, кладем в массив $data, для дальнейшей отправки в шаблон, в виде переменной test_text
 $data['text_label'] = $this->language->get('text_label');
 $data['text_enabled'] = $this->language->get('text_enabled');
 $data['text_disabled'] = $this->language->get('text_disabled');
 $data['entry_name'] = $this->language->get('entry_name');
 $data['entry_title'] = $this->language->get('entry_title');
 $data['entry_description'] = $this->language->get('entry_description');
 $data['entry_status'] = $this->language->get('entry_status');
 $data['button_save'] = $this->language->get('button_save');
 $data['button_cancel'] = $this->language->get('button_cancel');

 // Если используется метод POST, и если функция validete() вернула true
 if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()){
 // Выполняем инсталяцию
 // Как сообщалось ранее, так делается только в том случае, если у модуля нет установщика
 // На практике так не делайте, пишите установщик :)
 $this->model_module_test->install();

 // Если в POST запросе передается test_text
 if (isset($this->request->post['test_text'])){
 // Если test_text не равно текущему значению test_text в базе данных
 // Значение получаем с помощью метода модели get_test_text() модуля
 if ($this->request->post['test_text'] !== $this->model_module_test->get_test_text()){
 // То применяем изменения в базу данных с помощью метода модели set_test_text()
 // В качестве значения параметра передаем строку из POST-запроса, из формы, которая отправляется из файла шаблона модуля
 $this->model_module_test->set_test_text(trim($this->request->post['test_text']));
 }
 }
 }

 // Выводим новое значение в админ-панеле, в поле ввода
 $data['test_text'] = $this->model_module_test->get_test_text();

 // Добавляем проверки на ошибки
 if (isset($this->error['warning'])) {
 $data['error_warning'] = $this->error['warning'];
 } else {
 $data['error_warning'] = '';
 }

 if (isset($this->error['name'])) {
 $data['error_name'] = $this->error['name'];
 } else {
 $data['error_name'] = '';
 }

 // Добавляем хлебные крошки
 $data['breadcrumbs'] = array();
 $data['breadcrumbs'][] = array(
 'text' => $this->language->get('text_home'),
 'href' => $this->url->link('common/dashboard', 'token=' . $this->session->data['token'], 'SSL')
 );
 $data['breadcrumbs'][] = array(
 'text' => $this->language->get('text_module'),
 'href' => $this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL')
 );

 if (!isset($this->request->get['module_id'])) {
 $data['breadcrumbs'][] = array(
 'text' => $this->language->get('heading_title'),
 'href' => $this->url->link('module/'.$this->module_name, 'token=' . $this->session->data['token'], 'SSL')
 );
 } else {
 $data['breadcrumbs'][] = array(
 'text' => $this->language->get('heading_title'),
 'href' => $this->url->link('module/'.$this->module_name, 'token=' . $this->session->data['token'] . '&module_id=' . $this->request->get['module_id'], 'SSL')
 );
 }

 // Добавляем проверки информации по модулю, добавляем информацию в массив $data[] на основании проверок
 if (!isset($this->request->get['module_id'])) {
 $data['action'] = $this->url->link('module/'.$this->module_name, 'token=' . $this->session->data['token'], 'SSL');
 } else {
 $data['action'] = $this->url->link('module/'.$this->module_name, 'token=' . $this->session->data['token'] . '&module_id=' . $this->request->get['module_id'], 'SSL');
 }

 $data['cancel'] = $this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL');

 if (isset($this->request->get['module_id']) && ($this->request->server['REQUEST_METHOD'] != 'POST')) {
 $module_info = $this->model_extension_module->getModule($this->request->get['module_id']);
 }

 if (isset($this->request->post['name'])) {
 $data['name'] = $this->request->post['name'];
 } elseif (!empty($module_info)) {
 $data['name'] = $module_info['name'];
 } else {
 $data['name'] = '';
 }

 if (isset($this->request->post['module_description'])) {
 $data['module_description'] = $this->request->post['module_description'];
 } elseif (!empty($module_info)) {
 $data['module_description'] = $module_info['module_description'];
 } else {
 $data['module_description'] = array();
 }

 if (isset($this->request->post['status'])) {
 $data['status'] = $this->request->post['status'];
 } elseif (!empty($module_info)) {
 $data['status'] = $module_info['status'];
 } else {
 $data['status'] = '';
 }

 // Загружаем контроллеры админ-панели
 $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('module/'.$this->module_name.'.tpl', $data));
 }

 // Функция валидации
 private function validate() {
 if (!$this->user->hasPermission('modify', 'module/'.$this->module_name)) {
 $this->error['warning'] = $this->language->get('error_permission');
 }
 return !$this->error;
 }
 }

?>
Осталось заполнить файл отображения модуля:
<!-- файл: admin/view/template/module/test.tpl -->
<?php echo $header; ?><?php echo $column_left; ?>
<div id="content">

 <div class="page-header">
 <div class="container-fluid">
 <div class="pull-right">
 <!-- Привязываем кнопку save к нашей форме test_module_form -->
 <button type="submit" form="test_module_form" data-toggle="tooltip" title="<?php echo $button_save; ?>" class="btn btn-primary"><i class="fa fa-save"></i></button>
 <a href="<?php echo $cancel; ?>" data-toggle="tooltip" title="<?php echo $button_cancel; ?>" class="btn btn-default"><i class="fa fa-reply"></i></a></div>
 <h1><?php echo $heading_title; ?></h1>
 <ul class="breadcrumb">
 <?php foreach ($breadcrumbs as $breadcrumb) { ?>
 <li><a href="<?php echo $breadcrumb['href']; ?>"><?php echo $breadcrumb['text']; ?></a></li>
 <?php } ?>
 </ul>
 </div>
 </div>

 <div class="container-fluid">
 <?php if ($error_warning) { ?>
 <div class="alert alert-danger"><i class="fa fa-exclamation-circle"></i> <?php echo $error_warning; ?>
 <button type="button" class="close" data-dismiss="alert">&times;</button>
 </div>
 <?php } ?>
 <div class="panel panel-default">

 <div class="panel-heading">
 <h3 class="panel-title"><i class="fa fa-pencil"></i> <?php echo $text_module_control; ?></h3>
 </div>

 <div class="panel-body">
 <!-- Выводим все необходимые переменные переданные контроллером -->
 <form action="<?php echo $action; ?>" method="post" enctype="multipart/form-data" class="form-horizontal" id="test_module_form">
 <div class="form-group">
 <label class="col-sm-2 control-label" for="test_text"><?php echo $text_label; ?></label>
 <div class="col-sm-10">
 <input type="text" name="test_text" value="<?php echo $test_text; ?>" class="form-control">
 </div>
 </div>
 </form>

 </div>

 </div>
</div>
</div>
<?php echo $footer; ?>
Теперь можно активировать модуль в админ-панели, во вкладке модули.
Как помним из языкового пакета, модуль имеет название "Тестовый модуль".
Модуль для OpenCart, который имеет одно поле для ввода строки, для дальнейшего сохранения в базу данных данной строки.В конечном итоге, мы получили бесполезный модуль, который имеет одно поле для ввода строки, для дальнейшего сохранения в базу данных данной строки.

Скачать файлы по ссылке:
Скачать:
[ 6,09 Kb ] ( - 4 )

Оставить комментарий
Мы в социальных сетях: