Warum speichert Magento bestehende Kundenadressen beim Checkout neu?

16

Selbst wenn der Kunde während des Bestellvorgangs eine vorhandene Adresse aus dem Dropdown-Menü auswählt, wird die customer_addressEntität erneut gespeichert. Irgendeine Idee wofür?

Aktualisieren:

Es beginnt dort, Mage_Checkout_Model_Type_Onepage::saveOrderwo der folgende Code ausgeführt wird:

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

Dies submitAllruft Mage_Sales_Model_Service_Quote::submitOrderfolgendes auf:

$transaction->save();

Diese Methode durchläuft alle Objekte des Zitats (?) Und speichert sie.

Aktualisieren:

Das Ekelhafteste ist, dass sie es für alle Kundenadressen tun. Wenn Ihr Besucher also 10 Adressen im Adressbuch gespeichert bekommt, werden diese beim Auschecken erneut gespeichert. Wundern Sie sich nicht, warum dies der ressourcenintensivste Teil von Magento ist.

user487772
quelle
Im customer_address_entityoder im Zitat?
Matthias Kleine
Entschuldigung, nicht sicher, was du meinst. Die customer_addressEntität wird während der Bestellung gespeichert. Keine Verbindung zum Angebot.
user487772
1
Können Sie den Code dafür bereitstellen? Das erspart mir die Suche
Marius
Die Frage wurde aktualisiert.
user487772
@Tim Ich denke, die Antwort ist akzeptabel, weil sie es nicht durchdacht haben. Ich denke, sie wollten nicht überprüfen, ob die Adresse existiert, also wäre es einfacher, alles zu speichern. Nur eine Vermutung
David Manners

Antworten:

6

Normalerweise wird das Modell nicht erneut gespeichert , es sei denn, die Daten eines Modells haben sich geändert, wenn save () aufgerufen wird .
Dies muss die Annahme bei der Implementierung der Logik auf diese Weise gewesen sein.

Da die Methode des _beforeSave()Angebotsadressmodells jedoch die Angebots-ID, die Kunden-ID sowie möglicherweise die Kunden-Adress-ID und die same_as_billingEigenschaft über die Methode festlegt _populateBeforeSaveData(), wird der Schutz vor unnötigem Speichern umgangen.

Eine einfache Lösung in der Methode besteht populateBeforeSaveData()darin, zu überprüfen, ob die zu setzenden Werte im Adressmodell bereits im aktuellen Modell mit demselben Wert vorhanden sind.

Glücklicherweise werden Angebotsadressen in einer flachen Tabelle gespeichert, was bedeutet, dass das Speichern ziemlich effizient ist. Und mit Ausnahme einiger B2B-Geschäfte habe ich keine Kunden mit mehr als ein paar Adressen erlebt.

Vinai
quelle
2

Ich würde eine Vermutung riskieren, dass dies nicht durchdacht wurde.

Vielleicht wurde angenommen, dass es einfacher ist, alle Daten zu speichern, anstatt eine neue Adresse zu aktualisieren und die Standard-Rechnungs- und Lieferadresse zu ändern, da die Leute nicht so viele Adressen haben und die Kasse bereits langsam ist. Die Leute werden es nicht bemerken .

Hinweis: Dies ist nur eine Idee, aber ich dachte, es lohnt sich zu teilen, und ich kann mir vorstellen, die gleichen Annahmen zu treffen :(

David Manners
quelle
0

Das Speichern der Adresse beim Auschecken erfolgt durch _afterSave () - Methode im Kundenressourcenmodell.

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

wie ich mich erinnere, wird das Kundenmodell bei der Bestellung gespeichert.

Prost

sbothner_mzentrale
quelle
Ja, das war klar. Die Frage lautet "Wofür?".
user487772
@ Tim: allgemein denke ich. Kein erkennbarer Grund zur Kasse atm.
sbothner_mzentrale
@Tim: Zum Beispiel benötigt saveAction in admin dieses Verhalten.
sbothner_mzentrale
Wofür braucht es das?
user487772