При разработке сайта на платформе Bitrix, часто перед разработчиком встаёт задача обмена/выгрузки данных. Одной из таких задач может быть выгрузка информации по заказу из личного кабинета покупателя Bitrix.
Например можно остановиться на выгрузке в файл xls, тем более у Bitrix повсеместно в «админке» используется данная функция. Суть встроенной функции такова, что формируется обычный html документ, который затем выгружается как xls файл.
# Название функции из Ядра Bitrix — DisplayExcel (Путь: «/bitrix/modules/main/interface/admin_list.php«).
Минусы использования DisplayExcel:
— всё же это html структура документа и некоторые программы по чтению таких xls файлов будут создавать дополнительные диалоги при открытии
— xlsx всё же более современный формат, чем xls и поддержа xlsx распространена во многих языках программирования
Итак, будем формировать файлы заказа в формате xlsx. Для этого возьмём библиотеку с github (https://github.com/mk-j/PHP_XLSXWriter)
Ниже функция с пояснениями:
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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
/** * Формирует список товаров в заказе и выгружает данные в xlsx файл * Принимает номер заказа * @global object $APPLICATION * @param int $order_num */ function exportXlsx($order_num) { global $APPLICATION; $book = 'list1'; //Название книги в файле $order = Sale\Order::load($order_num); //Объект заказа Bitrix D7 $order_date = $order->getDateInsert()->toString(); //строка - дата создания заказа $basket = $order->getBasket(); //Объект корзины Bitrix D7 include_once 'xlsxwriter.class.php'; //Подключение библиотеки для манипуляции с xlsx $filename = "order_" . $order_num . ".xlsx"; //Имя сформированного файла /** * Формируем заголовки отправляемые в браузер (Что бы пользователю был предложен диалог сохранения файла) */ header('Content-disposition: attachment; filename="' . XLSXWriter::sanitize_filename($filename) . '"'); header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); header('Content-Transfer-Encoding: binary'); header('Cache-Control: must-revalidate'); header('Pragma: public'); //Шапка формируемого файла $header = array( 'Код товара' => 'string', //Название колонки - тип данных 'Наименование' => 'string', 'Цена' => 'price', 'Количество' => 'integer', 'Номер заказа' => 'integer', 'Дата заказа' => 'string', ); //Конвертация заголовков в UTF-8 если ваш сайт Bitrix в кодировке Windows-1251 if (SITE_CHARSET == 'windows-1251') { $header = array( ($APPLICATION->ConvertCharset('Код товара', SITE_CHARSET, 'UTF-8')) => 'string', ($APPLICATION->ConvertCharset('Наименование', SITE_CHARSET, 'UTF-8')) => 'string', ($APPLICATION->ConvertCharset('Цена', SITE_CHARSET, 'UTF-8')) => 'price', ($APPLICATION->ConvertCharset('Количество', SITE_CHARSET, 'UTF-8')) => 'integer', ($APPLICATION->ConvertCharset('Номер заказа', SITE_CHARSET, 'UTF-8')) => 'integer', ($APPLICATION->ConvertCharset('Дата заказа', SITE_CHARSET, 'UTF-8')) => 'string', ); } $rows = []; //Массив данных для записи в файл foreach ($basket->getBasketItems() as $item) {//Обход элементов корзины Bitrix D7 $name = $item->getField('NAME'); //Масив данных одной строки файла $tmp_row = [ $item->getField('PRODUCT_XML_ID'), //Код товара $name, //Наименование $item->getPrice(), //Цена $item->getQuantity(), //Количество $order_num, //Номер заказа $order_date, //Дата заказа ]; //Конвертация данных в UTF-8 если ваш сайт Bitrix в кодировке Windows-1251 if (SITE_CHARSET == 'windows-1251') { $tmp_row = $APPLICATION->ConvertCharsetArray($tmp_row, SITE_CHARSET, 'UTF-8'); } $rows[] = $tmp_row; } $writer = new XLSXWriter(); $writer->setAuthor('Coderun'); //Автор документа $writer->writeSheetHeader($book, $header); //Установка шапки для указанной книги в документе //Добавление строки из ранее сформированного массива foreach ($rows as $row) { $writer->writeSheetRow($book, $row); } //Запись файла в поток вывода $writer->writeToStdOut(); } |
Результатом работы функции будет диалог сохранения файла в браузере. Сам же файл будет содержать шапку с названием колонок и построчно информацию о товарах заказа.
При небольшой переделке данной функции, её можно использовать не только при получении заказов Bitrix, но и в любом другом PHP коде.