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

Опубликовано: Комментариев: 4
Пишем модуль "Импорт товаров OpenCart", часть 1

В сегодняшнем уроке я поделюсь тем, как создавать модуль импорта товаров в OpenCart2 из CSV файла. В конечном счёте получится отдельный независимый модуль для импорта товаров, который будет располагаться в папке tools, а изменения в системные файлы OpenCart будут минимальными и то лишь для того, чтобы добавить ссылочку на наш модуль в левый сайдбар для лучшего юзабилити. Разрабатывать будем под OpenCart версии 2.2.0.0.

Для тех кому лень читать или хочется увидеть весь код целиком, вот ссылка на Bitbucket с работающим плагином: bitbucket.org/Kolpikov/opencart-product-import-module

Вступление

На самом деле написать модуль импорта товаров для Opencart 2 довольно таки просто. Но для простоты изложения информации я разбиваю информацию на 2 части. В первой части рассматриваем общую структуру файлов для нашего модуля, а также создадим файлы-пустышки для логики. А во втором уроке уже будет реализована логика импорта товаров.

Итак, для начала вот скрин всех файлов и папок, что нам необходимы для модуля:

Структура файлов для модуля OpenCart

Тут все просто. Модулю нужен свой файл контроллера, шаблон, перевод, а также файл 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">&times;</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">&times;</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 с работающим плагином: bitbucket.org/Kolpikov/opencart-product-import-module

Читать далее: Пишем модуль "Импорт товаров 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.

Комментариев: 4
Пётр Мокин 2017-01-08 13:34:23
Будет ли продолжение? Полгода - увы, срок большой, чтобы забросить идею...
Slicks 2017-01-08 21:08:28
<b>Пётр</b>, добрый вечер! Честно говоря завертелся в делах и совсем забыл, что начинал статью писать на эту тему. Модуль импорта товаров давно уже написан и испробован на деле, а вот поделиться информацией - запамятовал. В понедельник или вторник сяду за комп и продолжу статью, а получившийся код сброшу на github. :)
Пётр Мокин 2017-01-09 18:51:54
Воооооооот такое ^_^ &gt;|------------------------------------|&lt; заранее спасибо)
Олег 2017-03-18 00:16:18
подскажите алгоритм добавления товаров в базу, хочу сделать yml? Давно не кодил, с 2009года, все подзабылось, ООП вообще забыл, посмотрел свои классы и в шоке)) все забыто, но чет тянет вспомнить все, вообщем посмотрел таблицы, кое что понятно, но многие столбцы непонятно за что отвечают, пока думаю хоть отдельным скриптом сделать )), возможно есть доки какието?