3

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

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

但是运行代码似乎会导致无限循环,直到内存耗尽。我究竟做错了什么?

4

1 回答 1

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;
}
于 2013-02-08T21:40:10.043 回答