我已使用this在magento 2.1中应用自定义折扣。一切都在本地系统上工作但是当我在服务器上部署更改时,折扣从总数中减去两倍。 任何人都可以对此有所了解吗?
Sales.xml
<?xml version="1.0"?><config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Sales:etc/sales.xsd">
<section name="quote">
<group name="totals">
<item name="test_discount" instance="Namespace\Modulename\Model\Quote\Discount" sort_order="500"/>
</group>
</section>
答案 0 :(得分:6)
要删除摘要中应用两次的自定义折扣,请添加以下行
$items = $shippingAssignment->getItems();
if (!count($items)) {
return $this;
}
在collect方法中。完成后,它将如下所示。
public function collect(
\Magento\Quote\Model\Quote $quote,
\Magento\Quote\Api\Data\ShippingAssignmentInterface $shippingAssignment,
\Magento\Quote\Model\Quote\Address\Total $total
) {
$items = $shippingAssignment->getItems();
if (!count($items)) {
return $this;
}
parent::collect($quote, $shippingAssignment, $total);
答案 1 :(得分:1)
这可能是因为多件装 Magento收集每个地址的总数。在默认方案中,报价有两个地址:帐单邮寄地址和送货地址。 我没有尝试过您链接的示例,但afaiks费用将被应用两次。出于某种原因,这并没有显示在前端,但我也遇到过两次收费的问题,但不知何故仍然在前端正确显示。
我假设在有多个送货单时,仍然只有一个帐单邮寄地址。因此,以下代码段应解决两次应用自定义费用/折扣的问题:
$address = $shippingAssignment->getShipping()->getAddress();
if($address->getAddressType() != 'billing'){
return $this;
}
或者,如果您只想对带有物品的货件收取费用:
$allBaseTotals = $total->getAllBaseTotalAmounts();
if(!isset($allBaseTotals['subtotal']) || $allBaseTotals['subtotal'] <= 0){
return $this;
}
这意味着您链接的教程中的示例文件将如下所示:
app/code/Magestore/Webpos/Model/Total/Quote/Custom.php
/**
* @param \Magento\Quote\Model\Quote $quote
* @param \Magento\Quote\Api\Data\ShippingAssignmentInterface $shippingAssignment
* @param \Magento\Quote\Model\Quote\Address\Total $total
* @return $this|bool
*/
public function collect(
\Magento\Quote\Model\Quote $quote,
\Magento\Quote\Api\Data\ShippingAssignmentInterface $shippingAssignment,
\Magento\Quote\Model\Quote\Address\Total $total
)
{
parent::collect($quote, $shippingAssignment, $total);
$address = $shippingAssignment->getShipping()->getAddress();
if($address->getAddressType() != 'billing'){
return $this;
}
$baseDiscount = 10;
$discount = $this->_priceCurrency->convert($baseDiscount);
$total->addTotalAmount('customdiscount', -$discount);
$total->addBaseTotalAmount('customdiscount', -$baseDiscount);
$total->setBaseGrandTotal($total->getBaseGrandTotal() - $baseDiscount);
$quote->setCustomDiscount(-$discount);
return $this;
}
编辑:
似乎if($address->getAddressType() != 'billing'){
不能像我想象的那样起作用。
我现在正在使用if($address->getAddressType() == 'billing'){
,因为我没有使用多重传输。
答案 2 :(得分:0)
折扣是根据报价中的地址计算的,因为有两个地址billing
和shipping
为何要计算两次。
您可以在billing
或shipping
上设置仅计算送货地址或帐单地址的条件。
这里只是在开始时使用这个简单的if语句(来自nbjohan答案)。
$address = $shippingAssignment->getShipping()->getAddress();
if($address->getAddressType() != 'billing'){
return $this;
}
现在它将只计算一次。