每当客户进入单页结帐页面时,我都需要重置报价的帐单地址。
所以我扩展了OnepageController的indexAction()方法并添加了以下行来创建一个新的引用地址对象并将其分配给引用对象。但调试代码告诉我,从引用中获得的地址仍然是旧的。
...
Mage::getSingleton('checkout/session')->setCartWasUpdated(false);
Mage::getSingleton('customer/session')->setBeforeAuthUrl(Mage::getUrl('*/*/*', array('_secure'=>true)));
$this->getOnepage()->initCheckout();
// --- Start of my code ------------------------------
// Create a new quote address object and pass it to the quote
$newBillingAddress = Mage::getModel('sales/quote_address');
$this->getOnepage()->getQuote()->setBillingAddress($newBillingAddress)->save();
// get address from quote to see whether is changed or not.
// but it is still the old address.
$billingAddress = $this->getOnepage()->getQuote()->getBillingAddress();
// --- End of my code ------------------------------
$this->loadLayout();
...
答案 0 :(得分:0)
通常从我的经验来看,你不能执行一个setter,它在java世界中是一个void方法(java提到比较,我知道你在php的土地上),并执行保存。因为你没有在对象上制定,而是在函数上制定。
您是否尝试分离了setter,然后保存?
$quote = $this->getOnepage()->getQuote();
$quote->setBillingAddress($newBillingAddress);
$quote->save();
答案 1 :(得分:0)
好的,我解决了这个问题,并找出了为什么它不能按预期工作。
原因是如何在Quote类中实现设置地址的方法。旧地址对象不会被新地址对象替换,但新地址的_data数组的元素将被复制到旧地址的_data数组中。
当我创建一个新的地址对象,其_data数组为空时,没有项目要复制到旧地址的_data数组,所以我总是得到旧的数据,因为地址对象仍然是旧数据。