Magento - Hoe verzendadres bijwerken met customer_save_after evenement?

Ik probeer een standaard verzendadres voor een klant te maken of bij te werken met de customer_save_after -gebeurtenis (op basis van een aantal aangepaste registratievelden) wanneer de klant probeert een nieuw account te maken of zijn account te bewerken.

Hier komt het gedeelte van de Observer-modelcode:

...
$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());
    }*/
}
...

Above code works fine when customer creates a new account. However default shipping address don't get updated when customer tries to edit the custom registration field from My Account > Account Information

Dus mijn voornaamste zorg is hoe het verzendadres te updaten met behulp van het $ klant -object of een andere code met de customer_save_after -gebeurtenis.

0

2 antwoord

Als ik het goed begrijp, wilt u het volgende doen wanneer de customer_save_after -gebeurtenis wordt geactiveerd:

  1. Als de klant geen standaard verzendadres heeft, maak er dan een met de waarden in de array $ dataShipping.

  2. Als de klant een standaard verzendadres heeft, werkt u de waarden bij met die in de array $ dataShipping.

Als dit inderdaad is wat u zoekt, probeer dan de onderstaande code (uiteraard moet u zorgen waar de waarden voor de variabelen $ otherConditionIsValid en $ dataShipping staan):

$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; 
5
toegevoegd
werkt niet voor mij - ik krijg Oproep naar een lidfunctie getDefaultShipping() op een niet-object , omdat het lijkt erop dat $ customer = $ observer-> getEvent() -> getCustomer() retourneert de ID van de klant in plaats van het klantobject
toegevoegd de auteur van_folmert, de bron
Bedankt, Drew! Dat werkte als een charme. Ik denk dat het voorwaardelijk instellen van het verzendadres de juiste oplossing was. Proost!
toegevoegd de auteur MagePsycho, de bron
$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();
0
toegevoegd