Лекция
Привет, Вы узнаете о том , что такое создание модуля opencart, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое создание модуля opencart, opencart , настоятельно рекомендую прочитать все из категории Системы управления контентом CMS.
Для OpenCart версий 2.х есть другая статья.
Для того что бы создать модуль, нам необходимо как минимум 6 файлов. Пускай наш новый модуль будет иметь название «myModul» и для его работы нам понадобятся следующие файлы:
1 |
catalog\view\theme\default\template\module\myModul.tpl |
1 |
catalog\controller\module\myModul.php |
1 |
catalog\language\russian\module\myModul.php |
1 |
admin\view\template\module\myModul.tpl |
1 |
admin\controller\module\myModul.php |
1 |
admin\language\russian\module\myModul.php |
Создавать мы их будем в порядке нумерации.
Создадим catalog\view\theme\default\template\module\myModul.tpl, и наполним его следующим содержимым:
1 2 3 4 5 6 |
код модуля
|
Это базовая структура модулей для CMS OpenCart, вы можете написать любую свою.
Если оставить данный код без изменений, то наш модуль будет выглядеть так:
Аналогично, создаем catalog\controller\module\myModul.php и наполняем его следующим минимум:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class ControllerModuleMyModul extends Controller { protected function index() {
if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/module/myModul.tpl')) { $this->template = $this->config->get('config_template') . '/template/module/myModul.tpl'; } else { $this->template = 'default/template/module/myModul.tpl'; } $this->render(); } } ?> |
Заметьте название класса «ControllerModuleMyModul» это строка «ControllerModule» плюс «имя модуля с большой буквы». В контроллере мы как минимум должны, указать какой файл представления будет отвечать за вывод информации. Но данный контроллер не функционален, это всего лишь заготовка. Функционалом он будет заполняться в зависимости от потребностей модуля.
Как пример, в нем вы можете подключать модель:
1 |
$this->load->model('директория_с_моделью/имя_модели'); |
и далее вызывать ее методы.
Также можно подключать языковой файл:
1 |
$this->language->load('module/имя_языкового_файла'); |
и объявлять переменные:
1 |
$this->data['имя_переменной'] = $this->language->get('имя_переменной_из_яз_файла'); |
Данная переменная будет видна в шаблоне myModul.tpl.
Создаем catalog\language\russian\module\myModul.php и наполняем его следующим содержимым:
1 2 3 |
$_['имя_переменной'] = 'значение переменной'; ?> |
Мы можем работать с данной переменной, только в том случае если в контроллере объявим:
1 |
$this->language->load('module/myModul'); |
обращаться к ней следует так
1 |
$this->language->get('имя_переменной'); |
Вообщем наполняем языковой файл переменными, которые будут хранить текстовую информацию, необходимую для нашего модуля. Это может быть строка «Заголовок», например:
Создаем admin\view\template\module\myModul.tpl и наполняем его следующим содержимым:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
|
Данный код был взят из файла представления для модуля «Информация» (admin\view\template\module\information.tpl), я заменил только «information» на «myModul».
Данный код отображает следующие возможности в админпанели по настройки модуля:
Файл представления для админпанели, вы можете наполнить своим содержимым. Об этом говорит сайт https://intellect.icu . Я представил этот пример только из-за того, что он хорошо предоставляет минимальные настройки для модуля (т.е. выбор схемы и положения модуля).
Создаем admin\controller\module\myModul.php и наполняем его содержимым контроллера модуля которого мы брали в качестве образца.
Например, наполним его содержимым контроллера модуля «Информация» (controller\module\information.php).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
class ControllerModuleMyModul extends Controller { private $error = array();
public function index() { $this->load->language('module/myModul'); $this->document->setTitle($this->language->get('heading_title')); $this->load->model('setting/setting');
if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) { $this->model_setting_setting->editSetting('myModul', $this->request->post);
$this->session->data['success'] = $this->language->get('text_success');
$this->redirect($this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL')); }
$this->data['heading_title'] = $this->language->get('heading_title');
$this->data['text_enabled'] = $this->language->get('text_enabled'); $this->data['text_disabled'] = $this->language->get('text_disabled'); $this->data['text_content_top'] = $this->language->get('text_content_top'); $this->data['text_content_bottom'] = $this->language->get('text_content_bottom'); $this->data['text_column_left'] = $this->language->get('text_column_left'); $this->data['text_column_right'] = $this->language->get('text_column_right');
$this->data['entry_layout'] = $this->language->get('entry_layout'); $this->data['entry_position'] = $this->language->get('entry_position'); $this->data['entry_status'] = $this->language->get('entry_status'); $this->data['entry_sort_order'] = $this->language->get('entry_sort_order');
$this->data['button_save'] = $this->language->get('button_save'); $this->data['button_cancel'] = $this->language->get('button_cancel'); $this->data['button_add_module'] = $this->language->get('button_add_module'); $this->data['button_remove'] = $this->language->get('button_remove');
if (isset($this->error['warning'])) { $this->data['error_warning'] = $this->error['warning']; } else { $this->data['error_warning'] = ''; }
$this->data['breadcrumbs'] = array();
$this->data['breadcrumbs'][] = array( 'text' => $this->language->get('text_home'), 'href' => $this->url->link('common/home', 'token=' . $this->session->data['token'], 'SSL'), 'separator' => false );
$this->data['breadcrumbs'][] = array( 'text' => $this->language->get('text_module'), 'href' => $this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL'), 'separator' => ' :: ' );
$this->data['breadcrumbs'][] = array( 'text' => $this->language->get('heading_title'), 'href' => $this->url->link('module/myModul', 'token=' . $this->session->data['token'], 'SSL'), 'separator' => ' :: ' );
$this->data['action'] = $this->url->link('module/myModul', 'token=' . $this->session->data['token'], 'SSL');
$this->data['cancel'] = $this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL');
$this->data['modules'] = array();
if (isset($this->request->post['myModul_module'])) { $this->data['modules'] = $this->request->post['myModul_module']; } elseif ($this->config->get('myModul_module')) { $this->data['modules'] = $this->config->get('myModul_module'); } $this->load->model('design/layout');
$this->data['layouts'] = $this->model_design_layout->getLayouts();
$this->template = 'module/myModul.tpl'; $this->children = array( 'common/header', 'common/footer' ); $this->response->setOutput($this->render()); }
private function validate() { if (!$this->user->hasPermission('modify', 'module/myModul')) { $this->error['warning'] = $this->language->get('error_permission'); }
if (!$this->error) { return true; } else { return false; } } } ?> |
Единственное что я здесь изменил по отношению к оригинальному файлу, так это то, что произвел замену в имени класса с «ControllerModuleInformation» на «ControllerModuleMyModul» и все упоминания слова «information» заменил на «myModul».
Каков ваш контроллер, будет зависеть от предоставляемого функционала настроек, который предлагает ваш файл представления для админпанели (т.е. «admin\view\template\module\myModul.tpl»).
Создаем admin\language\russian\module\myModul.php, наполняем его:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// Heading $_['heading_title'] = 'myModul';
// Text $_['text_module'] = 'Модули'; $_['text_success'] = 'Настройки модуля обновлены!'; $_['text_content_top'] = 'Верх страницы'; $_['text_content_bottom'] = 'Низ страницы'; $_['text_column_left'] = 'Левая колонка'; $_['text_column_right'] = 'Правая колонка';
// Entry $_['entry_layout'] = 'Схема:'; $_['entry_position'] = 'Расположение:'; $_['entry_status'] = 'Статус:'; $_['entry_sort_order'] = 'Порядок сортировки:';
// Error $_['error_permission'] = 'У Вас нет прав для управления этим модулем!'; ?> |
Содержимое данного файла, я опять таки взял из образца для модуля «Информация». Тут главное определиться с содержимым переменных, который использует ваш файл представления для админпанели (admin\view\template\module\myModul.tpl).
Теперь если вы зайдете в Дополнения->Модули вы обнаружите модуль «myModul», с ним можно работать как с любым другим модулем, его можно установливать/удалять, определять положение на странице и т.п.
Добавлено позже
Со временем у меня возник вопрос :
— А как добавить в настройках моего модуля свои параметры?
Например я хочу что-бы в настройках модуля был «мой параметр»
И он был виден в tpl файле модуля.
Сначала я рассмотрю механизм работы настроек для модуля в OpenCart, а далее рассмотрим по шагам как добавить свой параметр
Сначала, рассмотрим каков механизм работы
Когда в настройках модуля вы нажимаете на «SAVE” или “Сохранить”, вы тем самым посылаете POSTзапрос в контролер модуля в админки (т. е. в файл www\admin\controller\module\имя_модуля.php). Он принимает его и записывает в БД, а точнее в таблицу «префикс_setting«. Где в отведенной строке для вашего модуля будут сохранены настройки в виде «ключа: значения«.
Поподробнее..
В tpl шаблоне админинки модуля (т. е. в файле www\admin\view\template\module\filterattr.tpl) все настройки которые вы вводите, это значения тегов input, select и т. п., которые находятся в форме:
1 |
|
При нажатие на «Сохранить», вы просто посылаете POST запрос на (адрес контроллера модуля в админке, т. е. на файл www\admin\controller\module\имя_модуля.php) с значениями из формы.
Тем самым контроллер модуля в админке принимает этот запрос с помощью функции editSetting(‘имя_модуля’, $this->request->post) модели setting/setting‘.
Кусок кода в контроллере модуля в админки отвечающий за прием POST запросов выглядит так
1 2 3 4 5 6 7 8 9 |
$this->load->model('setting/setting');
if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) { $this->model_setting_setting->editSetting('имя_модуля', $this->request->post);
$this->session->data['success'] = $this->language->get('text_success');
$this->redirect($this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL')); } |
Функция «editSetting» принимает параметры из формы и записывает в БД, в таблицу с именем префикс_setting в строку с столбцом group с именем модуля.
Например, для модуля «baner» в phpmyadmin строка с его параметрами будет выглядеть так
Параметры хранятся в столбце value данной строки, для модуля banner они следующие:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
a:1:{ i:0; a:7:{ s:9:"banner_id"; s:1:"6"; s:5:"width"; s:3:"200"; s:6:"height"; s:3:"182"; s:9:"layout_id"; s:1:"3"; s:8:"position"; s:11:"column_left"; s:6:"status"; s:1:"1"; s:10:"sort_order"; s:1:"3";} } |
Здесь приведен список параметров с значениями, хотя выглядит немного не логичным.
Сначала пишется параметр в кавычках, далее в кавычках его значение. Например параметр “width” имеем значение «200». Итак, где хранятся параметры и как они туда попадают разобрались.
Теперь разберемся как модуль их получает при выводе своего шаблона на страницу
В контроллере модуля (не админском контроллере модуля), т.е. в файле «www\catalog\controller\module\имя_файла.php» всегда присутствует функция
1 2 3 |
protected function index() { ... } |
Она вызывается когда к модулю происходит запрос, т. е. в любом том случае когда его надо вывести.
Когда нам нужно передать параметры из админки модуля в сам модуль, нам нужно указать в качестве аргумента данной функции переменную «$setting», т.е. должно быть:
1 2 3 |
protected function index($setting) { … } |
$setting это массив с ключами, например если вам нужно получить значение параметра “width”, вы обращаетесь к массиву так
$setting[‘width’]
1. Добавим в админский tpl шаблон (т. е. в файл www\admin\view\template\module\имя_модуля.tpl) нашего модуля в тело формы
» method=»post» enctype=»multipart/form-data» id=»form»>
следующий тэг:
1 2 3 |
|
|
Где «имямодуля_module [param1]» обязательный формат, здесь “param1” — имя параметра.
value – значение параметра по умолчанию (можно оставить пустым)
Что бы не поехала шапка таблицы настроек в админке, можете добавить столбец в первый
Например такой
1 |
|
Мой параметр |
Теперь в админка модуля будет выглядеть так
Внизу tpl шаблона, есть JavaScript функция function addModule(), добавьте данную в код, это нужно для того что-бы пользователь мог добавить новый модуль на другие страницы (схемы в терминологии OpenCart).
2. В админском контроллере модуля (т. е. в файле www\admin\controller\module\имя_модуля.php) нужно обязательно добавить следующий код
1 2 3 4 5 6 7 |
$this->load->model('setting/setting');
if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) { $this->model_setting_setting->editSetting('имя_модуля', $this->request->post); $this->session->data['success'] = $this->language->get('text_success'); $this->redirect($this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL')); } |
Он означает что POST запросы для данного модуля нужно обрабатывать и заносить в БД.
Данный код скорее всего уже есть в контроллере вашего модуля, поэтому идем дальше.
3. В контролере модуля (т. е. в файле www\catalog\controller\module\имя_модуля.php)
Добавить аргумент $setting в функцию
1 2 3 |
protected function index() { ... } |
Т.е. должно стать так
1 2 3 |
protected function index($setting) { ... } |
Далее, в любом месте контроллера добавить
1 |
$this->data['param1'] = $setting["param1"]; |
Это позволит, шаблону tpl данного модуля использовать данный параметр, виден он будет под именем «param1».
4. Теперь в tpl шаблоне модуля (т. е. в файле www\catalog\view\theme\default\template\module\filterattr.tpl) мы можем использовать данный параметр как нам нужно, например выведем его значение:
1 |
Результат будет:
1 |
123 |
Анализ данных, представленных в статье про создание модуля opencart, подтверждает эффективность применения современных технологий для обеспечения инновационного развития и улучшения качества жизни в различных сферах. Надеюсь, что теперь ты понял что такое создание модуля opencart, opencart и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Системы управления контентом CMS
Комментарии
Оставить комментарий
Системы управления контентом CMS
Термины: Системы управления контентом CMS