Diferença entre cotação de vendas e endereço de cotação de vendas

8

Estou procurando qual observador collect_totals posso usar. Existem dois observadores, sales_quote_collect_totals_before e sales_quote_address_collect_totals_before .

Eles podem ser encontrados em /app/code/core/Mage/Sales/Model/Quote.phpe /app/code/core/Mage/Sales/Model/Quote/Address.php.

Gostaria de saber qual é a diferença entre os dois arquivos, pois ambos os arquivos têm as funções totais de coleta?

user1240207
fonte

Respostas:

14

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

é a classe Quote para o objeto quote

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

é a classe Endereço de cotação para qualquer objeto de endereço de cotação

Um objeto de cotação normalmente conteria 2 objetos de endereço, mas poderá conter mais se houver vários endereços de entrega.

Em relação ao (s) método (s) de coleta total: primeiro vamos entender cada método e seu objetivo:

O método em Mage_Sales_Model_Quote, é o ponto de entrada inicial do Totals Collectorsubsistema e é iniciado por um carrinho salvo,

(isso permite que você injete métodos de classe nos cálculos do carrinho, para afetar o resultado dos totais do carrinho - exemplo: cálculos de descontos no carrinho)

Código de fluxo da seguinte maneira:

Mage_Checkout_Model_Cart::save()

Mage_Sales_Model_Quote::collectTotals() <--- ponto de entrada do subsistema coletor

Mage_Sales_Model_Quote_Address::collectTotals() <- cada endereço anexado ao objeto de cotação é chamado, por meio de um loop no objeto de totais de coleta de cotação.

Agora, no método collecttotals de endereço, é executado um loop, usando todos os 'coletores' definidos pelo sistema, chamando cada classe / método, permitindo assim que os totais da ordem sejam ajustados por cálculos adicionais (lembre-se de que todos os totais ficam fora do endereço (s) objeto (s), não o objeto de citação real, que permite ao magento realizar checkout em vários endereços)

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

Uma lista de possíveis 'colecionadores' seria:

insira a descrição da imagem aqui

Você pode injetar seu próprio coletor de totais por meio de uma configuração de módulo e deve ter um collectmétodo como ponto de entrada.

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

Agora, considerando todas essas informações, e os eventos disparados:

sales_quote_collect_totals_before : é acionado antes que qualquer objeto de endereço seja carregado e o coletor de totais é acionado

sales_quote_address_collect_totals_before : é acionado dentro do (s) objeto (s) de endereço de cotação, antes de cada objeto de endereço executar a lista de possíveis objetos coletores.

Sem conhecer seu jogo final, eu não seria capaz de determinar qual é o caminho certo para você, no entanto, eu também sugeriria considerar se nenhum deles é o certo e que você seria mais adequado em adicionar um novo coletor para o jogo. sistema coletor de totais

Espero que essas informações o ajudem a determinar o caminho certo para estender a funcionalidade e fornecer uma solução estável.

ProxiBlue
fonte
super explicação!
David Manners
Eu li a primeira linha e já decidi +1.
Pspahn
@ProxiBlue depois de ler sua resposta, acredito que você me ajude a resolver um problema relacionado ao método collectTotals (). Portanto, tenho dois atributos de desconto em minha tabela de produtos para aplicar descontos em produtos na colocação de pedidos. Portanto, quando criamos Quote, adicionamos esses valores de desconto e after_discount na tabela de cotações, o que é bom. Agora, quando faço o pedido, vejo na linha $ quote-> collectTotals () -> save () os valores de desconto se tornam 0 e o valor total se torna preço original (sem preço de desconto). Por favor, você pode dizer como consertar isso.
Apandey846