Создание в OpenCart инструмента импорта товаров из CSV — Часть 2
18 Мар 2023г. в 15:45Рассмотрим сначала сначала все в целом. В предыдущем руководстве мы реализовали инструмент экспорта, который позволяет пользователю скачивать CSV-списки и изменять их при необходимости. После этого мы создали инструмент импорта, который позволяет загружать / импортировать отредактированный файл / данные. В первой части мы реализовали макет того, как работает в OpenCart импорт. В этой части мы реализуем функционал.
Файл контроллера
В предыдущей части мы создали контроллер, что привело нас к созданию формы загрузки. В файле представления макета у нас было поле загрузки, через которое пользователь может загрузить CSV, как показано ниже:
Откройте файл admin/controller/catalog/product.php. Найдите функцию importCSV(), которую мы создали в предыдущей части.
Добавьте после нее код:
if (($this->request->server['REQUEST_METHOD'] == 'POST') ) {}
1
if (($this->request->server['REQUEST_METHOD'] == 'POST') ) {}
чтобы данная часть кода выполнялась только в том случае, если через указанную выше форму были отправлены данные.
Внутри вышеуказанного блока кода мы добавим код, который я подробно поясню ниже.
Получение файла
Следующий код открывает представленный CSV-файл и обрабатывает его как файл только для чтения.
<?php
$file = $_FILES['csv']['tmp_name'];
$handle = fopen($file,"r");
?>
1
2
3
4
<?php
$file = $_FILES['csv']['tmp_name'];
$handle = fopen($file,"r");
?>
Обработка каждой записи
Теперь нам нужно обработать каждую строку CSV и сохранить в базе данных. Для этого мы будем обрабатывать записи через цикл и сохранять их.
<?php
while ($data = fgetcsv($handle,1000,",","'")) // обработка строки заключается в считывании полей в формате CSV и возвращении массива, содержащего считанные поля.
{
if ($data[0]!='') // если столбец 1 не является пустым
{
$this->model_catalog_product->importCsvData($data); // обработка и передача данных в модель
}
else
{
// на случай возникновения ошибок сюда помещается код отладки
}
}
?>
<?php
while ($data = fgetcsv($handle,1000,",","'")) // обработка строки заключается в считывании полей в формате CSV и возвращении массива, содержащего считанные поля.
{
if ($data[0]!='') // если столбец 1 не является пустым
{
$this->model_catalog_product->importCsvData($data); // обработка и передача данных в модель
}
else
{
// на случай возникновения ошибок сюда помещается код отладки
}
}
?>
Перенаправление
После завершения импорта пользователь должен быть перенаправлен, поэтому следующий код перенаправляет пользователя к форме и отображает сообщение об успешном завершении процесса импорта.
<?php
$this->session->data['success'] = 'CSV Successfully Imported!'; // сообщение об успешном завершении процесса импорта
$this->redirect($this->url->link('catalog/product', 'token=' . $this->session->data['token'] . $url, 'SSL')); //перенаправление на страницу товара
?>
1
2
3
4
<?php
$this->session->data['success'] = 'CSV Successfully Imported!'; // сообщение об успешном завершении процесса импорта
$this->redirect($this->url->link('catalog/product', 'token=' . $this->session->data['token'] . $url, 'SSL')); //перенаправление на страницу товара
?>
На данный момент мы создали функцию, которая только загружает CSV-файл, считывает его данные по строкам и передает их в модель. Теперь нам нужно создать модель, определенную в коде контроллера, которая отвечает за сохранение переданных данных в базу данных.
Файл модели
Откройте файл admin/model/catalog/product.php. Создайте в нем публичную функцию importCsvData($data). Внутри функции модели мы добавим следующий код, содержащий несколько запросов для сохранения данных.
<?php
$product_id = $data[0];
$model = $data[1];
$name = $data[2];
$quantity = $data[3];
if($product_id!='')
{
$query = $this->db->query("UPDATE `".DB_PREFIX."product` SET model='".$model."',quantity='".(int)$quantity."' WHERE product_id='".$product_id."'");//обновление количества и марки товара
if($name)
{
$query = $this->db->query("UPDATE `".DB_PREFIX."product_description` SET name='".$this->db->escape($name)."' WHERE product_id='".$product_id."'"); // обновление названия товара
}
}
?>
<?php
$product_id = $data[0];
$model = $data[1];
$name = $data[2];
$quantity = $data[3];
if($product_id!='')
{
$query = $this->db->query("UPDATE `".DB_PREFIX."product` SET model='".$model."',quantity='".(int)$quantity."' WHERE product_id='".$product_id."'");//обновление количества и марки товара
if($name)
{
$query = $this->db->query("UPDATE `".DB_PREFIX."product_description` SET name='".$this->db->escape($name)."' WHERE product_id='".$product_id."'"); // обновление названия товара
}
}
?>
Заключение
Итак, в этой статье мы предоставили полное решение системы экспорта / импорта. С помощью этого инструмента пользователи могут редактировать / обновлять свои данные. Это решение очень просто для использования и реализации. Я с нетерпением жду ваших отзывов. Вы можете оставить свои комментарии или вопросы ниже. Спасибо за внимание!