Unterschied zwischen Angebot und Angebotsadresse

8

Ich suche, welchen Collect_Totals-Beobachter ich verwenden kann. Es gibt zwei Beobachter, sales_quote_collect_totals_before und sales_quote_address_collect_totals_before .

Sie können in /app/code/core/Mage/Sales/Model/Quote.phpund gefunden werden /app/code/core/Mage/Sales/Model/Quote/Address.php.

Ich frage mich, was der Unterschied zwischen den beiden Dateien ist, da beide Dateien die Funktionen zum Sammeln von Gesamtwerten haben.

user1240207
quelle

Antworten:

14

/app/code/core/Mage/Sales/Model/Quote.php

ist die Quote-Klasse für das Quote-Objekt

/app/code/core/Mage/Sales/Model/Quote/Address.php

ist die Angebotsadressklasse für alle Angebotsadressobjekte

Ein Angebotsobjekt enthält normalerweise 2 Adressobjekte, kann jedoch mehr enthalten, wenn mehrere Lieferadressen vorhanden sind.

In Bezug auf die Methode (n) "Gesamtsumme": Lassen Sie uns zunächst jede Methode und ihren Zweck verstehen:

Die Methode in Mage_Sales_Model_Quoteist der erste Einstiegspunkt für das Totals CollectorSubsystem und wird durch das Speichern eines Einkaufswagens initiiert.

(Auf diese Weise können Sie Klassenmethoden in die Warenkorbberechnungen einfügen, um das Ergebnis der Warenkorbsummen zu beeinflussen. Beispiel: Berechnung der Warenkorbrabatte.)

Code-Fluss wie folgt:

Mage_Checkout_Model_Cart::save()

Mage_Sales_Model_Quote::collectTotals() <--- Einstiegspunkt des Kollektorsubsystems

Mage_Sales_Model_Quote_Address::collectTotals() <- Jede an das Angebotsobjekt angehängte Adresse wird über eine Schleife im Angebotserfassungssummenobjekt aufgerufen.

Bei der Methode "Adressensammeln" wird nun eine Schleife ausgeführt, in der alle vom System definierten "Kollektoren" verwendet werden. Dabei wird jede Klasse / Methode aufgerufen, sodass die Summen für die Reihenfolge durch zusätzliche Berechnungen angepasst werden können (denken Sie daran, dass alle Summen von der Adresse abhängen Objekt (e), nicht das eigentliche Angebotsobjekt, wodurch Magento das Auschecken an mehrere Adressen durchführen kann.

foreach ($this->getTotalCollector()->getCollectors() as $model) {
            $model->collect($this);
} 

Eine Liste möglicher "Sammler" wäre:

Geben Sie hier die Bildbeschreibung ein

Sie können Ihren eigenen Summenkollektor über eine Modulkonfiguration als solche einfügen und müssen über eine collectMethode als Einstiegspunkt verfügen .

<sales>
   <quote>
      <totals>
         <giftpromo>
           <class>giftpromo/promo_gift</class>
           <after>discount</after>
           <before>tax,grand_total</before>
           <sort_order>12410</sort_order>
         </giftpromo>
      </totals>
    </quote>
</sales>

In Anbetracht all dieser Informationen und der Ereignisse, die ausgelöst wurden:

sales_quote_collect_totals_before : Wird ausgelöst, bevor ein Adressobjekt geladen wird und der Summenkollektor ausgeführt wird

sales_quote_address_collect_totals_before : Wird in den Angebotsadressobjekten ausgelöst, bevor jedes Adressobjekt die Liste potenzieller Kollektorobjekte ausführt.

Wenn ich Ihr Endspiel nicht kenne, kann ich nicht feststellen, welches das richtige für Sie ist. Ich würde jedoch auch vorschlagen, zu prüfen, ob keines der beiden Spiele richtig ist und ob Sie am besten geeignet sind, einen neuen Sammler für das hinzuzufügen Summenkollektorsystem

Ich hoffe, diese Informationen helfen Ihnen dabei, den richtigen Weg zu finden, um die Funktionalität zu erweitern und eine stabile Lösung zu liefern.

ProxiBlue
quelle
super Erklärung!
David Manners
Ich habe die erste Zeile gelesen und mich bereits für +1 entschieden.
pspahn
@ProxiBlue nach dem Lesen Ihrer Antwort Ich glaube, Sie helfen mir, ein Problem im Zusammenhang mit der Methode collectTotals () zu lösen. Daher habe ich in meiner Produkttabelle zwei Rabattattribute für die Anwendung von Rabatt auf Produkte bei der Auftragserteilung. Wenn wir also ein Angebot erstellen, fügen wir diesen Rabatt- und After_Discount-Betrag in die Angebotstabelle ein, was in Ordnung ist. Wenn ich jetzt eine Bestellung aufgebe, sehe ich in Zeile $ quote-> collectTotals () -> save (), dass die Rabattwerte 0 werden und der Gesamtbetrag zum ursprünglichen Preis (ohne Rabattpreis) wird. Können Sie uns bitte sagen, wie Sie das beheben können?
Apandey846