Magento:自定义总计数两次?

时间:2011-11-24 18:11:37

标签: magento custom-action totals

好的,我创建了自定义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;
}

和fetcher

    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;
}

编辑:我发现还有一件事很奇怪 - 我在我的collect方法中执行setValue,而不是addValue,所以即使方法被调用两次,它也不应该是double值,它应该只是设置它两倍到正确的值。

3 个答案:

答案 0 :(得分:16)

问题可能是总对象属于地址对象而Magento订单通常有两个地址 - 一个用于发货,另一个用于结算?

因此,您的总计将被调用以运行两次 - 一次使用帐单邮寄地址,一次使用送货地址,金额将按地址汇总。您可以尝试检查您已经递送的地址,并且仅向其中一个地址应用这样的值;

public function collect(Mage_Sales_Model_Quote_Address $address) {

  $this->_setAddress($address);
  $this->_setAmount(0);
  $this->_setBaseAmount(0);

  if ($address->getAddressType() == 'shipping') { 
    //only apply an actual value to the shipping address

    //... Do your calculation here as above ...

  } 

  return $this;
}

你也需要在fetch方法中做类似的事情......

public function fetch(Mage_Sales_Model_Quote_Address $address) {

  $amount = $address->getMydiscountAmount();

  if ($amount != 0 && $address->getAddressType() == 'shipping') {

    $title = Mage::helper('ucon_mydiscount')->__('My discount');

    $address->addTotal(array(
        'code' => $this->getCode(),
        'title' => $title,
        'value' => $amount
    ));

  }

  return $this;
}

我承认collect功能可能更漂亮,但希望你能得到这个想法。

尝试一下,看看你的总数是否在前端和管理区域正确加起来。

答案 1 :(得分:2)

搜索后,这是另一种解决方案

public function collect(Mage_Sales_Model_Quote_Address $address) {
    parent::collect($address);

    //Pay attention to this code
    $items = $this->_getAddressItems($address);
    if (!count($items)) {
        return $this; //this makes only address type shipping to come through
    }

    //Do whatever you want here to add discount or fee...

    return $this;
}

通过这样做,折扣或费用只会添加到送货地址,并且会计算一次。因此,我们甚至不需要在if ($address->getAddressType() == 'shipping') {函数中添加fetch

答案 2 :(得分:0)

您是否有可能为购物车块添加自己的布局xml代码?如果你是这样,那么块有可能被调用两次(一个来自基本代码,另一个来自你的代码 - 即使你只是扩展它),因此重复了价格总和。如果是这种情况,您将需要删除(破坏性地使用<remove>标记)该块的基本布局xml,然后事情就应该落实到位。