Экспорт xml файла с ценами и остатками по товарам.
Приветствую господа! Недавно столкнулся с задачей экспорта цен и остатков по товарам. Хочу поделиться своим решением, вдруг кому пригодится...
Итак, имеем около 500 товаров. Разом обработать такое кол-во элементов не позволяли ресурсы сервера, выходит надо разбивать по-шагам. С выбором формата экспорта, решил использовать xml, сформировав html таблицу и задав расширение .xml (Битриксовый экспорт в excel именно так и работает). Поскольку экспорт запускается вручную, то по-шаговость сделал на js.
Всем интересных задач!
Приветствую господа! Недавно столкнулся с задачей экспорта цен и остатков по товарам. Хочу поделиться своим решением, вдруг кому пригодится...
Итак, имеем около 500 товаров. Разом обработать такое кол-во элементов не позволяли ресурсы сервера, выходит надо разбивать по-шагам. С выбором формата экспорта, решил использовать xml, сформировав html таблицу и задав расширение .xml (Битриксовый экспорт в excel именно так и работает). Поскольку экспорт запускается вручную, то по-шаговость сделал на js.
<? // Подключаем ядро Битрикса require($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php'); if(!CModule::IncludeModule("iblock")) { echo 'Модуль Информационных блоков не установлен!'; return false; } global $APPLICATION; // формируемый xml-Файл $file = '/upload/prices_report.xls'; // Параметры для по-шаговости $step = 50; $curID = 0; $curCnt = (isset($_REQUEST['PRICE_REPORT_CUR_CNT']) && $_REQUEST['PRICE_REPORT_CUR_CNT'] > 0) ? $_REQUEST['PRICE_REPORT_CUR_CNT'] : 0; $arFilter = Array( "IBLOCK_ID"=> IBLOCK_ID, "!PROPERTY_KOD_TOVARA" => false ); $arSelect = Array( 'CATALOG_GROUP_'.PRICE_TYPE1, 'CATALOG_GROUP_'.PRICE_TYPE2, 'CATALOG_GROUP_'.PRICE_TYPE3, 'ID', 'IBLOCK_ID', 'PROPERTY_KOD_TOVARA', 'NAME' ); if(!isset($_SESSION['PRICE_REPORT_STARTED'])) { // Защита от первичного запуска с параметрами. if(isset($_REQUEST['PRICE_REPORT_CUR_ID']) || isset($_REQUEST['PRICE_REPORT_CUR_CNT'])) { LocalRedirect($APPLICATION->GetCurPage()); } $content = '<ht ml> <head> <title></title> <met a http-equiv="Content-Type" content="text/html; charset=UTF-8"> <st yle> td {mso-number-format:\@;} .number0 {mso-number-format:0;} .number2 {mso-number-format:Fixed;} </style> </head>'; $content .= '<body><p>Дата формирования отчета: '.date("d.m.Y H:i:s").'</p>'; $content .= '<table border="1"> <tr> <th><b>Товар</b></th> <th><b>Закупочная цена</b></th> <th><b>Розничная цена</b></th> <th><b>Цена в магазине</b></th> <th><b>Цена конкурентов</b></th> <th><b>Доступное кол-во</b></th> </tr>'; file_put_contents($_SERVER['DOCUMENT_ROOT'].$file, $content); $_SESSION['PRICE_REPORT_STARTED'] = 'Y'; } // ID последнего элемента инфоблока $lastElementID = CIBlockElement::GetList(Array('ID' => 'DESC'), $arFilter, false, Array("nPageSize"=>1), Array('ID'))->GetNext()['ID']; // Всего элементов $cntElements = CIBlockElement::GetList(Array('ID' => 'ASC'), $arFilter, Array(), false, Array('ID')); $rsItems = CIBlockElement::GetList(Array('ID' => 'ASC'), array_merge_recursive(Array('>ID' => $_REQUEST['PRICE_REPORT_CUR_ID']) ,$arFilter), false, Array("nPageSize"=>$step), $arSelect); while($arItem = $rsItems->GetNext()) { $content = '<tr>'; $content .= '<td>'.$arItem['NAME'].' ('.$arItem["PROPERTY_KOD_TOVARA_VALUE"].')</td>'; $content .= '<td>'.$arItem['CATALOG_PURCHASING_PRICE'].'</td>'; $content .= '<td>'.$arItem['CATALOG_PRICE_'.PRICE_TYPE1].'</td>'; $content .= '<td>'.$arItem['CATALOG_PRICE_'.PRICE_TYPE2].'</td>'; $content .= '<td>'.$arItem['CATALOG_PRICE_'.PRICE_TYPE3].'</td>'; $content .= '<td>'.$arItem['CATALOG_QUANTITY'].'</td>'; $content .= '</tr>'; file_put_contents($_SERVER['DOCUMENT_ROOT'].$file, $content, FILE_APPEND); $curID = $arItem['ID']; $curCnt ++; } ?> <ht ml> <head> <?$APPLICATION->ShowHead();?> </head> <body> <p>Файл формируется. Подождите...</p> Обработано: <?=$curCnt?> из <?=$cntElements?> <? if($lastElementID == $curID) { $content = '</table></body></html>'; file_put_contents($_SERVER['DOCUMENT_ROOT'].$file, $content, FILE_APPEND); unset($_SESSION['PRICE_REPORT_STARTED']); ?> <sc ript> window.onl oad = function() { window.location.href = '<?=$file?>'; }; </sc ript> <? } else { // Повторный вызов с параметрами ?> <sc ript> window.onl oad = function() { window.location.href = '<?=$APPLICATION->GetCurPage();?>?PRICE_REPORT_CUR_ID=<?=$curID?>&PRICE_REPORT_CUR_CNT=<?=$curCnt?>'; }; </sc ript> <? } ?> </body> </html> |
Всем интересных задач!