От автора: приветствую вас, друзья. Итак, мы продолжаем цикл статей, посвященных знакомству с одной из популярнейших CMS для создания интернет-магазинов – OpenCart (Оперкарт). В этой и нескольких следующих статьях мы будем работать непосредственно с кодом CMS и реализуем выгрузку товаров из заказов за выбранный период в Excel. В этой статье мы занимаемся написанием обработчика, формирующего выгрузку в Excel.
Итак, в прошлой статье мы составили ajax-запрос, отправляющий даты выборки на сервер. На сервере мы создали в контроллере ControllerSaleOrder экшен wfm_export, где пока что находится простейший код, распечатывающий полученные данные. Теперь заменим данный код следующим:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | 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 вы можете посмотреть этот урок.

Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC
В курсе 39 уроков | 15 часов видео | исходники для каждого урока
Получить курс сейчас!Теперь давайте создадим метод getOrdersForExport в модели ModelSaleOrder, которая находится в файле admin\model\sale\order.php.
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 с выгрузкой проданных товаров.
Собственно, наш скрипт, в целом, — готов. Остается лишь причесать код и оформить его в виде модуля при желании. Ну а мы на этом остановимся. Больше об OpenCart вы можете узнать из наших бесплатных или платных уроков.

Хотите узнать, что необходимо для создания сайта?
Посмотрите видео и узнайте пошаговый план по созданию сайта с нуля!
Смотреть
Спасибо большое. А как добавить данные покупателя?
Найти таблицу в БД, в которой хранятся данные покупателя и расширить sql-запрос в модели, чтобы он выбирал вместе с заказом и данные покупателя.
Спасибо, получилось. Еще вопрос. Как вывести если несколько разных позиций в одном заказе (сейчас выводит только одну из позиций).
Сейчас возможности протестировать нет, но насколько я помню, выбираться должны все позиции заказа. Данный модуль я писал в свое время на заказ и у меня бы просто не приняли его, если бы выбиралась только 1 позиция.
Да действительно, сразу не обратил внимание из-за того что выводилось не по порядку. Но это уже можно в Ексель сортировать. Спасибо большое!
Пожалуйста)
Сортировку можно попробовать в запросе поправить, заменив сортировку по дате на сортировку по ID заказа: ORDER BY o.order_id
Спасибо большое! Пошел я учить PHP)
Пожалуйста)
Здравствуйте! Как адаптировать код под opencart 3? Попытался изменить ajax url чтобы он подходил под opencart 3 на такой: «index.php?route=sale/order/wfm_export&user_token={{ user_token }}», весь код который вы приводите выше и в уроках до этого, я внедрил. В консоли выдает ошибку «Unexpected token ‘<'". И по итогу получил просто что-то странное (вот скринhttp://prntscr.com/q78i8x ).
Здравствуйте. Под OpenCart 3 данное расширение я не писал, поэтому нюансов не подскажу. Но ошибка сообщает, что токен не определен, поэтому стоит проверить этот момент.
подскажите, пожалуйста, где его можно определить? сколько будет стоить адаптация вашего кода под OC3?
Нисколько, я на заказ сейчас не работаю. А токен передается во втором уроке.
Аналоги стоят дорого, а нужна лишь эта функция, может быть можно что-то придумать? Или подскажите кто сможет адаптировать данный код под ОС3?
Попробуйте обратиться на сайты фриланса, там огромное количество исполнителей, которые готовы помочь за оплату.
удалось адаптировать, я оказывается поместил форму под id фильтра, а так нельзя было делать и он все отправки ajax миксовал с фильтром…
Код под OC подходит, только в url ajax нужно заменить «index.php?route=sale/order/wfm_export&token=» на «index.php?route=sale/order/wfm_export&user_token={{ user_token }}» и всё заработает:) может кому поможет данный комментарий.
Отлично! И спасибо за решение, возможно, кому-то действительно будет полезно.