Différence entre le devis de vente et l'adresse du devis de vente

8

Je cherche quel observateur collect_totals je peux utiliser. Il y a deux observateurs, sales_quote_collect_totals_before et sales_quote_address_collect_totals_before .

Ils peuvent être trouvés dans /app/code/core/Mage/Sales/Model/Quote.phpet /app/code/core/Mage/Sales/Model/Quote/Address.php.

Je me demande quelle est la différence entre les deux fichiers car les deux fichiers ont les fonctions de collecte totale?

user1240207
la source

Réponses:

14

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

est la classe Quote de l'objet quote

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

est la classe d'adresse de devis pour tous les objets d'adresse de devis

Un objet devis contient normalement 2 objets adresse, mais peut en contenir plus si plusieurs adresses de livraison sont présentes.

En ce qui concerne la (les) méthode (s) 'collecttotals': Permet de comprendre d'abord chaque méthode et son objectif:

La méthode dans Mage_Sales_Model_Quote, est le point d'entrée initial du Totals Collectorsous - système, et est lancée par une sauvegarde du panier,

(cela vous permet d'injecter des méthodes de classe dans les calculs du panier, pour affecter le résultat des totaux du panier - exemple: calculs des remises sur le panier)

Flux de code comme suit:

Mage_Checkout_Model_Cart::save()

Mage_Sales_Model_Quote::collectTotals() <--- point d'entrée du sous-système collecteur

Mage_Sales_Model_Quote_Address::collectTotals() <- chaque adresse attachée à l'objet devis est appelée, via une boucle dans l'objet devis collecter totaux.

Maintenant, dans la méthode d'adresse collecttotals, une boucle est effectuée, en utilisant tous les `` collecteurs '' définis par le système, en appelant chaque classe / méthode, permettant ainsi aux totaux de l'ordre d'être ajustés par des calculs supplémentaires (rappelez-vous que tous les totaux pendent de l'adresse objet (s), pas l'objet de devis réel, ce qui permet à magento d'effectuer le paiement à plusieurs adresses)

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

Une liste de «collectionneurs» possibles serait:

entrez la description de l'image ici

Vous pouvez injecter votre propre collecteur de totaux via une configuration de module en tant que telle, et devez avoir une collectméthode comme point d'entrée.

<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>

Maintenant, compte tenu de toutes ces informations et des événements déclenchés:

sales_quote_collect_totals_before : se déclenche avant le chargement de tout objet d'adresse et l'action du collecteur de totaux

sales_quote_address_collect_totals_before : obtient déclenché à l'intérieur des objets d'adresse de devis, avant que chaque objet d'adresse exécute la liste des objets de collecteur potentiels.

Ne connaissant pas votre fin de partie, je ne serais pas en mesure de déterminer celle qui vous convient, mais je suggérerais également de considérer si ni l'un ni l'autre ne convient, et que vous seriez le mieux placé pour ajouter un nouveau collecteur pour le système collecteur de totaux

J'espère que ces informations vous aideront à déterminer la bonne façon d'étendre les fonctionnalités et de proposer une solution stable.

ProxiBlue
la source
super explication!
David Manners
J'ai lu la première ligne et j'ai déjà décidé +1.
pspahn
@ProxiBlue après avoir lu votre réponse, je crois que vous m'aidez à trier un problème lié à la méthode collectTotals (). J'ai donc deux attributs de remise dans ma table Produit pour appliquer une remise sur les produits lors du placement de commande. Ainsi, lorsque nous créons un devis, nous ajoutons ces remises et le montant après-rabais dans le tableau des devis, ce qui est bien. Maintenant, lorsque je passe une commande, je vois à la ligne $ quote-> collectTotals () -> save () les valeurs de remise deviennent 0 et le montant total devient le prix d'origine (sans prix de remise). Veuillez nous dire comment résoudre ce problème.?
apandey846