2012-07-18 12 views
11

Cada vez que se carga la página de compras en Magento, el siguiente código se ejecuta¿Dónde establece Magento el precio de un artículo de oferta?

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

Un efecto secundario de esto es que los precios de los artículos en el carro se actualizan si el precio del producto ha sido actualizado. Esto realmente actualiza la entrada en sales_flat_quote_item. Estoy intentando rastrear dónde en el código el precio se actualiza en cada artículo de cotización, y donde se guarda cada artículo de cotización.

Sé que la ubicación de myrid es podría establecer. Espero que alguien sepa dónde está realmente establecido. Magento 1.7x rama específicamente, aunque la información de todas las versiones es bienvenida.

Respuesta

15

Desde un nivel superior, el código que se inicia todo el proceso son las líneas 464 y 465 de Mage_Checkout_Model_Cart:

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

El nuevo precio del producto se está fijando en contra de la cotización en Mage_Sales_Model_Quote_Address_Total_Subtotal en el método _initItem. Verá $item->setPrice en la declaración if/else que comienza en la línea 104

+1

¡Batame por un minuto! –

+0

Ha - lo siento :) - aunque +1 para una respuesta más detallada –

1

No sé si esto te ayuda mucho, pero si estás tratando de hacer cambios personalizados en los precios de los productos en el carro, en lugar de extender y modificar las clases principales, utilizo un observador sales_quote_save_before. Funciona muy bien si está tratando de personalizar los precios (especialmente cuando tengo productos que pueden ser de longitud personalizada). Tengo ejemplos de código si los quieres.

Pero estoy hablando con THE Alan Storm aquí, por lo que puede reírse de mi respuesta demasiado simplista.

+0

Un buen consejo en general, así que +1, pero estoy tratando específicamente en detalles de implementación esotérica hoy para algunos artículos nuevos. –

23

Me lo guardo. Así que hay esta

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

que conduce a esta

#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; 
} 

El objeto getTotalCollector devuelve un objeto sales/quote_address_total_collector, que carga una serie de modelos de colector a partir global/sales/quote/totals y llama collect en ellos. El método del colector subtotal collect llama en última instancia, este

#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()); 
    }  
    //... 
} 

y aquí es donde el elemento cita recibe su precio fijado/descanso.

+2

Vine aquí para decir lo mismo. Esperando Magento artículos esotéricos. – benmarks

Cuestiones relacionadas