Битрикс — выгрузка каталога в 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 года. Посмотреть некоторые из моих работ, а также узнать чуть больше обо мне, вы можете на forwww.ru.

- Создание сайтов на 1С-Битрикс любой сложности
- Вёрстка макетов Figma, Photoshop, Zeplin
- Поддержка проектов на Битриксе
- Разработка нового функционала для сайта
- Парсинг данных
- Выгрузка из файлов в формате XML, YML, XLS, XLSX, CSV, JSON
- Интеграция по API со сторонними сервисами
и многое другое

E-mail: dmitriyribka@gmail.com

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *