Question

Je travaille sur un observateur du customer_address_save_before événement.Lors de la sauvegarde de l'adresse du client, je dois vérifier s'il y a des changements avant d'effectuer certaines actions.

J'ai fait quelque chose de similaire pour le customer/customer modèle avec certaines méthodes natives telles que hasDataChanges(), dataHasChangedFor($key) et getOrigData() du Varien_Object classe.

Cependant, quand j'ai essayé de le faire pour le customer/address modèle, j'ai compris que le _origData la propriété est nulle.Cela se produit uniquement lorsque l'adresse du client est mise à jour dans le front-end.Lorsque je mets à jour l'adresse du client dans le back-end, j'ai la bonne _origData.

Savez-vous pourquoi cela se produit et comment résoudre ou contourner ce problème ?

Était-ce utile?

La solution

J'ai résolu le problème il y a quelques semaines, je vais donc donner ma solution car elle pourrait aider tout le monde :

public function onCustomerAddressSaveBefore(Varien_Event_Observer $observer)
{
    $customerAddress = $observer->getEvent()->getCustomerAddress();

    /*
     * If the customer address exists, as $_origData of customer's address is sometimes null, we have to set it manually
     */
    if (!$customerAddress->isObjectNew() && !$customerAddress->getOrigData()) {
        $customerOrigAddress = Mage::getModel('customer/address')->load($customerAddress->getId());

        foreach ($customerOrigAddress->getData() as $field => $value) {
            $customerAddress->setOrigData($field, $value);
        }
    }
}

Comme vous pouvez le deviner, le onCustomerAddressSaveBefore() la méthode est déclenchée sur customer_address_save_before événement.A l'intérieur, je vérifie si l'objet n'est pas nouveau (il n'y a pas de données originales pour un nouvel objet) et si l'objet ne contient pas _origData encore.Si ces conditions sont vraies, je règle manuellement le _origData en les récupérant de la base de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top