В этой статье я приведу пример скрипта - выгрузки из xls (csv) в Opencart. Этот скрипт может понадобится в таких случаях:
- Необходимо первоначально выгрузить на сайт товары поставщика
- Необходимо обновлять цены из прайса по артикулу
- Можно сделать выгрузку для каждого поставщика
- Когда нужно загрузить в магазин специфические данные, либо в нестандартном формате.
Итак. Для выгрузки нам надо будет то что импортируем. Это как правило прайс лист в формате Microsoft Office Excel (xls,xlsx), либо другие форматы, это не столь важно. Главное что бы открыв этот файл в программе Excel его можно было сохранить в формат CSV с каким-то разделителем.
Пусть для примера у нас будет такой вот прайс в xls формате, сохраним с разделителем - ;
Продукт1 | model-23 | 385 | Описание |
Продукт2 | model-24 | 520 | Описание для второго товара |
Продукт3 | model-25 | 113 | Описание для третьего |
где 1) Название товара, 2)Модель, 3) Цена, 4) Описание
Важная информация. Разделитель - это какой-то символ, который отделяет ячейки друг от друга, например: Ячейка1;Ячейка2;Ячейка3 или Ячейка1,Ячейка2,Ячейка3. Как видим в первом примере это точка с запятой, во втором - запятая. Понятно, что если в тексте есть этот символ - такой разделитель нельзя использовать т.к. он нарушит порядок ячеек. Важно помнить - разделитель должен быть в тексте только на месте соприкосновения ячеек, в тексте он не должен быть.
Итак, мы сохранили наш прайс в формат CSV. Далее будет приведен максимально простой пример реализации выгрузки, а именно весь документ мы откроем в текстовом редакторе и запихнем его в файл в котором будет код импорта.
Как содержимое CSV обработать с помощью PHP
Для начала открываем файл в котором будет нам скрипт. Например можно разместить все в файле admin/controller/catalog/product.php в функции index. После строки
public function index() {
Вставим содержимое нашего прайса, с примера выше, после сохранения в CSV оно будет таким:
Продукт1;model-23;385;Описание Продукт2;model-24;520;Описание для второго товара Продукт3;model-25;113;Описание для третьего
Мы его копируем и создаем переменную:
$document = 'Продукт1;model-23;385;Описание
Продукт2;model-24;520;Описание для второго товара
Продукт3;model-25;113;Описание для третьего'; //наш файл уже как переменная
После этой переменной можно создавать код выгрузки
$upload_data = array(); // объявляем массив товаров для выгрузки
$document_data = explode(PHP_EOL, $document); //разбиваем наш прайс по строкам (explode - разбор, PHP_EOL - каждая новая строка как новый элемент)
foreach($document_data as $row){ //перебираем циклом массив строк
$row_data = explode(';', $row); //разбиваем строку на ячейки (';' - наш разделитель ячеек)
$upload_data[] = array( //записываем данные ячеек в массив продуктов для импорта
'name' => $row_data[0], // данные из 1 ячейки - Название товара
'model' => $row_data[1], // данные из 2 ячейки - Модель товара
'price' => $row_data[2], // данные из 3 ячейки - Цена товара
'description' => $row_data[3] // данные из 4 ячейки - Описание товара
);
}
После такой доработки можно уже данные либо куда-то отправить, либо запросом записать в базу.
Это самый простой пример, и запускаться он будет всякий раз при заходе в товары. Это сделано для пример, для упрощения понимания.
Как можно улучшить выгрузку
- Можно добавить в админке форму выбора файла и при его загрузке делать импортирование
- Можно указать где лежит на сервере файл и его считывать при помощи функции PHP file_get_contents
- Можно сделать большую выгрузку данных - просто увеличивая объем файла и количество полей. На практике я выгружал 50 000 строк и все отлично было и по сравнению в модулями выгрузки - быстрее в разы т.к. решение кастомное и код заточен только под определенный формат выгрузки. Понятно что работать будет быстрее.
- Можно при больших объемах выгрузки разделить выполнение скрипта для обхода лимитов памяти и таймаута
Надеюсь статья будет полезная для создания выгрузок в ваши магазины. Если будут вопросы - спрашивайте в комментариях.