От новичка до продвинутого пользователя Opencart (Часть 6) - Разработка модулей 08 Августа 2018

От новичка до продвинутого пользователя Opencart (Часть 6) - Разработка модулей

Оригинал данной статьи находится здесь: From Beginner to Advanced in OpenCart: Module Development

Разработка модулей

Что такое модули Opencart?

Модули Opencart подобны аддонам, плагинам или расширениям в других системах управления контентом (CMS). С помощью модулей Opencart дает нам возможность расширять свою функциональность без необходимости редактирования файлов приложения. Как и многие другие системы управления контентом, наилучшем считается расширение возможностей системы с помощью разработки и установки модулей, нежели прямого редактирования кода ядра Opencart. Модули позволяют нам представлять, удалять или модифицировать функциональность ядра приложения, которое производится в разобщенном и пригодном для изменений виде. Opencart имеет свой собственный магазин расширений, где уже доступно большое количество расширений. Или вы можете взглянуть на широкий ассортимент модулей и расширений Opencart в магазине Envato. Если вам нужно выполнить некое действие в Opencart и вы не хотите или не можете это сделать вручную, то попробуйте один из крутейших сервисов для настройки Opencart в Envato Studio.

Наш первый модуль

Для того, чтобы привыкнуть к модульной системе Opencart, мы можем написать модуль под названием «Hello World». Он получает данные из Панели администратора и отображает их на страницах сайта. Заметьте, что Opencart имеет которое количество предустановленных модулей. Для того, чтобы начать сделайте следующее: 1. Создайте Контроллер в папках администратора: admin/controller/module/helloworld.php. 2. Создайте Языковой файл в папках администратора: admin/language/english/module/helloworld.php. 3. Создайте Вид в папках администратора: admin/view/template/module/helloworld.tpl (или .twig).

1. Языковой файл

Как уже было сказано в наших предыдущих статьях, языковой файл содержит статический текст, который должен быть отображен в нашем файле вида. Для языкового файла helloworld.php, следующие переменные содержат возможные текстовые поля, которые нам требуется отобразить в нашем модуле:

2. Контроллер

Откройте файл контроллера «Hello World», который мы только что создали и добавьте класс class ControllerModuleHelloworld extends Controller { }, следуя соглашению об именовании классов. Затем, разместите следующий код внутри этого класса.

Шаг 1: Функция по умолчанию

private $error = array(); // This is used to set the errors, if any.
 
public function index() {   // Default function 
    $this->language->load('module/helloworld'); // Loading the language file of helloworld 
 
    $this->document->setTitle($this->language->get('heading_title')); // Set the title of the page to the heading title in the Language file i.e., Hello World
 
    $this->load->model('setting/setting'); // Load the Setting Model  (All of the OpenCart Module & General Settings are saved using this Model ) 
 
    if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) { // Start If: Validates and check if data is coming by save (POST) method
        $this->model_setting_setting->editSetting('helloworld', $this->request->post);      // Parse all the coming data to Setting Model to save it in database.
 
        $this->session->data['success'] = $this->language->get('text_success'); // To display the success text on data save
 
        $this->redirect($this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL')); // Redirect to the Module Listing
    } // End If
 
    /*Assign the language data for parsing it to view*/
    $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_code'] = $this->language->get('entry_code');
    $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');     
 
    /*This Block returns the warning if any*/
    if (isset($this->error['warning'])) {
        $this->data['error_warning'] = $this->error['warning'];
    } else {
        $this->data['error_warning'] = '';
    }
    /*End Block*/
 
    /*This Block returns the error code if any*/
    if (isset($this->error['code'])) {
        $this->data['error_code'] = $this->error['code'];
    } else {
        $this->data['error_code'] = '';
    }
    /*End Block*/ 
 
    /* Making of Breadcrumbs to be displayed on site*/
    $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/helloworld', 'token=' . $this->session->data['token'], 'SSL'),
        'separator' => ' :: '
    );
 
    /* End Breadcrumb Block*/
 
    $this->data['action'] = $this->url->link('module/helloworld', 'token=' . $this->session->data['token'], 'SSL'); // URL to be directed when the save button is pressed
 
    $this->data['cancel'] = $this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL'); // URL to be redirected when cancel button is pressed 
     
    /* This block checks, if the hello world text field is set it parses it to view otherwise get the default hello world text field from the database and parse it*/
 
    if (isset($this->request->post['helloworld_text_field'])) {
        $this->data['helloworld_text_field'] = $this->request->post['helloworld_text_field'];
    } else {
        $this->data['helloworld_text_field'] = $this->config->get('helloworld_text_field');
    }   
    /* End Block*/
 
    $this->data['modules'] = array();
 
    /* This block parses the Module Settings such as Layout, Position,Status & Order Status to the view*/
    if (isset($this->request->post['helloworld_module'])) {
        $this->data['modules'] = $this->request->post['helloworld_module'];
    } elseif ($this->config->get('helloworld_module')) { 
        $this->data['modules'] = $this->config->get('helloworld_module');
    }
    /* End Block*/         
 
    $this->load->model('design/layout'); // Loading the Design Layout Models
 
    $this->data['layouts'] = $this->model_design_layout->getLayouts(); // Getting all the Layouts available on system
 
    $this->template = 'module/helloworld.tpl'; // Loading the helloworld.tpl template
    $this->children = array(
        'common/header',
        'common/footer'
    );  // Adding children to our default template i.e., helloworld.tpl 
 
    $this->response->setOutput($this->render()); // Rendering the Output
}

