Magento - 如何使用customer_save_after事件更新送货地址?

Mag*_*cho 0 php 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());
    }*/
}
...
Run Code Online (Sandbox Code Playgroud)

客户创建新帐户时,上述代码可以正常工作.但是,当客户尝试编辑自定义注册字段时,默认送货地址不会更新My Account > Account Information

所以我主要关心的是如何使用$customer对象或使用customer_save_after事件的任何其他代码更新送货地址.

Dre*_*ter 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; 
Run Code Online (Sandbox Code Playgroud)