如何使用观察员在magento结帐时删除运费?

时间:2013-01-27 05:09:54

标签: magento checkout shipping

我的问题:

我希望在结帐页面开始之前使用观察者,因为根据购物车中的商品,如果不符合某些条件,我想禁用送货。

我正在使用 [controller_action_predispatch_checkout_onepage_index] 事件观察者,这基本上在结帐页面开始加载之前调用...我能够获得所有产品和报价信息但是没有找到任何方法禁用送货

我在寻找什么,

观察员

是否可以通过调用某些magento方法或任何其他解决方案来禁用发货?

覆盖collectRates()

在收到少量回复后,我试图使用下面给出的代码覆盖collectRates()方法

$ method = Mage :: getModel('shipping / rate_result_method');

        $method->setCarrier('flatrate');
        $method->setCarrierTitle($this->getConfigData('title'));

        $method->setMethod('flatrate');
        $method->setMethodTitle($this->getConfigData('name'));

        if ($request->getFreeShipping() === true || $request->getPackageQty() == $this->getFreeBoxes()) {
            $shippingPrice = '0.00';
        }


        $method->setPrice($shippingPrice);
        $method->setCost($shippingPrice);

        $result->append($method);

虽然,我也不想启用扁平运输方式。我只想禁用送货,或者选择回复

之类的回复
  • 免运费$ 0.00

用户可以选择继续下一步。请从这里帮助我.. 我应该在$ method-> setCarrier('??????')中使用什么; 我在上面的代码中需要做哪些更改?

2 个答案:

答案 0 :(得分:1)

我认为覆盖或子类化各个Carrier模型可能会更好。

所有运营商都实施了一个方法“Mage_Shipping_Model_Carrier_Abstract :: collectRates()”来返回结果。 可以从此方法中获取有关当前报价的信息以修改返回的费率/选项。

那就是说,如果有办法与观察者一起做,那可能会更清洁/更容易。

答案 1 :(得分:0)

最后我有覆盖送货方法,它是一个两步代码,但如果你愿意,你可以将它减少到一步。这是我的两步解决方案。 在我们开始之前,我们的运输类需要扩展和实施

extends Mage_Shipping_Model_Carrier_Abstract
    implements Mage_Shipping_Model_Carrier_Interface

现在,我们创建一个受保护的方法

protected function _createMethod($request, $method_code, $title, $price, $cost)
{
    $method = Mage::getModel('shipping/rate_result_method');

    $method->setCarrier('australiapost'); // in my case its australia post, it can be any other whatever you are using
    $method->setCarrierTitle($this->getConfigData('title'));

    $method->setMethod($method_code);
    $method->setMethodTitle($title);

    $method->setPrice($this->getFinalPriceWithHandlingFee($price));
    $method->setCost($cost);

    return $method;
}

现在只需使用下面的代码创建免费送货的新方法并绕过现有的送货计算器,此代码将进入 collectRates(Mage_Shipping_Model_Rate_Request $ request)方法

   // PROCESS WILL RETURN FREE SHIPPING
   if ($request->getFreeShipping() === true || $request->getPackageQty() == $this->getFreeBoxes()) {
            $shippingPrice = '0.00';
         }

    $shipping_method = 'Free Shipping';
    $method = $this->_createMethod($request, $shipping_method, 'Shipping Disabled', '0.00', '0.00');


         $result->append($method);

         return $result;

通过执行此操作,您可以在结帐时获得如下结果,用户可以轻松点击继续下一步。

  • 运费已停用$ 0.00