Пишем модуль "Импорт товаров OpenCart", часть 1

В сегодняшнем уроке я поделюсь тем, как создавать модуль импорта товаров в OpenCart2 из CSV файла. В конечном счёте получится отдельный независимый модуль для импорта товаров, который будет располагаться в папке tools, а изменения в системные файлы OpenCart будут минимальными и то лишь для того, чтобы добавить ссылочку на наш модуль в левый сайдбар для лучшего юзабилити. Разрабатывать будем под OpenCart версии 2.2.0.0.
Для тех кому лень читать или хочется увидеть весь код целиком, вот ссылка на Bitbucket с работающим плагином:
Вступление
На самом деле написать модуль импорта товаров для Opencart 2 довольно таки просто. Но для простоты изложения информации я разбиваю информацию на 2 части. В первой части рассматриваем общую структуру файлов для нашего модуля, а также создадим файлы-пустышки для логики. А во втором уроке уже будет реализована логика импорта товаров.
Итак, для начала вот скрин всех файлов и папок, что нам необходимы для модуля:
Тут все просто. Модулю нужен свой файл контроллера, шаблон, перевод, а также файл xml модификаций для интеграции в сайдбар. Саму модель мы не создаем, а воспользуемся методами админской продуктовой модели для работы с товарами.
В ходе выполнения задачи Вы можете создать отдельную папку для плагина, либо же сразу работать в директории с развернутым Opencart. Дело вкуса. Я буду все писать в отдельной папке.
1 Создаем контроллер к модулю импорта товаров Opencart
Создаем новый файл контроллера admin/controller/tool/import.php и вставаляем следующий код:
<?php
class ControllerToolImport extends Controller {
private $error = array();
public function index()
{
$this->load->language('tool/import');
$this->document->setTitle($this->language->get('heading_title'));
$data['heading_title'] = $this->language->get('heading_title');
$data['entry_import'] = $this->language->get('entry_import');
if (isset($this->session->data['error'])) {
$data['error_warning'] = $this->session->data['error'];
unset($this->session->data['error']);
} elseif (isset($this->error['warning'])) {
$data['error_warning'] = $this->error['warning'];
} else {
$data['error_warning'] = '';
}
if (isset($this->session->data['success'])) {
$data['success'] = $this->session->data['success'];
unset($this->session->data['success']);
} else {
$data['success'] = '';
}
$data['breadcrumbs'] = array();
$data['breadcrumbs'][] = array(
'text' => $this->language->get('text_home'),
'href' => $this->url->link('common/dashboard', 'token=' . $this->session->data['token'], true)
);
$data['breadcrumbs'][] = array(
'text' => $this->language->get('heading_title'),
'href' => $this->url->link('tool/import', 'token=' . $this->session->data['token'], true)
);
$data['import_action'] = $this->url->link('tool/import', 'token=' . $this->session->data['token'], true);
$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('tool/import', $data));
}
}
Сейчас наш модуль умеет ничего ценного делать не умеет. По сути это обычная заглушка со стандартным набором кода, который нужен в любом контроллере Opencart. В методе index() мы строим хлебные крошки, тайтл для страницы, подгружаем нужные переводы.
2. Добавляем свои переводы в файл локализации
Создаем файл admin/language/en-gb/tool/import.php и добавляем код с переводом переменных:
<?php
// Heading
$_['heading_title'] = 'Import Plugin';
// Text
$_['text_success'] = 'Success: You have successfully imported your data!';
// Entry
$_['entry_import'] = 'Import';
// Error
$_['error_permission'] = 'Warning: You do not have permission to modify Import Plugin!';
$_['error_export'] = 'Warning: You must select at least one table to export!';
$_['error_empty'] = 'Warning: The file you uploaded was empty!';
Аналогично я сразу создаю файл admin/language/ru-ru/tool/import.php и добавляем локализацию по русский язык:
<?php
// Heading
$_['heading_title'] = 'Модуль импорта';
// Text
$_['text_success'] = 'Импорт прошло успешно!';
// Entry
$_['entry_import'] = 'Импорт товаров';
// Error
$_['error_permission'] = 'У вас нет прав для импорта!';
$_['error_export'] = 'Для резервного копирования необходимо выбрать хотя бы одну таблицу!';
$_['error_empty'] = 'Внимание: Загруженный файл пустой!';
3. Создадим страницу представления данных
Создаем файл представления admin/view/template/tool/import.tpl и вставляем разметку:
<?php echo $header; ?><?php echo $column_left; ?>
<div id="content">
<div class="page-header">
<div class="container-fluid">
<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 } ?>
<?php if ($success) { ?>
<div class="alert alert-success"><i class="fa fa-check-circle"></i> <?php echo $success; ?>
<button type="button" form="form-import" 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-exchange"></i> <?php echo $heading_title; ?></h3>
</div>
<div class="panel-body">
<form action="<?php echo $import_action; ?>" method="post" enctype="multipart/form-data" id="form-import" class="form-horizontal">
<div class="form-group">
<label class="col-sm-2 control-label" for="input-import"><?php echo $entry_import; ?></label>
<div class="col-sm-10">
<input type="file" name="import" id="input-import" accept=".csv, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet">
</div>
</div>
<div class="text-right">
<button type="submit" class="btn btn-primary"><i class="fa fa-save"></i> <?php echo $entry_import; ?></button>
</div>
</form>
</div>
</div>
</div>
</div>
<?php echo $footer; ?>
4. Создаем установочный XML файл
Создаём новый файл ocmod/install.xml и пишем следующий код:
<?xml version="1.0" encoding="utf-8"?>
<modification>
<code>easyimport</code>
<name>Easy Import</name>
<version>1.1</version>
<author>Andrew Kolpikov, kolpikov.andrey@gmail.com</author>
<file path="admin/controller/common/column_left.php">
<operation>
<search><![CDATA[if ($this->user->hasPermission('access', 'tool/log')) {]]></search>
<add position="before">
<![CDATA[
if ($this->user->hasPermission('access', 'tool/import')) {
$tool[] = array(
'name' => 'Импорт товаров',
'href' => $this->url->link('tool/import', 'token=' . $this->session->data['token'], true),
'children' => array()
);
}
]]>
</add>
</operation>
</file>
</modification>
Данный файл при установке модуля добавит в левый сайд бар ссылку на модуль импорта товаров. Я не стал заводить в переводы анкор для ссылки, а просто сразу тут вписал "Импорт товаров". Пусть это будет Вашим домашним заданием :)
Подсказка: поскольку для перевода имени модуля в сайдбаре нам нужно добавить свои алиасы в существующий файл с переводом – то тут лучше воспользоваться этим же xml файлом для модификаций Opencart
Вот и всё! На этом этапе первая часть урока завершена. У нас уже есть форма для загрузки CSV файлов, контроллер, который будет обрабатывать данные из полученного CSV файла, а также переводы кнопочек и сообщений, которые нужны для этого модуля.
На этом первая часть урока подходит к концу. Во второй части будет реализована логика для импортирования товара.
Ссылка на Bitbucket с работающим плагином:
Читать далее: Пишем модуль "Импорт товаров OpenCart", часть 2.
UPD от 16.11.2018: Когда я начинал писать статью в 2016м году - то актуальная версия была Opencart 2.2.0.0. Но постоянное отсутствие времени препятствовало выделить пару часов жизни и завершить статью.
Затем, 16.06.2017 года ко мне обратился один из читателей на почту с просьбой по-скорее написать модуль, т.к. для него это был вопрос жизни или смерти. У меня не было времени писать целую статью - поэтому я взял свои наработки, немного изменив концепцию расположения файлов, дописал код и залил готовый плагин на Bitbucket.
И вот наконец-то в 2018м году я решился дописать это пособие! Сейчас уже актуальнен Opencart 3, однако я завершу уже статью с учетом версии 2.2.0.0 по двум причинам. Во-первых, у меня уже есть готовый код в репозитории, а во-вторых многие разработчики еще используют Opencart 2 в своих проектах и эта информация будет актуальной еще пару лет.
Если будет время - я переделаю модуль, чтоб была поддержка импорта товаров для Opencart 3.