2012-06-23 40 views
0

Я пытаюсь создать или обновить адрес доставки по умолчанию для клиента, используя событие customer_save_after (на основе некоторых пользовательских полей регистрации), когда клиент пытается создать новую учетную запись или изменить свою учетную запись.Magento - Как обновить адрес доставки, используя событие customer_save_after?

Здесь идет часть модели Observer код:

... 
$customer = $observer->getEvent()->getCustomer(); 
if ($customer->getId() && $otherConditionIsValid){ 
    $dataShipping = array(
     'firstname' => $someFixedFirstName, 
     'lastname' => $someFixedLastName, 
     'street' => array($someFixedStreetLine), 
     'city'  => $someFixedCity, 
     'region' => $someFixedState, 
     'region_id' => '', 
     'postcode' => $someFixedZipcode, 
     'country_id' => $someFixedCountry, 
     'telephone' => $someFixedTelephone, 
    ); 
    $customerAddress = Mage::getModel('customer/address'); 
    if($defaultShippingId = $customer->getDefaultShipping()){ //if customer already has default shipping address 
     $customerAddress->load($defaultShippingId); 
    } 
    $customerAddress->setData($dataShipping) 
        ->setCustomerId($customer->getId()) 
        ->setIsDefaultShipping('1') 
        ->setSaveInAddressBook('1'); 
    $customer->addAddress($customerAddress); #setting Shipping Address to be added/updated 
    //When i try to use below commented code, script gets called for infinite times, finally running out of memory 
    /*try{ 
     $customerAddress->save(); 
    }catch(Exception $e){ 
     Mage::log('Address Save Error::' . $e->getMessage()); 
    }*/ 
} 
... 

Приведенный выше код работает отлично, когда клиент создает новую учетную запись. Однако адрес доставки по умолчанию не обновляется, когда клиент пытается изменить настраиваемое поле регистрации от My Account > Account Information

Так моя основная проблема в том, как обновить адрес доставки с помощью $customer объекта или любой другой код, используя customer_save_after событие.

ответ

5

Если я правильно понимаю, вы хотели бы сделать следующее, когда customer_save_after события увольняет:

  1. Если клиент не имеет адреса по умолчанию доставки, а затем создать один со значениями в $ массив dataShipping.

  2. Если у клиента есть адрес доставки по умолчанию, обновите его значения с помощью значений в массиве $ dataShipping.

Если это действительно то, что вы ищете, пожалуйста, попробуйте код ниже (очевидно, нужно позаботиться о том, где значения для $ otherConditionIsValid и $ dataShipping переменные):

$customer = $observer->getEvent()->getCustomer(); 
if (! $customer->getId() || ! $otherConditionIsValid){ 
    return $this;     
} 

$dataShipping = array(
    'firstname' => $someFixedFirstName, 
    'lastname' => $someFixedLastName, 
    'street'  => array($someFixedStreetLine), 
    'city'  => $someFixedCity, 
    'region'  => $someFixedState, 
    'region_id' => '', 
    'postcode' => $someFixedZipcode, 
    'country_id' => $someFixedCountry, 
    'telephone' => $someFixedTelephone, 
); 

$customerAddress = Mage::getModel('customer/address'); 

if ($defaultShippingId = $customer->getDefaultShipping()){ 
    $customerAddress->load($defaultShippingId); 
} else { 
    $customerAddress 
     ->setCustomerId($customer->getId()) 
     ->setIsDefaultShipping('1') 
     ->setSaveInAddressBook('1') 
    ; 

    $customer->addAddress($customerAddress); 
}    

try { 
    $customerAddress 
     ->addData($dataShipping) 
     ->save() 
    ;   
} catch(Exception $e){ 
    Mage::log('Address Save Error::' . $e->getMessage()); 
} 

return $this; 
+0

Спасибо тонну Дрю! Это работало как шарм. Я думаю, что условная настройка адреса доставки сделала трюк. Ура! – MagePsycho

+0

не работает для меня - я получаю 'вызов функции-члена getDefaultShipping() для не-объекта', потому что кажется, что' $ customer = $ observer-> getEvent() -> getCustomer() 'возвращает идентификатор клиента вместо объекта клиента –

0
$address = Mage::getModel("customer/address");    
    $address->setCustomerId($this->customerID()); 
    $address->setFirstname(Mage::app()->getRequest()->getPost("event_firstname")); 
    $address->setLastname(Mage::app()->getRequest()->getPost("event_lastname")); 
    $address->setCountryId('AE'); 
    $address->setCity(Mage::app()->getRequest()->getPost("event_city")); 
    $address->setStreet(Mage::app()->getRequest()->getPost("event_address")); 
    $address->setTelephone(Mage::app()->getRequest()->getPost("event_mobile")); 
    $address->save(); 
Смежные вопросы