Довольно часто стоит задача создания запроса с одного сайта на другой для получения определенных данных. У задачи есть большое количество возможных реализаций, я покажу одну из них.
Сама задача была приблизительно следущая: зная артикулы одного сайта (для удобства назовем его "сайт-клиент"), нужно было получить цены и наличие с другого сайта ("сайт-сервер"). Сайты соотвественно находятся на Битриксе, но лицензии у них разные (как и хостинг).
Пример кода на сайте-клиенте:
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
}