Как получить количество товара на нескольких складах, товар может быть простым и с торговыми предложениями.
Для получения списка складов нужно использовать функцию CCatalogStore::GetList.
$select_fields = Array();
$filter = Array("ACTIVE" => "Y");
$resStore = CCatalogStore::GetList(array(),$filter,false,false,$select_fields);
while($sklad = $resStore->Fetch())
{
$stores[] = $sklad;
}
echo "<pre>";
print_r($stores);
echo "</pre>";
Функция много чего выдаст:
[ID] => 2
[ACTIVE] => Y
[TITLE] => Склад № 2 (Салон)
[PHONE] => 8-000000-0-00-00
[SCHEDULE] => С 9-00 до 16-30 ч. без перерыва на обед
[ADDRESS] => 000000, Усть-Пердюйская область, г. Усть-Пердюйск, ул. Леннона, д.13
[DESCRIPTION] =>
[GPS_N] => 0
[GPS_S] => 0
[IMAGE_ID] => 481497
[DATE_CREATE] => 16.04.2015 12:48:20
[DATE_MODIFY] => 26.11.2015 22:59:23
[USER_ID] => 1
[XML_ID] => 84ee816c-ad2f-11e0-a62e-0030482d5029
[SORT] => 100
[EMAIL] =>
[ISSUING_CENTER] => Y
[SHIPPING_CENTER] => Y
[SITE_ID] => s1
но сейчас нужен только список ID складов.
После получения массива с ID складов можно приступать к проверке количества товара на складе.
Для этого понадобится функция CCatalogStoreProduct::GetList.
$arFilter = Array("PRODUCT_ID"=>$pid,"STORE_ID"=>$stores);
$res = CCatalogStoreProduct::GetList(Array(),$arFilter,false,false,Array());
while($arRes = $res->GetNext())
{
$sum[] = $arRes['AMOUNT'];
}
Эта функция также возвращает массив значений из которых нужно только количество ($arRes['AMOUNT']).
На базе этого была написана рекурсивная функция которая учитывала простые товары и торговые предложения.
function collectCountProductsOnStorages($pid, $arResult)
{
if(CModule::IncludeModule('catalog')){
// список ID складов
$select_fields = Array('ID', 'ACTIVE');
$filter = Array("ACTIVE" => "Y");
$resStore = CCatalogStore::GetList(array(),$filter,false,false,$select_fields);
while($sklad = $resStore->Fetch())
{
$stores[] = $sklad['ID'];
}
// собственно сами склады
$arFilter = Array("PRODUCT_ID"=>$pid,"STORE_ID"=>$stores);
$res = CCatalogStoreProduct::GetList(Array(),$arFilter,false,false,Array());
while($arRes = $res->GetNext())
{
$sum[] = $arRes['AMOUNT'];
}
if(count($arResult['OFFERS']) > 0)
{
foreach ($arResult['OFFERS'] as $item)
{
$offer_sum[] = round(collectCountProductsOnStorages($item['ID']), 0);
}
return array_sum($offer_sum);
}
else
{
return array_sum($sum);
}
}
}
На входе ID товара и массив $arResult.
Уже в процессе написания статьи я понял что ID отдельно можно было не передавать, все значения содержатся в $arResult, но не хочется прямо сейчас переписывать.
Функция проверяет наличие элемента OFFERS в массиве и если его находит, вызывает сама себя и обходит предложения.
По ID товара идет запрос к складам и вытягивается количество, которое в моем случае суммируется (так было нужно). Числа с десятичной частью округлялись до целых (не спрашивайте почему на складе 2,75 резинового фаллоимитатора и 1,6 пластмассового =))). Просто некоторые товары были не штучные а весовые что-ли, как-то так.