2013-02-08 21 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