3

我正在编写一个模块,我需要在某些情况下设置免费送货报价。我试图让这个工作:

$quote = Mage::helper('checkout/cart')->getCart()->getQuote();
$quote->getShippingAddress()->setFreeShipping(1);

但到目前为止还没有成功。任何人都可以帮忙吗?

编辑:我需要从以下事件中执行此操作:

checkout_cart_update_items_after
checkout_cart_product_add_after
sales_quote_remove_item

基本上,在对购物车进行任何修改时,我需要确定是否应该免费送货。

编辑:这似乎工作得很好。除了我需要在结帐时禁用免费送货作为选项。

$address = $quote->getShippingAddress();
$address->setShippingMethod('freeshipping_freeshipping');
4

4 回答 4

4

您可以首先确定要为其设置免费送货的活动,然后根据该活动,您可以将免费送货设置为默认选项。

下面的代码可能会对您有所帮助。

app/design/frontend/default/default/template/checkout/onepage/shipping_method/available.phtml:

// find methods loop:
 <?php foreach ($_rates as $_rate): ?>

//  add checking for free shipping method and setting it as default
<?php if ($_rate->getCode()=='freeshipping_freeshipping' && !$this->getAddress()->getShippingMethod()) {
      $this->getAddress()->setShippingMethod($_rate->getCode());
} ?>
于 2013-05-13T05:45:49.020 回答
3

最好的方法是添加您自己的“报价地址总计”,就像在 SalesRule 模块中按 Mage_SalesRule_Model_Quote_Freeshipping类一样。要复制这一点,您需要创建一个扩展类,Mage_Sales_Model_Quote_Address_Total_Abstract并在其中创建一个方法,collect()如下所示:

class Mycompany_Mymod_Model_Sales_Quote_Address_Total_Freeshipping extends Mage_Sales_Model_Quote_Address_Total_Abstract
{
    public function collect(Mage_Sales_Model_Quote_Address $address)
    {
        parent::collect($address);
        if(somecondition){
            $address->setFreeShipping(true);
        }
    }
}

然后在您的模块 config.xml 中声明您的自定义“报价地址总计”:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <global>
        <sales>
            <quote>
                <totals>
                    <customfreeshipping>
                        <class>mymodname/sales_quote_address_total_freeshipping</class>
                        <after>freeshipping</after> <!-- this ensures our custom total is placed after Mage_SalesRule_Model_Quote_Freeshipping so we can override "$address->setFreeShipping(0);" -->
                    </customfreeshipping>
                </totals>
            </quote>
        </sales>
    </global>
</config>

这将声明地址对象上的免费送货,该地址对象将通过方法内$request->setFreeShipping($this->getFreeShipping());Mage_Sales_Model_Quote_Address类传递给请求对象requestShippingRates(),然后可用于任何正在检查的送货模块$request->getFreeShipping()

享受 :)

于 2015-11-09T17:04:15.407 回答
1

你不应该只保存你的报价吗?

$quote = Mage::helper('checkout/cart')->getCart()->getQuote();
$quote->getShippingAddress()->setFreeShipping(1);
$quote->save();
于 2013-05-13T11:36:30.237 回答
0

我有以下 Magento 2 错误

请指定送货方式

这段代码解决了这个问题:

$shippingAddress->setCollectShippingRates(true)
                ->collectShippingRates()
                ->setShippingMethod('flatrate_flatrate');

还要检查Unable to set Shipping Method in Magento order create script 中的正确解决方案

于 2016-10-05T12:43:13.553 回答