0

每当客户来到单页结帐页面时,我都需要重置报价的帐单地址。

所以我扩展了 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();
...
4

2 回答 2

0

通常根据我的经验,你不能执行一个 setter,它是 java 世界中的一个 void 方法(提到 java 是为了比较,我知道你在 php 领域),并对其执行保存。因为您不是在对象上制定,而是在功能上制定。

您是否尝试过分离二传手,然后保存?

$quote = $this->getOnepage()->getQuote();
$quote->setBillingAddress($newBillingAddress);
$quote->save();
于 2012-03-08T13:58:33.313 回答
0

好的,我解决了这个问题,并找出了为什么它不能按预期工作。

原因是设置地址的方法是如何在 Quote 类中实现的。不是旧地址对象被新地址对象替换,而是新地址的 _data 数组的元素被复制到旧地址的 _data 数组中。

因为我创建了一个新的地址对象,它的 _data 数组是空的,那里没有项目可以复制到旧地址的 _data 数组,所以我总是得到旧数据返回,因为地址对象仍然是旧的。

于 2012-03-08T14:42:24.767 回答