Шаг 2: Метод валидации Поскольку мы пытаемся провести валидацию данных в нашей функции, то вот реализация метода валидации:
/* Function that validates the data when Save Button is pressed */
    protected function validate() { 
        /* Block to check the user permission to manipulate the module*/
        if (!$this->user->hasPermission('modify', 'module/helloworld')) {
            $this->error['warning'] = $this->language->get('error_permission');
        }
        /* End Block*/
 
        /* Block to check if the helloworld_text_field is properly set to save into database, otherwise the error is returned*/
        if (!$this->request->post['helloworld_text_field']) {
            $this->error['code'] = $this->language->get('error_code');
        }
        /* End Block*/
 
        /*Block returns true if no error is found, else false if any error detected*/
        if (!$this->error) {
            return true;
        } else {
            return false;
        }   
        /* End Block*/
    }
    /* End Validation Function*/
А теперь сохраните этот файл. Всё, мы закончили с контроллером нашего модуля для панели администратора!

3. Файл Вида

Как уже было сказано относительно контроллера, вы должны создать некоторый HTML-код для вашего вида. Для этого мы выполним следующее:

Шаг 1: Создадим некоторые базовые элементы управления

form это элемент, который содержит элементы вроде input для ввода текста, textarea, и кнопки для сохранения или отмены ввода. Для создания формы подобной этой, взгляните на следующий код:
   
 
 
 
 

 
 
 
 
 
*
 
Версия для файла вида .twig:
{{ header }}
  {{% if error_warning %}}
{{ error_warning }}
{{% endif %}}
 
 

{{ heading_title }}

   
 
 
  
* {{ entry_code }} {{% if error_code %}} {{ error_code }} {{% endif %}}
 
Шаг 2: Добавляем таблицу в виде списка Внутри тега form будет отображаться список table, где мы можем разместить позицию модуля и страницу, на которую следует отображать данный модуль.  
         
 
   
 

Шаг №3: Добавляем JavaScript-код

Как вы уже увидели на предыдущем шаге, у нас есть кнопка «Add Module». В частности, мы имеем: , где пользователь может добавлять различные строки для отображения модуля в различных раскладках на различных позициях. Для этого, нам нужно написать который JavaScript-код, который будет добавлять строку в список таблицы. Это улучшит интерфейс пользователя для тех, кто будет использовать наш модуль:

Шаг 4: Добавление футера

Последнее, что нам необходимо сделать, это добавить в конце файла вида футер:
 
В этой точке, мы закончили создавать наш первый модуль Hello World. И теперь пришло время проверить работает наш модуль или нет. Для того, чтобы это сделать, необходимо войти в панель администратора и перейти на страницу Extensions > Modules, где вы увидите список модулей системы Opencart. Здесь также будет отображаться наш модуль «Hello World» с состоянием «Uninstalled». Нажмите на «Install» и попытайтесь отредактировать этот модуль и вы увидите экран, подобный этому: Вы можете кто-нибудь ввести и попытаться сохранить здесь. А теперь попытайтесь снова отредактировать модуль и вы увидите, что ваш ввод установлен как значение по умолчанию.

Заключение

В данной статье мы попытались создать простой модуль Opencart с использованием MVC. Если вы знакомы с ключевыми концепциями MVC, то вам будет очень легко управлять модулями Opencart. Данная статья дает всего-лишь базовую идею того, как разрабатывать простой модуль, следуя некоторым простым шагам.