如何复制客户地址


How to duplicate a customer address?

当客户第一次输入地址时,该地址将作为账单发货地址。但数据库中只有一个条目。因此,如果客户后来决定通过编辑现有的发货地址来更改发货地址,那么账单地址也会更改。为了防止这种情况,我需要在数据库中有两个单独的条目,一个用于计费地址,另一个用于发货地址。因此,

我编写了一个事件观察器,使用事件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;
}