Рассмотрим пример выгрузки каталога товаров в формате 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, и данную выгрузку можно отдавать дальше.