OpenCart. Выгрузка заказов в Excel. Часть 3
18 Мар 2023г. в 15:45Итак, в прошлой статье мы составили ajax-запрос, отправляющий даты выборки на сервер. На сервере мы создали в контроллере ControllerSaleOrder экшен wfm_export, где пока что находится простейший код, распечатывающий полученные данные. Теперь заменим данный код следующим:
public function wfm_export(){
if(isset($_GET['wfm_start_date'], $_GET['wfm_end_date'])){
$wfm_start_date = trim($_GET['wfm_start_date']);
$wfm_end_date = trim($_GET['wfm_end_date']);
if( empty($wfm_start_date) || empty($wfm_end_date)){
die('Error! Field required');
}
$file = DIR_SYSTEM . '../wfm_export_orders/file.xlsx';
require_once DIR_SYSTEM . '../wfm_export_orders/phpexcel/Classes/PHPExcel.php';
$this->load->model('sale/order');
$results = $this->model_sale_order->getOrdersForExport($wfm_start_date, $wfm_end_date);
if($results){
$objCreate = new PHPExcel;
$page = $objCreate->setActiveSheetIndex(0);
$i = 2;
$style_header = [
'font' => [
'bold' => true,
'size' => 12,
],
'alignment' => [
'horizontal' => PHPExcel_STYLE_ALIGNMENT::HORIZONTAL_CENTER,
'vertical' => PHPExcel_STYLE_ALIGNMENT::VERTICAL_CENTER,
],
'fill' => [
'type' => PHPExcel_STYLE_FILL::FILL_SOLID,
'color'=> [
'rgb' => 'CFCFCF'
]
]
];
$page->setCellValue("A1", '№ заказа');
$page->setCellValue("B1", 'Товар');
$page->setCellValue("C1", 'Цена');
$page->setCellValue("D1", 'Кол-во');
$page->setCellValue("E1", 'Итого');
$page->setCellValue("F1", 'Дата заказа');
$page->getStyle('A1:F1')->applyFromArray($style_header);
foreach($results as $item){
$page->setCellValue("A{$i}", $item['order_id']);
$page->setCellValue("B{$i}", $item['name']);
$page->setCellValue("C{$i}", $item['price']);
$page->setCellValue("D{$i}", $item['quantity']);
$page->setCellValue("E{$i}", $item['total']);
$page->setCellValue("F{$i}", $item['date_added']);
$i++;
}
$page->getColumnDimension('A')->setAutoSize(true);
$page->getColumnDimension('B')->setAutoSize(true);
$page->getColumnDimension('C')->setAutoSize(true);
$page->getColumnDimension('D')->setAutoSize(true);
$page->getColumnDimension('E')->setAutoSize(true);
$page->getColumnDimension('F')->setAutoSize(true);
$objWriter = PHPExcel_IOFactory::createWriter($objCreate, 'Excel2007');
$objWriter->save($file);
echo "<p>Файл создан! <a href='/wfm_export_orders/file.xlsx' class='text-danger'>Скачать</a></p>";
}else{
echo 'Заказы за указанный период не найдены...';
}
die;
}
}
public function wfm_export(){
if(isset($_GET['wfm_start_date'], $_GET['wfm_end_date'])){
$wfm_start_date = trim($_GET['wfm_start_date']);
$wfm_end_date = trim($_GET['wfm_end_date']);
if( empty($wfm_start_date) || empty($wfm_end_date)){
die('Error! Field required');
}
$file = DIR_SYSTEM . '../wfm_export_orders/file.xlsx';
require_once DIR_SYSTEM . '../wfm_export_orders/phpexcel/Classes/PHPExcel.php';
$this->load->model('sale/order');
$results = $this->model_sale_order->getOrdersForExport($wfm_start_date, $wfm_end_date);
if($results){
$objCreate = new PHPExcel;
$page = $objCreate->setActiveSheetIndex(0);
$i = 2;
$style_header = [
'font' => [
'bold' => true,
'size' => 12,
],
'alignment' => [
'horizontal' => PHPExcel_STYLE_ALIGNMENT::HORIZONTAL_CENTER,
'vertical' => PHPExcel_STYLE_ALIGNMENT::VERTICAL_CENTER,
],
'fill' => [
'type' => PHPExcel_STYLE_FILL::FILL_SOLID,
'color'=> [
'rgb' => 'CFCFCF'
]
]
];
$page->setCellValue("A1", '№ заказа');
$page->setCellValue("B1", 'Товар');
$page->setCellValue("C1", 'Цена');
$page->setCellValue("D1", 'Кол-во');
$page->setCellValue("E1", 'Итого');
$page->setCellValue("F1", 'Дата заказа');
$page->getStyle('A1:F1')->applyFromArray($style_header);
foreach($results as $item){
$page->setCellValue("A{$i}", $item['order_id']);
$page->setCellValue("B{$i}", $item['name']);
$page->setCellValue("C{$i}", $item['price']);
$page->setCellValue("D{$i}", $item['quantity']);
$page->setCellValue("E{$i}", $item['total']);
$page->setCellValue("F{$i}", $item['date_added']);
$i++;
}
$page->getColumnDimension('A')->setAutoSize(true);
$page->getColumnDimension('B')->setAutoSize(true);
$page->getColumnDimension('C')->setAutoSize(true);
$page->getColumnDimension('D')->setAutoSize(true);
$page->getColumnDimension('E')->setAutoSize(true);
$page->getColumnDimension('F')->setAutoSize(true);
$objWriter = PHPExcel_IOFactory::createWriter($objCreate, 'Excel2007');
$objWriter->save($file);
echo "<p>Файл создан! <a href='/wfm_export_orders/file.xlsx' class='text-danger'>Скачать</a></p>";
}else{
echo 'Заказы за указанный период не найдены...';
}
die;
}
}
Здесь мы подключаем библиотеку PHPExcel, вызываем из модели метод getOrdersForExport, которую добавим ниже, и формируем файл Excel. Напоминаю, по работе с библиотекой PHPExcel вы можете посмотреть этот урок.
Теперь давайте создадим метод getOrdersForExport в модели ModelSaleOrder, которая находится в файле admin\model\sale\order.php.
public function getOrdersForExport($wfm_start_date, $wfm_end_date){
$sql = "SELECT o.order_id, o.date_added, op.name, op.quantity, op.price, op.total
FROM `" . DB_PREFIX . "order` o
LEFT JOIN `" . DB_PREFIX . "order_product` op
ON o.order_id = op.order_id
WHERE DATE(o.date_added) BETWEEN DATE('" . $this->db->escape($wfm_start_date) . "') AND DATE('" . $this->db->escape($wfm_end_date) . "')
ORDER BY DATE(o.date_added)";
$query = $this->db->query($sql);
return $query->rows;
}
1
2
3
4
5
6
7
8
9
10
11
public function getOrdersForExport($wfm_start_date, $wfm_end_date){
$sql = "SELECT o.order_id, o.date_added, op.name, op.quantity, op.price, op.total
FROM `" . DB_PREFIX . "order` o
LEFT JOIN `" . DB_PREFIX . "order_product` op
ON o.order_id = op.order_id
WHERE DATE(o.date_added) BETWEEN DATE('" . $this->db->escape($wfm_start_date) . "') AND DATE('" . $this->db->escape($wfm_end_date) . "')
ORDER BY DATE(o.date_added)";
$query = $this->db->query($sql);
return $query->rows;
}
Осталось протестировать код. Если мы нигде не ошиблись, тогда в результате работы написанного кода мы получим для скачивания файл Excel с выгрузкой проданных товаров.