当客户首次输入地址时,此地址将作为帐单和送货地址。但是数据库中只有一个条目。因此,如果客户稍后通过编辑现有的地址来决定更改送货地址,那么也不会更改帐单地址。为了防止这种情况,我需要在数据库中有两个单独的条目,一个用于帐单地址,另一个用于送货地址。因此,
我使用事件customer_address_save_after
编写了一个事件观察者来检查默认帐单邮寄地址的条目是否与默认送货地址的条目相同。如果是这样,则保存此地址的副本作为新的送货地址。好吧,至少这是个想法,
public function customerAddressSaveAfter($observer)
{
$session = Mage::getSingleton('customer/session');
if ($session->getCustomer()->getDefaultBilling() ==
$session->getCustomer()->getDefaultShipping())
{
$address = $observer->getCustomerAddress();
$address->unsAddressId()
->unsAddressType();
Mage::getModel('customer/address')
->setData($address->getData())
->setIsDefaultShipping('1')
->setSaveInAddressBook('1')
->save();
}
return $this;
}
但运行代码似乎导致无限循环,直到内存耗尽。我做错了什么?
答案 0 :(得分:1)
这里的问题是无限递归,因为您在“客户/地址”保存事件中保存了“客户/地址”。
在副本上设置一些属性,并在保存之前检查它:
public function customerAddressSaveAfter($observer)
{
$address = $observer->getCustomerAddress();
if ($address->getIsDuplicate()) {
return $this;
}
$session = Mage::getSingleton('customer/session');
if ($session->getCustomer()->getDefaultBilling() ==
$session->getCustomer()->getDefaultShipping())
{
$address->unsAddressId()
->unsAddressType();
Mage::getModel('customer/address')
->setData($address->getData())
->setIsDefaultShipping('1')
->setSaveInAddressBook('1')
->setIsDuplicate(true)
->save();
}
return $this;
}