Magento Checkout 流程的运费刷新

Magento Checkout 流程的运费刷新 

http://bugmaycry.blog.163.com/blog/static/18527229320114119388501/

2011-05-11 10:25:22|  分类: magento技术日记 |  标签:maghttp://bugmaycry.blog.163.com/blog/static/18527229320114119388501/  checkout  流程刷新   |举报 |字号 订阅

前段时间客户要求做一个功能,就是可以在Magento Checkout 流程的选择 Shipping Method  时候输入一个账号,如果设置了账号,Shipping Method 的费用统一设置为0.00元,最后提交订单的时候把输入账号保存进订单(Order)里面。

步骤如下:

我把 账号保存在magento session 里面

Mage::getSingleton('customer/session')->setShippingAccountNumber('账号');

获取账号值用

Mage::getSingleton('customer/session')->getShippingAccountNumber();

根据 Mage::getSingleton('customer/session')->getShippingAccountNumber() 的取值判断用户是否设置了账号,如果已经设置了账号,就把 费用设置为0.00元

重载 :app\code\core\Mage\Shipping\Model\Rate\Result\Method.php

到 :app\code\community\Mage\Shipping\Model\Rate\Result\Method.php

Method.php 代码如下:
<?php

class Mage_Shipping_Model_Rate_Result_Method extends Mage_Shipping_Model_Rate_Result_Abstract
{


    public function setPrice($price) {

        $shipping_account_number=Mage::getSingleton('customer/session')->getShippingAccountNumber();

        if((bool)$shipping_account_number) {
        parent::setPrice('0.00');
        }
        else {
        parent::setPrice($price);
        }

    }

    public function setCost($cost) {

        $shipping_account_number=Mage::getSingleton('customer/session')->getShippingAccountNumber();

        if((bool)$shipping_account_number) {
        parent::setCost('0.00');
        }
        else {
        parent::setCost($cost);
        }

    }

}

到这一步的时候就出现问题了,不论怎么样提交,刷新页面,费用依然是原来那样的没有变为0,但是 帐号确实是保存成功的.

必须回到设置Address 页面再提交,Shipping费用才会更新。

我想MAGNETO 在Checkout 流程里面是有一套PHP 程序缓存的机制,应该是可以开启和关闭它,这点我还没有搞清楚,期望有缘人给个解答.

虽然没搞懂上面提到的 PHP 程序缓存的机制,但是我依然找到了,解决刷新 Shipping 方法费用的方法

重载 :app\code\core\Mage\Checkout\Model\Type\Onepage.php

到 :app\code\community\Mage\Checkout\Model\Type\Onepage.php

在Onepage.php 中的 方法     public function saveShippingMethod($shippingMethod)

加上代码      $this->saveShipping($this->getQuote()->getShippingAddress(), null);

Code如下:

    public function saveShippingMethod($shippingMethod)
    {
        if (empty($shippingMethod)) {
            return array('error' => -1, 'message' => $this->_helper->__('Invalid shipping method.'));
        }
        $rate = $this->getQuote()->getShippingAddress()->getShippingRateByCode($shippingMethod);
        if (!$rate) {
            return array('error' => -1, 'message' => $this->_helper->__('Invalid shipping method.'));
        }


        $this->saveShipping($this->getQuote()->getShippingAddress(), null);


        $this->getQuote()->getShippingAddress()
            ->setShippingMethod($shippingMethod);
        $this->getQuote()->collectTotals()
            ->save();

        $this->getCheckout()
            ->setStepData('shipping_method', 'complete', true)
            ->setStepData('payment', 'allow', true);

        return array();
    }

原理就是,再刷新下 Shiping Address这样刷新问题就解决了。

不过值得一提的是多地址Checkout,也会出现不刷新的情况,

我也是用上面的原理解决的,不过文件不一样,需要移动一些代码,原理是一样的啦!

客户要求在后台创建订单的时候也需要这个功能

同样的会遇见刷新的问题

解决方法同上 使用

        $this->_saveShipping($this->_getQuote()->getShippingAddress(), null);

自定义
_saveShipping 方法代码如下

    public function _saveShipping($data, $customerAddressId)
    {
        $address = $this->_getQuote()->getShippingAddress();


            /* @var $addressForm Mage_Customer_Model_Form */
            $addressForm    = Mage::getModel('customer/form');
            $addressForm->setFormCode('customer_address_edit')
                ->setEntity($address)
                ->setEntityType('customer_address')
                ->setIsAjaxRequest(Mage::app()->getRequest()->isAjax());
            // emulate request object
            $addressData    = $addressForm->extractData($addressForm->prepareRequest($data));
            $addressErrors  = $addressForm->validateData($addressData);

            $addressForm->compactData($addressData);


        $address->implodeStreetAddress();
        $address->setCollectShippingRates(true);



        //$this->_getQuote()->collectTotals()->save();

    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值