2010-10-03 10 views
5

Bitte beachten Sie, diese Frage bezieht sich auf die Versandkosten, nicht den Preis. Es gibt einen wichtigen Unterschied, d. H. Welche $$ die Versandmethode für den Ladenbesitzer verursacht, im Gegensatz zu dem, was $$ vom Kunden bezahlt wird.Zugriff auf die Versandkosten in Magentos Warenkorb und/oder Kasse

shipping_tablerate Die Datenbanktabelle enthält ein cost Feld, das in dem Objekt während des Mage_Shipping_Model_Carrier_TableratecollectRates Verfahrens aufgefüllt wird. Dieses Feld ist jedoch nirgendwo anders im Stapel zugänglich, z. aus der Adresse eines Zitats.

Ich muss auf den Wert auf der Warenkorbseite zugreifen, und ich kann nicht finden, um es zu erreichen, außer ein Mage_Shipping_Model_Rate_Request Objekt in collectRates() zu instanziieren. Dies erscheint unnötig ineffizient, da die Daten bereits aus der Tabelle geladen sind und zugänglich sein sollten.

Ich habe versucht, das <shipping_carrier_tablerate_load/> Ereignis zu beobachten, aber es scheint, dass das _load Ereignis für dieses Modell nicht ausgelöst wird.

Ich habe auch versucht, die Rate von dem Zitat Zugriff:

$quote = Mage::getSingleton('checkout/cart')->getQuote(); 
$address = $quote->getShippingAddress(); 
$rate = $address->getShippingRateByCode($code ='tablerate_bestway'); 

ich die price berechnet sehen kann, jedoch cost in diesem Modell nicht vorhanden ist.

In diesem Stadium sind mir die Ideen ausgegangen. Irgendwelche Vorschläge dankbar erhalten!

Danke, Jonathan

Antwort

6

Zuerst versucht nicht zu viel über die Leistung zu kümmern, bis Sie eine tatsächliche Engpass irgendwo zu sehen. Vertrauen Sie auf die Vielzahl von Caching-Systemen. Zynischer ausgedrückt, Magento ist schon ein bisschen ein SQL-Biest, also wenn Sie einen Laden gut eingestellt haben, werden ein paar zusätzliche Anfragen nicht schaden.

Zweitens ist der Datenbanktreffer möglicherweise nicht einmal ein Problem. Das Modell shipping/rate_request scheint nicht von einer Datenbank gesichert zu sein. Wenn man sich die zwei mal aussehen wird es in den Kern-Code verwendet

Mage_Shipping_Model_Shipping::collectRatesByAddress 
Mage_Sales_Model_Quote_Address::requestShippingRates 

Sie das shipping/rate_request Modell sehen kann, wird instanziiert wird, und dann von bereits geladenen Felder ausgefüllt. Außerdem laden alle Modelle, die in Mage_Shipping_Model_Carrier_Tablerate::collectRates verwendet werden, nichts aus einer Datenbank, sie tun nur Berechnungen.

Es ist bewundernswert, dass Sie in der ersten Runde etwas so Leistungsfähiges wie möglich bauen wollen, aber es gibt zu viele komplexe Interaktionen in einem modernen OO-System, um auf magische Weise die performanteste Art zu erkennen, etwas zu tun. Tun Sie, was Sie brauchen, um die benötigten Informationen zu erhalten und die Leistungsoptimierung (falls erforderlich) während einer Wartungsfreigabe durchzuführen (oder wenn Sie nicht über genügend Wartungsfreigabe verfügen, wenn jemand mit der Macht in Ihrer Organisation irgendwo über die Geschwindigkeit murrt))

Drittens, wenn das System keinen Zugriff auf etwas bietet, das Sie brauchen, ist das, was das Klassenüberschreibungssystem ist. So etwas wie

Sie rufen im Grunde den gleichen Code wie zuvor, aber verstauen die Ergebnisse irgendwo für späteren Zugriff. Etwa so sicher wie ein Override bekommen kann.

+0

Danke Alan, gute Antwort.Ich hatte Bedenken, zur Datenbank zurückzukehren, weil dieses Modell den Standard-Autoload-Prozess nicht zu durchlaufen scheint, weshalb das Ereignis "$ model_load" nicht ausgelöst wird. Ich mag die Idee, den 'Mage :: register' zu verwenden, um den Wert zu speichern. Wird 'Mage :: register' global gespeichert oder nur für diese 'checkout/session'? Wenn es global ist, muss ich überprüfen, ob die Rate, die gespeichert wird, das 'dest_zip' enthält, das verwendet wird, um es zu berechnen. Aber das ist ein Implementierungsdetail. –

+0

P.S. Das Laden der Datenbank für 'table rate' wird in 'Mage_Shipping_Model_Mysql4_Carrier_Table- rate_Collection :: __ construct()' durchgeführt und ist ziemlich komplex, da es drei Tabellen im Join involviert. –

+2

Ah, ich habe die Frage falsch verstanden. Ich dachte, du wolltest es während derselben Anfrage nutzen. Ich bin mir ziemlich sicher, dass Mage :: register eine pro-Anfrage-Sache ist ... globale Variablen, ohne den globalen Geltungsbereich zu verletzen. Auch, FWIW, ich habe gerade meine lokale 1.4 und 1.4.1 Codebasis durchsucht und das shipping_carrier_tablerate_load Event nirgendwo gefunden. –