Довольно часто стоит задача создания запроса с одного сайта на другой для получения определенных данных. У задачи есть большое количество возможных реализаций, я покажу одну из них.
Сама задача была приблизительно следущая: зная артикулы одного сайта (для удобства назовем его "сайт-клиент"), нужно было получить цены и наличие с другого сайта ("сайт-сервер"). Сайты соотвественно находятся на Битриксе, но лицензии у них разные (как и хостинг).
Пример кода на сайте-клиенте:
require_once($_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/include/prolog_before.php"); if(CModule::IncludeModule("iblock") && CModule::IncludeModule("sale") && CModule::IncludeModule("catalog")){ $arArticul = array(); $arSelect = Array("ID", "IBLOCK_ID", "NAME", "PROPERTY_G_ART"); $arFilter = Array("IBLOCK_ID"=>array(1, 2), "ACTIVE"=>"Y", "!=PROPERTY_G_ART" => false); $res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect); while($ob = $res->Fetch()) { $arArticul[] = $ob["PROPERTY_G_ART_VALUE"]; } } // Отправляем CURL-запрос $myCurl = curl_init(); curl_setopt_array($myCurl, array( CURLOPT_URL => 'http://www.test.ru/test/sync.php', // Адрес куда мы отправляем запрос CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query(array("ARTICUL"=>$arArticul)) // POST - параметры передачи )); $response = curl_exec($myCurl); curl_close($myCurl); // Декодируем JSON $products = json_decode($response, true); // второй параметр переводит данные в массив, а не объект $arSelect = Array("ID", "IBLOCK_ID", "NAME", "PROPERTY_G_ART"); $arFilter = Array("IBLOCK_ID"=>array(1, 2), "PROPERTY_G_ART" => $arArticul); $resProd = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect); while($obProd = $resProd->Fetch()) { if(!empty($products[$obProd["PROPERTY_G_ART_VALUE"]])) // если в ответе есть нужный артикул { $artProduct = $obProd["PROPERTY_G_ART_VALUE"]; $priceProduct = $products[$obProd["PROPERTY_G_ART_VALUE"]]["PRICE"]; $quantityProduct = $products[$obProd["PROPERTY_G_ART_VALUE"]]["QUANTITY"]; CCatalogProduct::Update($obProd["ID"], array('QUANTITY'=>$quantityProduct)); // Обновим наличие // Обновим цену $arFieldsPrice = Array( "PRODUCT_ID" => $obProd["ID"], "CATALOG_GROUP_ID" => 1, "PRICE" => $priceProduct, "CURRENCY" => "RUB", ); $resPrice = CPrice::GetList(array(), array("PRODUCT_ID" => $obProd["ID"], "CATALOG_GROUP_ID" => 1)); if ($arrPrice = $resPrice->Fetch()){ CPrice::Update($arrPrice["ID"], $arFieldsPrice); } else { CPrice::Add($arFieldsPrice); } } }
Пример кода на сайте-сервере:
require_once($_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/include/prolog_before.php"); if(CModule::IncludeModule("iblock") && CModule::IncludeModule("sale") && !empty($_REQUEST["ARTICUL"])){ $arArticul = $_REQUEST["ARTICUL"]; $arProd = array(); $arSelect = Array("ID", "IBLOCK_ID", "NAME", "PROPERTY_G_ART", "CATALOG_GROUP_1", "CATALOG_STORE_AMOUNT_1", "CATALOG_STORE_AMOUNT_2"); $arFilter = Array("IBLOCK_ID"=>array(1, 2), "ACTIVE"=>"Y", "PROPERTY_G_ART" => $arArticul); $res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect); while($ob = $res->Fetch()) { $arProd[$ob["PROPERTY_G_ART_VALUE"]] = array( "PROPERTY_G_ART" => $ob["PROPERTY_G_ART_VALUE"], "PRICE" => $ob["CATALOG_PRICE_1"], // мне нужно было наличие вывыести по складам, поэтому такое выражение ниже "QUANTITY" => $ob["CATALOG_STORE_AMOUNT_1"] + $ob["CATALOG_STORE_AMOUNT_2"] ); } echo json_encode($arProd); // кодируем данные для передачи в JSON }