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

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

В сегодняшнем уроке я поделюсь тем, как создавать модуль импорта товаров в OpenCart2 из CSV файла. В конечном счёте получится отдельный независимый модуль для импорта товаров, который будет располагаться в папке modules, а изменения в системные файлы OpenCart будут минимальными и то лишь для того, чтобы добавить ссылочку на наш модуль в разделе "Каталог товаров" для лучшего юзабилити. Разрабатывать будем под OpenCart версии 2.2.0.0. Первым делом, нужно будет отобразить в каталоге товаров кнопку со ссылкой на будущий модуль импорта товаров. Для того мы изменим контроллер, файл локализации и файл представления для каталога товаров.

1. Редактируем раздел "Каталог товаров"

1.1. Изменения в контроллере

Открываем контроллер admin/controller/catalog/product.php В нём нужно создать ссылку на наш модуль импорта товаров, а также переменную локализации для фразы "импортировать товары" для последующей передачи в файл представления каталога продуктов. Для этого в методе getList() дописываем после строк:

$data['add'] = $this->url->link('catalog/product/add', 'token=' . $this->session->data['token'] . $url, true);
$data['copy'] = $this->url->link('catalog/product/copy', 'token=' . $this->session->data['token'] . $url, true);
$data['delete'] = $this->url->link('catalog/product/delete', 'token=' . $this->session->data['token'] . $url, true);
строку:
$data['easy_import'] = $this->url->link('module/easyimport', 'token=' . $this->session->data['token'] . $url, 'SSL');
теперь аналогично находим блок с переводами этих кнопок в этом же методе:
$data['button_copy'] = $this->language->get('button_copy');
$data['button_add'] = $this->language->get('button_add');
$data['button_edit'] = $this->language->get('button_edit');
$data['button_delete'] = $this->language->get('button_delete');
$data['button_filter'] = $this->language->get('button_filter');
и добавляем языковой перевод для будущей кнопочки:
$data['button_import'] = $this->language->get('button_import');

1.2. Правим файл локализации

Открываем admin/language/en-gb/catalog/product.php Обратите внимание, что у меня локализация на английском языке и поэтому каталог eb-gb. Вы же открываете свой каталог локализации, если у вас не английская версия. К примеру, для русского языка это будет ru-ru. и вставляем строку:
$_['button_import'] = 'Импортировать товары';

1.3. Правим файл представления

И теперь откроем /admin/view/template/catalog/product_list.tpl находим в разметке верхний правый блок с кнопочками "добавить, скопировать, удалить" и вставляем рядом с ними свою кнопку "Импорт товаров":
<a href="<?=$easy_import;?>" data-toggle="tooltip" title="<?=$button_import;?>" class="btn btn-success"><i class="fa fa-download"></i></a>
Вот что должно получиться:
<div class="pull-right">
  <a href="<?=$easy_import;?>" data-toggle="tooltip" title="<?=$button_import;?>" class="btn btn-success"><i class="fa fa-download"></i></a>
  <a href="<?php echo $add; ?>" data-toggle="tooltip" title="<?php echo $button_add; ?>" class="btn btn-primary"><i class="fa fa-plus"></i></a>
 <button type="button" data-toggle="tooltip" title="<?php echo $button_copy; ?>" class="btn btn-default" onclick="$('#form-product').attr('action', '<?php echo $copy; ?>').submit()"><i class="fa fa-copy"></i></button>
  <button type="button" data-toggle="tooltip" title="<?php echo $button_delete; ?>" class="btn btn-danger" onclick="confirm('<?php echo $text_confirm; ?>') ? $('#form-product').submit() : false;"><i class="fa fa-trash-o"></i></button>
</div>
В результате в верхнем правом углу каталога товаров мы увидим следующий результат: Пишем модуль "Импорт товаров OpenCart" На этом правки в системных файлах окончены и далее мы переходим к написанию методов для импортирования товара.  Пока что кнопка импорта товаров будет приводить к 404й ошибке, но мы это быстро исправим. Внимание! Такая правка системных файлов является нежелательным действием, т.к. при обновлении магазина - эти изменения слетят. Как этого избежать я расскажу в завершающей части урока.

2. Написание модуля импорта товаров в OpenCart2

Теперь нам нужно создать соответствующие файлы модуля Easy Import в соответствием с требованиями фреймворка OpenCart к расположению и наименованию файлов модуля:
  1. admin/controller/module/easyimport.php (контроллер)
  2. admin/language/en-gb/module/easyimport.php (локализация)
  3. admin/view/template/module/easyimport.tpl (представление)
В этих трёх файлах уже должен присутствовать стандартный базовый функционал для того, что модуль корректно отображался в списке модулей, чтобы его можно было включить/выключить и открыть страничку с модулем. Если у Вас нет своего скелета для создания модуля в OpenCart - советую прочесть мою статью "Как создать свой модуль OpenCart". После того как скелет модуля был подключен, нажав на "импортировать товары" - мы попадём на наш модуль импорта товаров.

2.1 Правим контроллер модуля

Файл admin/controller/module/easyimport.php В метод index() в любом месте, до вызова файла представления, добавляем новые переменные:
$data['import_file_title'] = $this->language->get('import_file_title');
$data['import_profile'] = $this->language->get('import_profile');
$data['select'] = $this->language->get('select');
$data['start_import'] = $this->language->get('start_import');
$data['choose_file_to_import'] = $this->language->get('choose_file_to_import');
 

2.2. Добавляем свои переводы в файл локализации

В файл admin/language/en-gb/module/easyimport.php добавляем строки с переводом переменных, созданных в п.2.1 :
$data['import_file_title'] = $this->language->get('import_file_title');
$data['import_profile'] = $this->language->get('import_profile');
$data['select'] = $this->language->get('select');
$data['start_import'] = $this->language->get('start_import');
$data['choose_file_to_import'] = $this->language->get('choose_file_to_import');
 

2.3. Создадим форму загрузки файлов

Открываем файл представления admin/view/template/module/easyimport.tpl и вставляем перед выводом подвала сайта форму:
<div class="container-fluid">
<div class="panel panel-default">
  <div class="panel-heading">
    <h3 class="panel-title"><i class="fa fa-list"></i> <?=$import_file_title;?></h3>
  </div>
  <div class="panel-body">
    <form action="<?php echo $action; ?>" method="post" enctype="multipart/form-data">
      <label for="import"><?=$choose_file_to_import;?></label><br>
      <input name="import" id="import" accept=".csv" required="" type="file"><br><br>
      <input class="btn btn-primary form-control" name="importproducts" type="submit" value="<?=$start_import;?>">
    </form>
  </div>
</div>
</div>
Теперь при нажатии на импорт товаров из каталога - мы будем попадать на страницу модуля с приглашением загрузить CSV файл для импорта: Форма для импорта CSV На этом первая часть урока подходит к концу. Во второй части будет реализована логика для импортирования товара. Читать далее Пишем модуль "Импорт товаров OpenCart", часть 2.

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