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

답변

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

+0

@cads : 재귀가 메모리가 부족한 이유가 아니라면 놀랄 것입니다. 확인하면 5 분이 걸릴거야? :) –

+0

물론 일부 (자체 생성 된) 주소 모델에서 is_default_shipping을 설정하면 고객 세션의 주소 모델의 기본 주소가 업데이트되지 않습니다. 위의 수정은 최소한 재귀를 수정하지만 근본적인 문제를 해결할 수도 있습니다. –

관련 문제