- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/providerbase.php
- Класс: BitrixSaleProviderBase
- Вызов: ProviderBase::getProductAvailableQuantity
static function getProductAvailableQuantity(Basket $basketCollection, BasketItem $refreshItem = null)
{
static $proxyProductAvailableQuantity = array();
$resultList = array();
$userId = null;
if (($order = $basketCollection->getOrder()) !== null)
{
$userId = $order->getUserId();
}
$basketList = static::makeArrayFromBasketCollection($basketCollection, $refreshItem);
$basketProviderMap = static::createProviderBasketMap($basketList);
$basketProviderList = static::redistributeToProviders($basketProviderMap);
$context = array();
$productsList = array();
$providerList = array();
$basketCodeIndex = array();
if (!empty($basketProviderList))
{
foreach ($basketProviderList as $provider => $providerBasketItemList)
{
if (array_key_exists("IBXSaleProductProvider", class_implements($provider)))
{
foreach ($providerBasketItemList as $providerBasketItemData)
{
$proxyProductKey = $providerBasketItemData['PRODUCT_ID']."|".$userId;
if (!empty($proxyProductAvailableQuantity[$proxyProductKey]) && is_array($proxyProductAvailableQuantity[$proxyProductKey]))
{
$resultProductData = $proxyProductAvailableQuantity[$proxyProductKey];
}
else
{
$resultProductData = $resultProductData = $provider::getProductAvailableQuantity($providerBasketItemData['PRODUCT_ID'], $userId);
$proxyProductAvailableQuantity[$proxyProductKey] = $resultProductData;
}
$basketCode = $providerBasketItemData['BASKET_ITEM']->getBasketCode();
$resultList[$basketCode] = $resultProductData;
}
}
elseif (class_exists($provider))
{
if (empty($context))
{
if ($order)
{
$context = array(
'USER_ID' => $order->getUserId(),
'SITE_ID' => $order->getSiteId(),
'CURRENCY' => $order->getCurrency(),
);
}
else
{
global $USER;
$context = array(
'USER_ID' => $USER->getId(),
'SITE_ID' => SITE_ID,
'CURRENCY' => CurrencyCurrencyManager::getBaseCurrency(),
);
}
}
$providerClass = new $provider($context);
if (!$providerClass instanceof SaleProviderBase)
{
continue;
}
/** @var BasketItem $basketItem */
foreach ($providerBasketItemList as $providerBasketItemData)
{
$basketItem = $providerBasketItemData['BASKET_ITEM'];
$productId = $basketItem->getProductId();
$basketCode = $basketItem->getBasketCode();
$basketCodeIndex[$productId][] = $basketItem->getBasketCode();
$providerList[$provider] = $providerClass;
if (empty($productsList[$provider][$productId]))
{
$productsList[$provider][$productId] = $providerBasketItemData;
}
$productsList[$provider][$productId]['QUANTITY_LIST'][$basketCode] = $basketItem->getQuantity();
$resultList[$basketCode] = 0;
}
}
else
{
foreach ($providerBasketItemList as $providerBasketItemData)
{
$resultProductData = CSaleBasket::ExecuteCallbackFunction(
$providerBasketItemData['CALLBACK_FUNC'],
$providerBasketItemData['MODULE'],
$providerBasketItemData['PRODUCT_ID']
);
$basketCode = $providerBasketItemData['BASKET_ITEM']->getBasketCode();
$resultList[$basketCode] = $resultProductData;
}
}
}
if (!empty($productsList))
{
foreach ($productsList as $providerName => $products)
{
/** @var SaleProviderBase $providerClass */
$providerClass = $providerList[$providerName];
$r = $providerClass->getAvailableQuantity($products);
if ($r->isSuccess())
{
$resultData = $r->getData();
if (!empty($resultData['AVAILABLE_QUANTITY_LIST']))
{
foreach ($resultData['AVAILABLE_QUANTITY_LIST'] as $productId => $availableQuantity)
{
if (!empty($basketCodeIndex[$productId]))
{
foreach ($basketCodeIndex[$productId] as $basketCode)
{
$resultList[$basketCode] = $availableQuantity;
}
}
}
}
}
}
}
}
return $resultList;
}