Pourquoi Magento enregistre à nouveau les adresses des clients existants lors du paiement?

16

Au cours du processus de paiement, même si le client sélectionne une adresse existante, la liste déroulante de l' customer_addressentité est à nouveau enregistrée. Une idée pour quoi?

Mise à jour:

Il commence à l' Mage_Checkout_Model_Type_Onepage::saveOrderendroit où le code suivant est exécuté:

$service = Mage::getModel('sales/service_quote', $this->getQuote());
$service->submitAll();

Cet submitAllappel Mage_Sales_Model_Service_Quote::submitOrderexécute ce qui suit:

$transaction->save();

Cette méthode parcourt tous les objets du devis (?) Et les enregistre.

Mise à jour:

Le plus dégoûtant, c'est qu'ils le font pour toutes les adresses des clients. Donc, si votre visiteur obtient 10 adresses enregistrées dans le carnet d'adresses, toutes seront réenregistrées lors du paiement. Ne vous demandez pas pourquoi c'est la partie la plus consommatrice de ressources de Magento.

user487772
la source
Dans le customer_address_entityou dans le devis?
Matthias Kleine
Désolé, je ne sais pas ce que tu veux dire. L' customer_addressentité est enregistrée lors de la commande. Aucun lien pour citer.
user487772
1
Pouvez-vous fournir le code qui fait cela? Cela me sauverait la peine de chercher
Marius
Mis à jour la question.
user487772
@Tim Je suppose que la réponse car ils n'y ont pas pensé serait une réponse acceptable;) Je suppose qu'ils ne voulaient pas vérifier si l'adresse existe donc il serait plus facile / paresseux de tout sauvegarder. Mais seulement une supposition
David Manners

Réponses:

6

Habituellement, sauf si les données ont changé sur un modèle, l'appel à save () ne provoquera pas la réenregistrement du modèle .
Cela devait être l'hypothèse lors de la mise en œuvre de la logique de cette façon.

Cependant, étant donné que la méthode du modèle d'adresse de devis _beforeSave()définit l'ID de devis, l'ID de client, plus éventuellement l'ID d'adresse de client et la same_as_billingpropriété via la _populateBeforeSaveData()méthode, la protection contre les économies inutiles est contournée.

Une solution simple dans la méthode populateBeforeSaveData()serait de vérifier si les valeurs sur le point d'être définies sur le modèle d'adresse sont déjà présentes sur le modèle actuel avec la même valeur.

Heureusement, les adresses de devis sont stockées dans une table plate, ce qui signifie que la sauvegarde est assez efficace. Et à l'exception de certains magasins B2B, je n'ai pas connu de clients ayant plus de quelques adresses.

Vinai
la source
2

Je risquerais de deviner que cela n'a pas été réfléchi.

Peut-être pensait-on que plutôt que de mettre à jour une nouvelle adresse et tout changement d'adresse de facturation et d'expédition par défaut, il serait plus facile de tout enregistrer, car les gens n'auront pas autant d'adresses et le paiement est déjà lent, les gens ne le remarqueront pas ... beaucoup .

Remarque: ce n'est qu'une idée mais je pensais que cela valait la peine d'être partagé, je peux aussi m'imaginer faire les mêmes hypothèses :(

David Manners
la source
0

la sauvegarde d'adresse lors du paiement est effectuée par _afterSave () - Méthode dans le modèle de ressource client.

protected function _afterSave(Varien_Object $customer)
{
    $this->_saveAddresses($customer);
    return parent::_afterSave($customer);
}

si je me souviens, le modèle client est enregistré lors de la commande.

à votre santé

sbothner_mzentrale
la source
Oui, c'était clair. La question est "Pour quoi faire?".
user487772
@Tim: général je pense. Aucune raison observable pour le paiement de l'atmosphère.
sbothner_mzentrale
@Tim: Par exemple, saveAction dans admin a besoin de ce comportement.
sbothner_mzentrale
Pourquoi en a-t-il besoin?
user487772