当客户第一次输入地址时,该地址将作为账单和发货地址。但数据库中只有一个条目。因此,如果客户后来决定通过编辑现有的发货地址来更改发货地址,那么账单地址也会更改。为了防止这种情况,我需要在数据库中有两个单独的条目,一个用于计费地址,另一个用于发货地址。因此,
我编写了一个事件观察器,使用事件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;
}
但运行代码似乎会导致无限循环,直到内存耗尽。我做错了什么?
这里的问题是无限递归,因为您要在"customer/address"保存事件中保存"customer/access"。
在副本上设置一些属性,并在保存前检查:
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;
}