Экспорт 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>
|
Всем интересных задач!
