即时更改运输方式的价格

时间:2013-11-06 20:57:07

标签: magento

我知道有很多答案和类似问题的问题,但我会在开始时通知。我不是问我自己的运输方法,而是关于所有可用的方法。

我找到了一个我曾经做过的代码,奇怪的是:它工作了一段时间 - 不知道我改变了它停止了。

class Oversizeshipping_Model_Observer
    extends Varien_Event_Observer
{
    public function appendPriceToShipping($observer)
    {
        $address = $observer->getQuoteAddress();
        #Mage::log($address->getAddressType(), Zend_Log::DEBUG, 'event.log', true);
        if($address->getAddressType() === $address::TYPE_SHIPPING){
            $price = 0;
            $resource = Mage::getResourceModel('catalog/product');
            foreach($address->getAllItems() as $item) {
                try {
                    $oversizePrice = $resource->getAttributeRawValue($item->getProduct()->getId(), 'oversize_shipping_price', $item->getStoreId());
                } catch( Exception $e ) {
                    $oversizePrice = 0;
                }
                if($oversizePrice > 0) {
                    $price += $oversizePrice;
                }
            }

            $address->setShippingAmount($price);
            $address->setBaseShippingAmount($price);

            $rates = $address->collectShippingRates()
                     ->getGroupedAllShippingRates();
            foreach ($rates as $carrier) {
                foreach ($carrier as $rate) {
                    $rate->setPrice((float)$rate->getPrice()+$price);
                    $rate->save();
                }
            }
            $address->save();
        }
    }
}

在sales_quote_address_collect_totals_after上触发了该观察者方法。 正如我之前提到的,它起作用(即使是免费送货方式也加价),但它停止了。

有人能给我一个错字,错过方法电话或smth吗?

2 个答案:

答案 0 :(得分:0)

首先我删除了代码:

$address->setShippingAmount($price);
$address->setBaseShippingAmount($price);

这迫使额外的价格在总结中显示为总运费,而是额外的价格+运费方式价格。

还补充说:

$address->setCollectShippingRates(false);

就在之前:

$rates = $address->collectShippingRates()
                 ->getGroupedAllShippingRates();

这解决了我的问题,没有更新价格。

<强>附加

可以使用相同的观察者来禁用某些速率。只需使用:

$rate->isDeleted(true);

答案 1 :(得分:0)

如果您配置运费税,您的方法将会失败。

尝试改写Mage_Shipping_Model_Rate_Result::append方法。