- Модуль: iblock
- Путь к файлу: ~/bitrix/modules/iblock/lib/component/base.php
- Класс: BitrixIblockComponentBase
- Вызов: Base::calculateItemPrices
protected function calculateItemPrices(array &$items)
{
if (empty($items))
return;
$enableCompatible = $this->isEnableCompatible();
if ($enableCompatible)
$this->initCompatibleFields($items);
foreach (array_keys($items) as $index)
{
$id = $items[$index]['ID'];
if (!isset($this->calculatePrices[$id]))
continue;
if (empty($this->prices[$id]))
continue;
$productPrices = $this->prices[$id];
$result = array(
'ITEM_PRICE_MODE' => null,
'ITEM_PRICES' => array(),
'ITEM_PRICES_CAN_BUY' => false
);
if ($this->arParams['FILL_ITEM_ALL_PRICES'])
$result['ITEM_ALL_PRICES'] = array();
$priceBlockIndex = 0;
if (!empty($productPrices['QUANTITY']))
{
$result['ITEM_PRICE_MODE'] = CatalogProductTable::PRICE_MODE_QUANTITY;
$ratio = current($this->ratios[$id]);
foreach ($this->quantityRanges[$id] as $range)
{
$priceBlock = $this->calculatePriceBlock(
$items[$index],
$productPrices['QUANTITY'][$range['HASH']],
$ratio['RATIO'],
$this->arParams['USE_PRICE_COUNT'] || $this->checkQuantityRange($range)
);
if (!empty($priceBlock))
{
$minimalPrice = ($this->arParams['FILL_ITEM_ALL_PRICES']
? $priceBlock['MINIMAL_PRICE']
: $priceBlock
);
if ($minimalPrice['QUANTITY_FROM'] === null)
{
$minimalPrice['MIN_QUANTITY'] = $ratio['RATIO'];
}
else
{
$minimalPrice['MIN_QUANTITY'] = $ratio['RATIO'] * ((int)($minimalPrice['QUANTITY_FROM']/$ratio['RATIO']));
if ($minimalPrice['MIN_QUANTITY'] < $minimalPrice['QUANTITY_FROM'])
$minimalPrice['MIN_QUANTITY'] += $ratio['RATIO'];
}
$result['ITEM_PRICES'][$priceBlockIndex] = $minimalPrice;
if (isset($this->storage['PRICES_CAN_BUY'][$minimalPrice['PRICE_TYPE_ID']]))
$result['ITEM_PRICES_CAN_BUY'] = true;
if ($this->arParams['FILL_ITEM_ALL_PRICES'])
{
$priceBlock['ALL_PRICES']['MIN_QUANTITY'] = $minimalPrice['MIN_QUANTITY'];
$result['ITEM_ALL_PRICES'][$priceBlockIndex] = $priceBlock['ALL_PRICES'];
}
unset($minimalPrice);
$priceBlockIndex++;
}
unset($priceBlock);
}
unset($range);
unset($ratio);
}
if (!empty($productPrices['SIMPLE']))
{
$result['ITEM_PRICE_MODE'] = CatalogProductTable::PRICE_MODE_SIMPLE;
$ratio = current($this->ratios[$id]);
$priceBlock = $this->calculatePriceBlock(
$items[$index],
$productPrices['SIMPLE'],
$ratio['RATIO'],
true
);
if (!empty($priceBlock))
{
$minimalPrice = ($this->arParams['FILL_ITEM_ALL_PRICES']
? $priceBlock['MINIMAL_PRICE']
: $priceBlock
);
$minimalPrice['MIN_QUANTITY'] = $ratio['RATIO'];
$result['ITEM_PRICES'][$priceBlockIndex] = $minimalPrice;
if (isset($this->storage['PRICES_CAN_BUY'][$minimalPrice['PRICE_TYPE_ID']]))
$result['ITEM_PRICES_CAN_BUY'] = true;
if ($this->arParams['FILL_ITEM_ALL_PRICES'])
{
$priceBlock['ALL_PRICES']['MIN_QUANTITY'] = $minimalPrice['MIN_QUANTITY'];
$result['ITEM_ALL_PRICES'][$priceBlockIndex] = $priceBlock['ALL_PRICES'];
}
unset($minimalPrice);
$priceBlockIndex++;
}
unset($priceBlock);
unset($ratio);
}
$this->prices[$id] = $result;
if (isset($items[$index]['ACTIVE']) && $items[$index]['ACTIVE'] === 'N')
{
$items[$index]['CAN_BUY'] = false;
}
else
{
$items[$index]['CAN_BUY'] = $result['ITEM_PRICES_CAN_BUY'] && $items[$index]['PRODUCT']['AVAILABLE'] === 'Y';
}
unset($priceBlockIndex, $result);
unset($productPrices);
if ($enableCompatible)
$this->resortOldPrices($id);
}
unset($index);
}