2012-07-18 14 views
11

Ogni volta che si carica la pagina della spesa in Magento, il seguente codice viene eseguitoDa dove viene impostato Magento Set a Quote Item Price?

$cart->init(); 
$cart->save(); 

Un effetto collaterale di questo è che i prezzi per tutti gli articoli nel carrello vengono aggiornati se il prezzo del prodotto è stato aggiornato. Ciò aggiorna effettivamente la voce in sales_flat_quote_item. Sto cercando di rintracciare dove nel codice il prezzo è aggiornato su ogni articolo di preventivo e dove ogni elemento di preventivo è salvato.

Conosco le ubicazioni di myrid possibile impostare. Spero che qualcuno sappia dove è effettivamente impostato. Ramo Magento 1.7x in particolare, sebbene le informazioni di tutte le versioni siano benvenute.

risposta

15

Da un livello alto, il codice che avvia l'intero processo sono linee 464 e 465 di Mage_Checkout_Model_Cart:

$this->getQuote()->collectTotals(); 
$this->getQuote()->save(); 

Il nuovo prezzo prodotto viene impostato contro il prezzo in Mage_Sales_Model_Quote_Address_Total_Subtotal nel metodo _initItem. Verrà visualizzato $item->setPrice nella dichiarazione if/else a partire dalla riga 104

+1

Batti un minuto! –

+0

Ha - scusa :) - anche se +1 per una risposta più dettagliata –

1

Non so se questo ti aiuta molto, ma se stai cercando di fare modifiche personalizzate dei prezzi sui prodotti nel carrello, invece di estendere e modificare le classi principali, utilizzo un osservatore sales_quote_save_before. Funziona benissimo se stai cercando di personalizzare i prezzi (specialmente quando ho prodotti che possono essere personalizzati). Ho esempi di codice se li vuoi.

Ma sto parlando con Alan Storm qui, quindi potresti ridere della mia risposta eccessivamente semplicistica.

+0

Un buon consiglio in generale, quindi +1, ma mi occupo in particolare di dettagli esoterici di implementazione oggi per alcuni nuovi articoli. –

23

Scolpito questo da solo. Quindi c'è questa

#File: app/code/core/Mage/Sales/Model/Quote.php 
foreach ($this->getAllAddresses() as $address) { 
    ... 
    $address->collectTotals(); 
    ... 
}  

che porta a questo

#File: app/code/core/Mage/Sales/Model/Quote/Address.php 
public function collectTotals() 
{ 
    Mage::dispatchEvent($this->_eventPrefix . '_collect_totals_before', array($this->_eventObject => $this)); 
    foreach ($this->getTotalCollector()->getCollectors() as $model) { 
     $model->collect($this);    
    } 
    Mage::dispatchEvent($this->_eventPrefix . '_collect_totals_after', array($this->_eventObject => $this)); 
    return $this; 
} 

Il getTotalCollector oggetto restituisce un oggetto sales/quote_address_total_collector, che carica una serie di modelli di collettore da global/sales/quote/totals e invita collect su di loro. Il metodo del collettore subtotale collect infine chiama

#File: app/code/core/Mage/Sales/Model/Quote/Address/Total/Subtotal.php 
protected function _initItem($address, $item) 
{ 
    //... 
    if ($quoteItem->getParentItem() && $quoteItem->isChildrenCalculated()) { 
     $finalPrice = $quoteItem->getParentItem()->getProduct()->getPriceModel()->getChildFinalPrice(
      $quoteItem->getParentItem()->getProduct(), 
      $quoteItem->getParentItem()->getQty(), 
      $quoteItem->getProduct(), 
      $quoteItem->getQty() 
     ); 
     $item->setPrice($finalPrice) 
      ->setBaseOriginalPrice($finalPrice); 
     $item->calcRowTotal(); 
    } else if (!$quoteItem->getParentItem()) { 
     $finalPrice = $product->getFinalPrice($quoteItem->getQty()); 
     $item->setPrice($finalPrice) 
      ->setBaseOriginalPrice($finalPrice); 
     $item->calcRowTotal(); 
     $this->_addAmount($item->getRowTotal()); 
     $this->_addBaseAmount($item->getBaseRowTotal()); 
     $address->setTotalQty($address->getTotalQty() + $item->getQty()); 
    }  
    //... 
} 

ed è qui l'elemento citazione prende il suo prezzo stabilito/riposo.

+2

È venuto qui per dire lo stesso. In attesa di Magento articoli esoterici. – benmarks