Значит так, товарищи. Есть акция "каждый второй товар по бренду - скидка 50%". Как ее реализовать средствами движка - понятия не имею. Извините, если кого обижу, но меня просто отворачивает от структуры фреймворка Битрикс. Но да не будем рассыпать много лирики. Есть код, где происходит калькуляция:
Скрытый текст |
|---|
| Код |
|---|
public static function ApplyBasketDiscount(&$arOrder, $func, $dblValue, $strUnit)
{
if (array_key_exists('BASKET_ITEMS', $arOrder) && !empty($arOrder['BASKET_ITEMS']) && is_array($arOrder['BASKET_ITEMS']))
{
$arDiscountBasket = (is_callable($func) ? array_filter($arOrder['BASKET_ITEMS'], $func) : $arOrder['BASKET_ITEMS']);
if (!empty($arDiscountBasket))
{
$arClearBasket = array_filter($arDiscountBasket, 'CSaleDiscountActionApply::ClearBasket');
if (!empty($arClearBasket))
{
$dblValue = doubleval($dblValue);
if ('S' == $strUnit)
{
$dblSumm = 0.0;
foreach ($arClearBasket as &$arOneRow)
{
$dblSumm += doubleval($arOneRow['PRICE'])*doubleval($arOneRow['QUANTITY']);
}
if (isset($arOneRow))
unset($arOneRow);
if ($dblSumm > 0)
{
$dblValue = ($dblValue*100)/$dblSumm;
}
else
{
$dblValue = 0.0;
}
$strUnit = 'P';
}
if (0 != $dblValue)
{
foreach ($arClearBasket as $key => $arOneRow)
{
$dblCurValue = $dblValue;
if ('P' == $strUnit)
{
$dblCurValue = $arOneRow['PRICE']*($dblValue/100);
}
$dblResult = $arOneRow['PRICE'] + $dblCurValue;
if (0 <= $dblResult)
{
$arOneRow['PRICE'] = $dblResult;
if (array_key_exists('PRICE_DEFAULT', $arOneRow))
$arOneRow['PRICE_DEFAULT'] = $dblResult;
if (array_key_exists('DISCOUNT_PRICE', $arOneRow))
{
$arOneRow['DISCOUNT_PRICE'] = doubleval($arOneRow['DISCOUNT_PRICE']);
$arOneRow['DISCOUNT_PRICE'] -= $dblCurValue;
}
else
{
$arOneRow['DISCOUNT_PRICE'] = -$dblCurValue;
}
if (0 > $arOneRow['DISCOUNT_PRICE'])
$arOneRow['DISCOUNT_PRICE'] = 0;
if (array_key_exists('VAT_RATE', $arOneRow))
{
$dblVatRate = doubleval($arOneRow["VAT_RATE"]);
if (0 < $dblVatRate)
$arOneRow["VAT_VALUE"] = (($arOneRow["PRICE"] / ($dblVatRate + 1)) * $dblVatRate);
}
$arOrder['BASKET_ITEMS'][$key] = $arOneRow;
}
}
}
}
}
}
}
}
|
|
Вот на этом моменте начинается перерасчет цены:
| Код |
|---|
$dblCurValue = $dblValue;
if ('P' == $strUnit) |
Вот я и решил, что заменив $dblValue на нужно мне в тот момент, у меня заработает скидка как нужно. После перерасчета я возвращаю исходное значение в $dblValue. Но почему-то скидка считается на нужных товарах только в корзине. На остальных мне нужно скидку в 0%, а битрикс считает в неизвестном порядке скидку на оставшиеся товары от 0% до 3%. Куда копать?