Rel*_*lja 5 custom-action totals magento
好吧,我创建了自定义Total类来添加特殊折扣,一切似乎都运行正常,但由于某些原因我找不到,我的总计算是两次!这导致双倍的折扣和不正确的总计.现在,这发生在购物车页面和结帐页面上...但是......当我完成订单时总计很好,只计算一次,总计很好.
这很奇怪,就像收集方法被称为购物车页面两次,但只有一次在完成订单时,但我可以"追踪所有这些发生的地方,以及为什么.
要跳过垃圾代码,我只会粘贴重要内容
<sales>
<quote>
<totals>
<mydiscount>
<class>ucon_mydiscount/total_mydiscount</class>
<before>subtotal</before>
</mydiscount>
</totals>
</quote>
</sales>
Run Code Online (Sandbox Code Playgroud)
和收藏家的方法
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;
}
Run Code Online (Sandbox Code Playgroud)
和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;
}
Run Code Online (Sandbox Code Playgroud)
编辑:我发现还有一件事很奇怪 - 我在我的collect方法中执行setValue,而不是addValue,所以即使方法被调用两次,它也不应该是double值,它应该只设置两次到正确的价值.
Rus*_*lde 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;
}
Run Code Online (Sandbox Code Playgroud)
你还需要在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;
}
Run Code Online (Sandbox Code Playgroud)
我承认这个collect功能可能比较漂亮,但希望你能得到这个想法.
试一试,看看你的总数是否在前端和管理区域正确加起来.
| 归档时间: |
|
| 查看次数: |
6675 次 |
| 最近记录: |