2013-02-08 654 views
4

当客户第一次输入地址时,该地址的收货地址为。但数据库中只有一个条目。因此,如果客户稍后决定通过编辑现有地址来更改送货地址,则账单地址也会发生变化。为了防止这种情况,我需要在数据库中有两个单独的条目,一个用于帐单地址,另一个用于寄送地址。因此,如何复制客户地址?

我使用事件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

我不知道为什么你担心这一点。 Magento能够保存多个地址。 – pspahn 2013-02-08 22:15:46

回答

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; 
} 
+0

当默认计费!=默认发货时不应该停止循环? – cads 2013-02-08 21:46:31

+0

@cads:如果递归不是你内存不足的原因,我会感到惊讶。检查它会花5分钟吗? :) – 2013-02-08 21:53:06

+0

当然,只是在某些(自创建的)地址模型上设置is_default_shipping不会更新客户会话中地址模型的默认地址。上面的修复至少会修复你的递归,但它也可能解决潜在的问题。 – 2013-02-08 21:57:02