Хорошо, я создал собственный класс Total для добавления специальной скидки, и, похоже, все работает нормально, за исключением того, что по какой-то причине я не могу найти, моя сумма рассчитывается дважды! Это приводит к двойной сумме скидки и неверной общей сумме. Теперь это происходит на странице корзины и на страницах оформления заказа ... НО ... когда я завершаю заказ, общая сумма в порядке, рассчитывается только один раз, и общая сумма в порядке.
Это странно, это похоже на то, что метод сбора вызывается дважды для страниц корзины, но только один раз при завершении заказа, но я могу отследить, где все это происходит и почему.
Чтобы пропустить ненужный код, я вставлю только важные
<sales>
<quote>
<totals>
<mydiscount>
<class>ucon_mydiscount/total_mydiscount</class>
<before>subtotal</before>
</mydiscount>
</totals>
</quote>
</sales>
и методы сборщика
public function collect(Mage_Sales_Model_Quote_Address $address)
{
parent::collect($address);
$quote = $address->getQuote();
$quoteId = $quote->getEntityId();
$items = $quote->getAllItems();
if (!count($items)) {
return $this;
}
$discount = 0;
$productId = 2556;
foreach($items as $item)
{
if($item->getProduct()->getId() == $productId)
{
$qty = $item->getQty();
$totalPrice = round(($item->getRowTotal()+$item->getTaxAmount()),2);
//discount 10%
$discount = round($totalPrice * 0.1,2);
$discount = 0 - $discount;
}
}
if($discount == 0)
return $this;
$this->_setAmount($discount);
$this->_setBaseAmount($discount);
return $this;
}
и сборщик
public function fetch(Mage_Sales_Model_Quote_Address $address)
{
$amount = $address->getMydiscountAmount();
if ($amount != 0) {
$title = Mage::helper('ucon_mydiscount')->__('My discount');
$address->addTotal(array(
'code' => $this->getCode(),
'title' => $title,
'value' => $amount
));
}
return $this;
}
edit: Еще одна странная вещь - я использую setValue в своем методе сбора , а не addValue, поэтому даже если метод вызывается дважды, он не должен иметь двойное значение, он должен просто дважды установить его на правильное значение.