- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/providerbase.php
- Класс: BitrixSaleProviderBase
- Вызов: ProviderBase::getProductProviderData
static function getProductProviderData(array $products, $provider, array $data, array $select = array())
{
$result = array();
foreach ($products as $productData)
{
$productSelect = array_fill_keys($select, true);
$productId = $productData['PRODUCT_ID'];
$currentUseOrderProduct = $data['USE_ORDER_PRODUCT'];
if (isset($productData['IS_NEW']) && $productData['IS_NEW'])
{
$currentUseOrderProduct = false;
}
$fields = $data;
if (isset($productData['IS_ORDERABLE']) && $productData['IS_ORDERABLE'])
{
$fields['CHECK_COUPONS'] = 'Y';
}
else
{
$fields['CHECK_COUPONS'] = 'N';
}
if (isset($productData['IS_BUNDLE_CHILD']) && $productData['IS_BUNDLE_CHILD'])
{
$fields['CHECK_DISCOUNT'] = 'N';
$fields['CHECK_COUPONS'] = 'N';
}
$fields['PRODUCT_ID'] = $productId;
if (isset($productData['SUBSCRIBE']) && $productData['SUBSCRIBE'] === true)
{
unset($productSelect['QUANTITY'], $productSelect['AVAILABLE_QUANTITY']);
$fields['CHECK_QUANTITY'] = 'N';
$fields['AVAILABLE_QUANTITY'] = 'N';
}
$quantityList = array();
if (!empty($productData['QUANTITY_LIST']))
{
$quantityList = $productData['QUANTITY_LIST'];
}
else
{
$quantityList[$productData['BASKET_CODE']] = $productData['QUANTITY'];
}
$basketId = null;
if (!empty($productData['BASKET_ID']))
{
$basketId = $productData['BASKET_ID'];
}
if (intval($basketId) == 0)
{
/** @var BasketItem $basketItem */
$basketItem = $productData['BASKET_ITEM'];
if ($basketItem)
{
$basketId = $basketItem->getId();
}
}
//
if (intval($basketId) > 0)
{
$fields['BASKET_ID'] = $basketId;
}
$hasTrustData = false;
$trustData = static::getTrustData($data['SITE_ID'], $productData['MODULE'], $productData['PRODUCT_ID']);
$resultProductData = array();
if (static::isReadTrustData() === true
&& !empty($trustData) && is_array($trustData))
{
$hasTrustData = true;
$resultProductData = $trustData;
foreach (static::getProductDataRequiredFields() as $requiredField)
{
if (!array_key_exists($requiredField, $resultProductData))
{
$hasTrustData = false;
break;
}
}
if ($hasTrustData && isset($productSelect['PRICE']))
{
foreach (static::getProductDataRequiredPriceFields() as $requiredField)
{
if (!array_key_exists($requiredField, $resultProductData))
{
$hasTrustData = false;
break;
}
}
}
}
$itemCode = $productData['PRODUCT_ID'];
$resultProviderDataList = array();
if(!$hasTrustData)
{
foreach($quantityList as $basketCode => $quantity)
{
if (!empty($resultProviderDataList[$quantity]))
{
$resultProviderDataList[$quantity]['BASKET_CODE'][] = $basketCode;
continue;
}
$requestFields = $fields;
$requestFields['QUANTITY'] = $quantity;
$resultProviderDataList[$quantity] = array(
'BASKET_CODE' => array($basketCode),
'DATA' => ($currentUseOrderProduct ? $provider::OrderProduct(
$requestFields
) : $provider::GetProductData($requestFields))
);
}
}
else
{
if (!isset($productSelect['AVAILABLE_QUANTITY']) && array_key_exists("AVAILABLE_QUANTITY", $resultProductData))
{
unset($resultProductData['AVAILABLE_QUANTITY']);
}
$productQuantity = floatval($resultProductData['QUANTITY']);
$resultProviderDataList[$productQuantity] = array(
'BASKET_CODE' => array($productData['BASKET_CODE']),
'DATA' => $resultProductData
);
}
$priceFields = static::getPriceFields();
foreach ($resultProviderDataList as $quantity => $providerData)
{
if (empty($result[$itemCode]))
{
$result[$itemCode] = $providerData['DATA'];
}
$basketCodeList = $providerData['BASKET_CODE'];
foreach ($basketCodeList as $basketCode)
{
$result[$itemCode]['PRICE_LIST'][$basketCode] = array(
"ITEM_CODE" => $itemCode,
"BASKET_CODE" => $basketCode,
);
if (isset($providerData['DATA']['QUANTITY']) && $providerData['DATA']['QUANTITY'] > 0)
{
$result[$itemCode]['PRICE_LIST'][$basketCode]['QUANTITY'] = $providerData['DATA']['QUANTITY'];
}
if (isset($providerData['DATA']['AVAILABLE_QUANTITY']))
{
$result[$itemCode]['PRICE_LIST'][$basketCode]['AVAILABLE_QUANTITY'] = $providerData['DATA']['AVAILABLE_QUANTITY'];
}
}
foreach ($priceFields as $fieldName)
{
if (isset($providerData['DATA'][$fieldName]))
{
foreach ($basketCodeList as $basketCode)
{
$result[$itemCode]['PRICE_LIST'][$basketCode][$fieldName] = $providerData['DATA'][$fieldName];
}
}
}
}
// $result[$itemCode]['ITEM_CODE'] = $productData['ITEM_CODE'];
if (isset($productData['IS_BUNDLE_PARENT']) && $productData['IS_BUNDLE_PARENT'])
{
$result[$itemCode]["BUNDLE_ITEMS"] = array();
/** @var array $bundleChildList */
$bundleChildDataList = static::getBundleChildItemsByProductData($provider, $productData);
if (!empty($bundleChildDataList) && is_array($bundleChildDataList))
{
$quantity = $productData['QUANTITY'] ?? $productData['QUANTITY_LIST'][$basketCode] ?? 0;
foreach ($bundleChildDataList["ITEMS"] as &$itemData)
{
$itemData['QUANTITY'] = $itemData['QUANTITY'] * $quantity;
}
unset($itemData);
$result[$itemCode]["BUNDLE_ITEMS"] = $bundleChildDataList["ITEMS"];
}
}
}
return $result;
}