Напишем простой модуль обратного звонка для Opencart 2.1, чтобы адаптировать данный модуль под другие 2.х версии Opencart потребуется внести лишь небольшие изменения. За основу возьмем версию 2.9 модуля упрощенного заказа для Opencart 2, но сделаем его проще (без записи в базу).
Скачать модуль «Opencart — Быстрый заказ v2.9» можно здесь:
- здесь на сайте
- на opencartforum.com
Этапы разработки:
- Административная часть модуля.
- Вывод кнопки обратного звонка в шапку (и не только).
- Обработка и отправка данных администратору магазина.
- Дополнения и украшательства.
Административная часть модуля
Общая структура папок административной части будет выглядеть так:
Административная часть модуля находится в папке admin и состоит из 3 папок:
- controller - содержит файлы контроллера
- language - содержит языковые файлы
- view - содержит файлы представления
Такая структура папок будет в случае если у Вас версия Opencart 2.0 или 2.1
В случае версии Opencart 2.2 и Opencart 2.3 языковые папки будут другими: для русского языка ru-ru, для английского en-gb, для украинского uk-ua
В случае версии Opencart 2.3 папка module будет содержаться в папке extension
Начинаем с контроллера:
Переименуем файл buyoneclick.php в xd_zvonok.php и выкинем из него всё что касается аналитики и отправки SMS. Останется такой код:
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 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 |
<?php class ControllerModuleBuyOneClick extends Controller { private $error = array(); public function index() { $this->load->language('module/buyoneclick'); $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('buyoneclick_', $this->request->post); $this->session->data['success'] = $this->language->get('text_success'); $this->response->redirect($this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL')); } // Heading $data['heading_title'] = $this->language->get('heading_title'); // Text $data['text_edit'] = $this->language->get('text_edit'); $data['text_enabled'] = $this->language->get('text_enabled'); $data['text_disabled'] = $this->language->get('text_disabled'); //Buttons $data['button_save'] = $this->language->get('button_save'); $data['button_cancel'] = $this->language->get('button_cancel'); // Fields $data['field1_title'] = $this->language->get('field1_title'); $data['field2_title'] = $this->language->get('field2_title'); $data['field3_title'] = $this->language->get('field3_title'); $data['field4_title'] = $this->language->get('field4_title'); $data['agree_title'] = $this->language->get('agree_title'); $data['field_required'] = $this->language->get('field_required'); // Phone validation $data['entry_validation_type'] = $this->language->get('entry_validation_type'); $data['value_validation_type1'] = $this->language->get('value_validation_type1'); $data['value_validation_type2'] = $this->language->get('value_validation_type2'); $data['text_validation_type1'] = $this->language->get('text_validation_type1'); $data['text_validation_type2'] = $this->language->get('text_validation_type2'); $data['entry_validation_status'] = $this->language->get('entry_validation_status'); // Entry $data['entry_name'] = $this->language->get('entry_name'); $data['entry_status'] = $this->language->get('entry_status'); $data['entry_status_category'] = $this->language->get('entry_status_category'); $data['entry_status_module'] = $this->language->get('entry_status_module'); $data['entry_style_status'] = $this->language->get('entry_style_status'); $data['entry_success_field'] = $this->language->get('entry_success_field'); $data['success_field_tooltip'] = htmlspecialchars($this->language->get('success_field_tooltip')); $this->load->model('catalog/information'); $data['informations'] = $this->model_catalog_information->getInformations(); 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') ); $data['breadcrumbs'][] = array( 'text' => $this->language->get('heading_title'), 'href' => $this->url->link('module/buyoneclick', 'token=' . $this->session->data['token'], 'SSL') ); $data['action'] = $this->url->link('module/buyoneclick', 'token=' . $this->session->data['token'], 'SSL'); $data['cancel'] = $this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL'); $this->load->model('localisation/language'); $data['languages'] = $this->model_localisation_language->getLanguages(); $languages = $this->model_localisation_language->getLanguages(); foreach ($languages as $language) { if (isset($this->request->post['buyoneclick_name_'.$language['language_id']])) { $data['buyoneclick_name_'.$language['language_id']] = $this->request->post['buyoneclick_name_'.$language['language_id']]; $data['buyoneclick_success_field_'.$language['language_id']] = $this->request->post['buyoneclick_success_field_'.$language['language_id']]; } else { $data['buyoneclick_name_'.$language['language_id']] = $this->config->get('buyoneclick_name_'.$language['language_id']); $data['buyoneclick_success_field_'.$language['language_id']] = $this->config->get('buyoneclick_success_field_'.$language['language_id']); } } /********************* Modal window fileds *********************/ if (isset($this->request->post['buyoneclick_field1_status'])) { $data['buyoneclick_field1_status'] = $this->request->post['buyoneclick_field1_status']; } else { $data['buyoneclick_field1_status'] = $this->config->get('buyoneclick_field1_status'); } if (isset($this->request->post['buyoneclick_field1_required'])) { $data['buyoneclick_field1_required'] = $this->request->post['buyoneclick_field1_required']; } else { $data['buyoneclick_field1_required'] = $this->config->get('buyoneclick_field1_required'); } if (isset($this->request->post['buyoneclick_field2_status'])) { $data['buyoneclick_field2_status'] = $this->request->post['buyoneclick_field2_status']; } else { $data['buyoneclick_field2_status'] = $this->config->get('buyoneclick_field2_status'); } if (isset($this->request->post['buyoneclick_field2_required'])) { $data['buyoneclick_field2_required'] = $this->request->post['buyoneclick_field2_required']; } else { $data['buyoneclick_field2_required'] = $this->config->get('buyoneclick_field2_required'); } if (isset($this->request->post['buyoneclick_field3_status'])) { $data['buyoneclick_field3_status'] = $this->request->post['buyoneclick_field3_status']; } else { $data['buyoneclick_field3_status'] = $this->config->get('buyoneclick_field3_status'); } if (isset($this->request->post['buyoneclick_field3_required'])) { $data['buyoneclick_field3_required'] = $this->request->post['buyoneclick_field3_required']; } else { $data['buyoneclick_field3_required'] = $this->config->get('buyoneclick_field3_required'); } if (isset($this->request->post['buyoneclick_field4_status'])) { $data['buyoneclick_field4_status'] = $this->request->post['buyoneclick_field4_status']; } else { $data['buyoneclick_field4_status'] = $this->config->get('buyoneclick_field4_status'); } if (isset($this->request->post['buyoneclick_field4_required'])) { $data['buyoneclick_field4_required'] = $this->request->post['buyoneclick_field4_required']; } else { $data['buyoneclick_field4_required'] = $this->config->get('buyoneclick_field4_required'); } if (isset($this->request->post['buyoneclick_agree_status'])) { $data['buyoneclick_agree_status'] = $this->request->post['buyoneclick_agree_status']; } else { $data['buyoneclick_agree_status'] = $this->config->get('buyoneclick_agree_status'); } if (isset($this->request->post['buyoneclick_validation_type'])) { $data['buyoneclick_validation_type'] = $this->request->post['buyoneclick_validation_type']; } else { $data['buyoneclick_validation_type'] = $this->config->get('buyoneclick_validation_type'); } if (isset($this->request->post['buyoneclick_validation_status'])) { $data['buyoneclick_validation_status'] = $this->request->post['buyoneclick_validation_status']; } else { $data['buyoneclick_validation_status'] = $this->config->get('buyoneclick_validation_status'); } /********************* STATUS *********************/ if (isset($this->request->post['buyoneclick_status'])) { $data['buyoneclick_status'] = $this->request->post['buyoneclick_status']; } else { $data['buyoneclick_status'] = $this->config->get('buyoneclick_status'); } if (isset($this->request->post['buyoneclick_status_category'])) { $data['buyoneclick_status_category'] = $this->request->post['buyoneclick_status_category']; } else { $data['buyoneclick_status_category'] = $this->config->get('buyoneclick_status_category'); } if (isset($this->request->post['buyoneclick_status_module'])) { $data['buyoneclick_status_module'] = $this->request->post['buyoneclick_status_module']; } else { $data['buyoneclick_status_module'] = $this->config->get('buyoneclick_status_module'); } if (isset($this->request->post['buyoneclick_style_status'])) { $data['buyoneclick_style_status'] = $this->request->post['buyoneclick_style_status']; } else { $data['buyoneclick_style_status'] = $this->config->get('buyoneclick_style_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/buyoneclick.tpl', $data)); } protected function validate() { if (!$this->user->hasPermission('modify', 'module/buyoneclick')) { $this->error['warning'] = $this->language->get('error_permission'); } return !$this->error; } } |
Теперь переименуем сам контроллер и переменные: buyoneclick в xd_zvonok. А ещё удалим поля, которые отвечают за добавление модуля в категорию и модули, оставив лишь поле, отвечающее за включение модуля. Также удалим поле, которое использовалось для ввода e-mail, оставив поля: имя, телефон, комментарий и согласие с политикой конфиденциальности. В итоге должно получится что-то вроде этого:
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 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
<?php class ControllerModuleXDZvonok extends Controller { private $error = array(); public function index() { $this->load->language('module/xd_zvonok'); $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('xd_zvonok_', $this->request->post); $this->session->data['success'] = $this->language->get('text_success'); $this->response->redirect($this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL')); } // Heading $data['heading_title'] = $this->language->get('heading_title'); // Text $data['text_edit'] = $this->language->get('text_edit'); $data['text_enabled'] = $this->language->get('text_enabled'); $data['text_disabled'] = $this->language->get('text_disabled'); //Buttons $data['button_save'] = $this->language->get('button_save'); $data['button_cancel'] = $this->language->get('button_cancel'); // Fields $data['field1_title'] = $this->language->get('field1_title'); $data['field2_title'] = $this->language->get('field2_title'); $data['field3_title'] = $this->language->get('field3_title'); $data['agree_title'] = $this->language->get('agree_title'); $data['field_required'] = $this->language->get('field_required'); // Phone validation $data['entry_validation_type'] = $this->language->get('entry_validation_type'); $data['text_validation_type0'] = $this->language->get('text_validation_type0'); $data['text_validation_type1'] = $this->language->get('text_validation_type1'); $data['text_validation_type2'] = $this->language->get('text_validation_type2'); $data['value_validation_type1'] = $this->language->get('value_validation_type1'); $data['value_validation_type2'] = $this->language->get('value_validation_type2'); // Entry $data['entry_button_name'] = $this->language->get('entry_button_name'); $data['entry_status'] = $this->language->get('entry_status'); $data['entry_style_status'] = $this->language->get('entry_style_status'); $data['entry_success_field'] = $this->language->get('entry_success_field'); $data['success_field_tooltip'] = htmlspecialchars($this->language->get('success_field_tooltip')); $this->load->model('catalog/information'); $data['informations'] = $this->model_catalog_information->getInformations(); 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') ); $data['breadcrumbs'][] = array( 'text' => $this->language->get('heading_title'), 'href' => $this->url->link('module/xd_zvonok', 'token=' . $this->session->data['token'], 'SSL') ); $data['action'] = $this->url->link('module/xd_zvonok', 'token=' . $this->session->data['token'], 'SSL'); $data['cancel'] = $this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL'); $this->load->model('localisation/language'); $data['languages'] = $this->model_localisation_language->getLanguages(); $languages = $this->model_localisation_language->getLanguages(); foreach ($languages as $language) { if (isset($this->request->post['xd_zvonok_name_'.$language['language_id']])) { $data['xd_zvonok_button_name_'.$language['language_id']] = $this->request->post['xd_zvonok_button_name_'.$language['language_id']]; $data['xd_zvonok_success_field_'.$language['language_id']] = $this->request->post['xd_zvonok_success_field_'.$language['language_id']]; } else { $data['xd_zvonok_button_name_'.$language['language_id']] = $this->config->get('xd_zvonok_button_name_'.$language['language_id']); $data['xd_zvonok_success_field_'.$language['language_id']] = $this->config->get('xd_zvonok_success_field_'.$language['language_id']); } } /********************* Modal window fileds *********************/ if (isset($this->request->post['xd_zvonok_field1_status'])) { $data['xd_zvonok_field1_status'] = $this->request->post['xd_zvonok_field1_status']; } else { $data['xd_zvonok_field1_status'] = $this->config->get('xd_zvonok_field1_status'); } if (isset($this->request->post['xd_zvonok_field1_required'])) { $data['xd_zvonok_field1_required'] = $this->request->post['xd_zvonok_field1_required']; } else { $data['xd_zvonok_field1_required'] = $this->config->get('xd_zvonok_field1_required'); } if (isset($this->request->post['xd_zvonok_field2_status'])) { $data['xd_zvonok_field2_status'] = $this->request->post['xd_zvonok_field2_status']; } else { $data['xd_zvonok_field2_status'] = $this->config->get('xd_zvonok_field2_status'); } if (isset($this->request->post['xd_zvonok_field2_required'])) { $data['xd_zvonok_field2_required'] = $this->request->post['xd_zvonok_field2_required']; } else { $data['xd_zvonok_field2_required'] = $this->config->get('xd_zvonok_field2_required'); } if (isset($this->request->post['xd_zvonok_field3_status'])) { $data['xd_zvonok_field3_status'] = $this->request->post['xd_zvonok_field3_status']; } else { $data['xd_zvonok_field3_status'] = $this->config->get('xd_zvonok_field3_status'); } if (isset($this->request->post['xd_zvonok_field3_required'])) { $data['xd_zvonok_field3_required'] = $this->request->post['xd_zvonok_field3_required']; } else { $data['xd_zvonok_field3_required'] = $this->config->get('xd_zvonok_field3_required'); } if (isset($this->request->post['xd_zvonok_agree_status'])) { $data['xd_zvonok_agree_status'] = $this->request->post['xd_zvonok_agree_status']; } else { $data['xd_zvonok_agree_status'] = $this->config->get('xd_zvonok_agree_status'); } if (isset($this->request->post['xd_zvonok_validation_type'])) { $data['xd_zvonok_validation_type'] = $this->request->post['xd_zvonok_validation_type']; } else { $data['xd_zvonok_validation_type'] = $this->config->get('xd_zvonok_validation_type'); } /********************* STATUS *********************/ if (isset($this->request->post['xd_zvonok_status'])) { $data['xd_zvonok_status'] = $this->request->post['xd_zvonok_status']; } else { $data['xd_zvonok_status'] = $this->config->get('xd_zvonok_status'); } if (isset($this->request->post['xd_zvonok_style_status'])) { $data['xd_zvonok_style_status'] = $this->request->post['xd_zvonok_style_status']; } else { $data['xd_zvonok_style_status'] = $this->config->get('xd_zvonok_style_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/xd_zvonok.tpl', $data)); } protected function validate() { if (!$this->user->hasPermission('modify', 'module/xd_zvonok')) { $this->error['warning'] = $this->language->get('error_permission'); } return !$this->error; } } |
В принципе контроллер готов! Он способен принимать данные о полях, обязательности этих полей, статусе самого модуля.
Теперь к языковым файлам:
В принципе достаточно заполнить лишь вариант на английском языке, остальные по желанию.
Смотрим в контроллере какие языковые переменные нам понадобятся:
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 |
// Heading $data['heading_title'] = $this->language->get('heading_title'); // Text $data['text_edit'] = $this->language->get('text_edit'); $data['text_enabled'] = $this->language->get('text_enabled'); $data['text_disabled'] = $this->language->get('text_disabled'); //Buttons $data['button_save'] = $this->language->get('button_save'); $data['button_cancel'] = $this->language->get('button_cancel'); // Fields $data['field1_title'] = $this->language->get('field1_title'); $data['field2_title'] = $this->language->get('field2_title'); $data['field3_title'] = $this->language->get('field3_title'); $data['agree_title'] = $this->language->get('agree_title'); $data['field_required'] = $this->language->get('field_required'); // Phone validation $data['entry_validation_type'] = $this->language->get('entry_validation_type'); $data['value_validation_type1'] = $this->language->get('value_validation_type1'); $data['value_validation_type2'] = $this->language->get('value_validation_type2'); $data['text_validation_type1'] = $this->language->get('text_validation_type1'); $data['text_validation_type2'] = $this->language->get('text_validation_type2'); $data['entry_validation_status'] = $this->language->get('entry_validation_status'); // Entry $data['entry_button_name'] = $this->language->get('entry_button_name'); $data['entry_status'] = $this->language->get('entry_status'); $data['entry_style_status'] = $this->language->get('entry_style_status'); $data['entry_success_field'] = $this->language->get('entry_success_field'); $data['success_field_tooltip'] = htmlspecialchars($this->language->get('success_field_tooltip')); // Additional $this->session->data['success'] = $this->language->get('text_success'); $data['breadcrumbs'][] = array( 'text' => $this->language->get('text_module'), 'href' => $this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL') ); $this->error['warning'] = $this->language->get('error_permission'); |
Эти переменные и оставим в нашем языковом файле, который также переименуем в xd_zvonok.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 |
<?php // Heading $_['heading_title'] = 'XD_Zvonok for Opencart 2.0, 2.1'; // Text $_['text_module'] = 'Modules'; $_['text_success'] = 'Success: You have modified XD_Zvonok module!'; $_['text_edit'] = 'Edit XD_Zvonok module'; $_['text_enabled'] = 'Enabled'; $_['text_disabled'] = 'Disabled'; //Buttons $_['button_save'] = 'Save'; $_['button_cancel'] = 'Cancel'; // Fields $_['field1_title'] = 'Name'; $_['field2_title'] = 'Phone'; $_['field3_title'] = 'Message'; $_['agree_title'] = 'Require compliance with '; $_['field_required'] = 'Required'; // Phone validation $_['entry_validation_type'] = 'Phone check mask'; $_['text_validation_type0'] = 'Disabled'; $_['text_validation_type1'] = 'Russia: +7(000)000-00-00'; $_['text_validation_type2'] = 'Ukraine: +38(000)000-00-00'; $_['value_validation_type1'] = '+7(000)000-00-00'; $_['value_validation_type2'] = '+38(000)000-00-00'; // Entry $_['entry_button_name'] = 'Text on button'; $_['entry_status'] = 'Enable XD_Zvonok module'; $_['entry_style_status'] = 'Use xd_zvonok.css'; $_['entry_success_field'] = 'Success window text'; $_['success_field_tooltip'] = 'Using HTML tags is allowed'; // Error $_['error_permission'] = 'Warning: You do not have permission to modify XD_Zvonok module!'; |
Остальные языковые файлы пока удалим, их всегда можно будет добавить.
Теперь к файлу представления:
Для начала переименовываем buyoneclick.tpl в xd_zvonok.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 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 |
<?php echo $header; ?><?php echo $column_left; ?> <div id="content"> <div class="page-header"> <div class="container-fluid"> <div class="pull-right"> <button type="submit" form="form-xd_zvonok" 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">×</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_edit; ?></h3> </div> <div class="panel-body"> <form action="<?php echo $action; ?>" method="post" enctype="multipart/form-data" id="form-html" class="form-horizontal"> <div class="tab-pane"> <ul class="nav nav-tabs" id="language"> <?php foreach ($languages as $language) { ?> <li><a href="#language<?php echo $language['language_id']; ?>" data-toggle="tab"><img src="view/image/flags/<?php echo $language['image']; ?>" title="<?php echo $language['name']; ?>" /> <?php echo $language['name']; ?></a></li> <?php } ?> </ul> <div class="tab-content"> <?php foreach ($languages as $language) { ?> <div class="tab-pane" id="language<?php echo $language['language_id']; ?>"> <div class="form-group"> <label class="col-sm-3 control-label" for="xd_zvonok_button_name_<?php echo $language['language_id']; ?>"><?php echo $entry_button_name; ?></label> <div class="col-sm-9"> <input type="text" name="xd_zvonok_button_name_<?php echo $language['language_id']; ?>" placeholder="<?php echo $entry_button_name; ?>" id="xd_zvonok_name_<?php echo $language['language_id']; ?>" value="<?php echo isset(${'xd_zvonok_button_name_'.$language['language_id']}) ? ${'xd_zvonok_button_name_'.$language['language_id']} : ''; ?>" class="form-control" /> </div> </div> <div class="form-group"> <label class="col-sm-3 control-label" for="xd_zvonok_success_field_<?php echo $language['language_id']; ?>"><?php echo $entry_success_field; ?></label> <div class="col-sm-9"> <input type="text" name="xd_zvonok_success_field_<?php echo $language['language_id']; ?>" placeholder="<?php echo $entry_success_field; ?>" id="xd_zvonok_success_field_<?php echo $language['language_id']; ?>" value="<?php echo isset(${'xd_zvonok_success_field_'.$language['language_id']}) ? ${'xd_zvonok_success_field_'.$language['language_id']} : ''; ?>" class="form-control" /> <p><?php echo $success_field_tooltip; ?></p> </div> </div> </div> <?php } ?> </div> </div> <div class="form-group" style="border-top: 1px solid #ccc;"> <label class="col-sm-3 control-label" for="input-field1_status"><?php echo $field1_title; ?></label> <div class="col-sm-7"> <select name="xd_zvonok_field1_status" id="input-field1_status" class="form-control"> <?php if ($xd_zvonok_field1_status) { ?> <option value="1" selected="selected"><?php echo $text_enabled; ?></option> <option value="0"><?php echo $text_disabled; ?></option> <?php } else { ?> <option value="1"><?php echo $text_enabled; ?></option> <option value="0" selected="selected"><?php echo $text_disabled; ?></option> <?php } ?> </select> </div> <div class="col-sm-2"> <label class="control-label"> <input type="checkbox" name="xd_zvonok_field1_required" value="1" <?php echo isset($xd_zvonok_field1_required) ? 'checked="checked"' : ''; ?>> <?php echo $field_required; ?> </label> </div> </div> <div class="form-group" style="border:none;"> <label class="col-sm-3 control-label" for="input-field2_status"><?php echo $field2_title; ?></label> <div class="col-sm-7"> <select name="xd_zvonok_field2_status" id="input-field2_status" class="form-control"> <?php if ($xd_zvonok_field2_status) { ?> <option value="1" selected="selected"><?php echo $text_enabled; ?></option> <option value="0"><?php echo $text_disabled; ?></option> <?php } else { ?> <option value="1"><?php echo $text_enabled; ?></option> <option value="0" selected="selected"><?php echo $text_disabled; ?></option> <?php } ?> </select> </div> <div class="col-sm-2"> <label class="control-label"> <input type="checkbox" name="xd_zvonok_field2_required" value="1" <?php echo isset($xd_zvonok_field2_required) ? 'checked="checked"' : ''; ?>> <?php echo $field_required; ?> </label> </div> </div> <div class="form-group" style="border:none;"> <label class="col-sm-3 control-label" for="input-field3_status"><?php echo $field3_title; ?></label> <div class="col-sm-7"> <select name="xd_zvonok_field3_status" id="input-field3_status" class="form-control"> <?php if ($xd_zvonok_field3_status) { ?> <option value="1" selected="selected"><?php echo $text_enabled; ?></option> <option value="0"><?php echo $text_disabled; ?></option> <?php } else { ?> <option value="1"><?php echo $text_enabled; ?></option> <option value="0" selected="selected"><?php echo $text_disabled; ?></option> <?php } ?> </select> </div> <div class="col-sm-2"> <label class="control-label"> <input type="checkbox" name="xd_zvonok_field3_required" value="1" <?php echo isset($xd_zvonok_field3_required) ? 'checked="checked"' : ''; ?>> <?php echo $field_required; ?> </label> </div> </div> <div class="form-group" style="border:none;"> <label class="col-sm-3 control-label" for="input-agree_status"><?php echo $agree_title; ?></label> <div class="col-sm-9"> <select name="xd_zvonok_agree_status" id="agree_status" class="form-control"> <option value="0"><?php echo $text_disabled; ?></option> <?php foreach ($informations as $information) { ?> <?php if ($information['information_id'] == $xd_zvonok_agree_status) { ?> <option value="<?php echo $information['information_id']; ?>" selected="selected"><?php echo $information['title']; ?></option> <?php } else { ?> <option value="<?php echo $information['information_id']; ?>"><?php echo $information['title']; ?></option> <?php } ?> <?php } ?> </select> </div> </div> <div class="form-group"> <label class="col-sm-3 control-label" for="input-validation_type"><?php echo $entry_validation_type; ?></label> <div class="col-sm-9"> <select name="xd_zvonok_validation_type" id="input-validation_type" class="form-control"> <?php if ($xd_zvonok_validation_type == $value_validation_type1) { ?> <option value="0"><?php echo $text_validation_type0; ?></option> <option value="<?php echo $value_validation_type1; ?>" selected="selected"><?php echo $text_validation_type1; ?></option> <option value="<?php echo $value_validation_type2; ?>"><?php echo $text_validation_type2; ?></option> <?php } else if ($xd_zvonok_validation_type == $value_validation_type2) { ?> <option value="0"><?php echo $text_validation_type0; ?></option> <option value="<?php echo $value_validation_type1; ?>"><?php echo $text_validation_type1; ?></option> <option value="<?php echo $value_validation_type2; ?>" selected="selected"><?php echo $text_validation_type2; ?></option> <?php } else { ?> <option value="0" selected="selected"><?php echo $text_validation_type0; ?></option> <option value="<?php echo $value_validation_type1; ?>"><?php echo $text_validation_type1; ?></option> <option value="<?php echo $value_validation_type2; ?>"><?php echo $text_validation_type2; ?></option> <?php } ?> </select> </div> </div> <div class="form-group" style="border:none;"> <label class="col-sm-3 control-label" for="input-style_status"><?php echo $entry_style_status; ?></label> <div class="col-sm-9"> <select name="xd_zvonok_style_status" id="input-style_status" class="form-control"> <?php if ($xd_zvonok_style_status) { ?> <option value="1" selected="selected"><?php echo $text_enabled; ?></option> <option value="0"><?php echo $text_disabled; ?></option> <?php } else { ?> <option value="1"><?php echo $text_enabled; ?></option> <option value="0" selected="selected"><?php echo $text_disabled; ?></option> <?php } ?> </select> </div> </div> <div class="form-group" style="border:none;"> <label class="col-sm-3 control-label" for="input-status"><?php echo $entry_status; ?></label> <div class="col-sm-9"> <select name="xd_zvonok_status" id="input-status" class="form-control"> <?php if ($xd_zvonok_status) { ?> <option value="1" selected="selected"><?php echo $text_enabled; ?></option> <option value="0"><?php echo $text_disabled; ?></option> <?php } else { ?> <option value="1"><?php echo $text_enabled; ?></option> <option value="0" selected="selected"><?php echo $text_disabled; ?></option> <?php } ?> </select> </div> </div> </form> </div> </div> <script type="text/javascript"><!-- $('#language a:first').tab('show'); //--></script> </div> <?php echo $footer; ?> |
Представление готово!
Проверка административной части:
Осталось проверить: работает ли то, что мы сделали? Для этого загрузим через FTP наши файлы в папку admin и в админке в раздел "Дополнения -> Модули". Если мы сделали всё правильно, должны увидеть это:
Теперь активируем модуль и увидим:
Отлично! Административная часть модуля работает! Осталось проверить сохраняются ли значения: для этого заполним поле "Text on button" и изменим какие-нибудь select. Затем нажмем сохранить и опять зайдём в модуль, если модуль сохраняет данные, они будут там, где мы их внесли:
Замечательно! Данные сохраняются, а значит нам осталось лишь вывести их в нашем интернет-магазине. Возможно мы ещё вернемся к административному модулю, но в первом приближении можно считать его завершенным. На всякий случай выкладываю всю папку admin в архиве - скачать.
Следующий урок: Обратный звонок для Opencart 2 - выводим в шапку (и не только).