Битрикс – выгрузка каталога в JSON

Рассмотрим пример выгрузки каталога товаров в формате JSON, какие могут быть сложности, и что с оптимизацией?

Битрикс – как выгрузить каталог в формате JSON

Сразу покажу исходный код. Задача – выводить стандартные поля каталога, фото, цену, скидку, раздел, имя и ID:

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
CModule::IncludeModule("iblock");
CModule::IncludeModule("catalog");

header('Content-Type: application/json');

$filePath 	= ($_SERVER['HTTPS']) ? 'https' : 'http';
$IBLOCK_ID 	= 14;
$userGroup 	= [2];
$quantity 	= 1;
$renewal 	= 'N';
$arResult 	= [];

$res = CIBlockElement::GetList (
	Array("ID" => "ASC"),
	Array("IBLOCK_ID" => $IBLOCK_ID, "ACTIVE" => "Y"),
	false,
	false,
	Array('ID', 'NAME', 'DETAIL_PICTURE', 'PREVIEW_TEXT', 'DETAIL_TEXT', 'IBLOCK_SECTION_ID')
);
while ($arItem = $res->GetNext()) {
	// category
	$category = '';
	$resSection = CIBlockSection::GetByID($arItem['IBLOCK_SECTION_ID']);
	if ($ar_res = $resSection->GetNext()) {
		$category = $ar_res['NAME'];
	}

	// price
	$productID = $arItem['ID'];
	$arPrice = CCatalogProduct::GetOptimalPrice(
		$productID,
		$quantity,
		$userGroup,
		$renewal
	);

	$item['id'] 			= $arItem['ID'];
	$item['name'] 			= trim($arItem['NAME']);
	$item['jpg_url'] 		= $filePath.'://'.$_SERVER['SERVER_NAME'].CFile::GetPath($arItem['DETAIL_PICTURE']);
	$item['description'] 		= ($arItem['DETAIL_TEXT']) ? $arItem['DETAIL_TEXT'] : $arItem['PREVIEW_TEXT'];
	//$item['weight'] 		= "200/40г.";
	$item['categories'] 		= $category;
	$item['categories_id'] 		= $arItem['IBLOCK_SECTION_ID'];
	$item['nominal'] 		= $arPrice['RESULT_PRICE']['DISCOUNT_PRICE'];
	$item['discount'] 		= $arPrice['RESULT_PRICE']['DISCOUNT'];

	$arResult[] = $item;
}

//pr($arResult);

echo json_encode($arResult);

header(‘Content-Type: application/json’); – обязательно ставим этот заголовок чтобы получить на выходе нужный формат.

В данном примере отсутствуют торговые предложения SKU, но при желании можно подтянуть и их, главное чтобы сервер не оборвал скрипт на большом каталоге 🙂 .

Обратите внимание на пункт с категориями – делать на каждой итерации запрос по ID, не есть хорошо. Я бы рекомендовал этот момент переписать на отдельный метод – CIBlockSection::GetList. При помощи него собрать массив из id => name и забирать имя только таким способом.

Блок с ценами мне нравится писать именно так как в скрипте, но в некоторых случаях можно добавить в параметрах CATALOG_GROUP_1 (где 1 – ваш тип цены).

echo json_encode($arResult); – пишет обычный PHP массив в JSON, и данную выгрузку можно отдавать дальше.

автор: Dmitriy

З 2011 року займаюся веб-розробкою. Зараз я – PHP Full Stack Developer.
Обговорити ваш проект, а також дізнатися більше про мене ви можете на цьому сайті:
dev.forwww.com

Email: dmitriyribka@gmail.com

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *