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();
}
步骤如下:
我把 账号保存在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();
}