2011-10-03 22 views
11

Ho un osservatore che rimuove gli articoli dal carrello se sono esauriti (ovvero il cliente ritorna al carrello x tempo e un articolo nel carrello è esaurito), e mostra un messaggio all'utente.Magento ricalcolare il totale del carrello nell'osservatore

La rimozione degli articoli funziona, ma non l'aggiornamento del totale del carrello. Qualsiasi aiuto sarebbe molto apprezzato!

mio osservatore osserva l'evento sales_quote_save_before:

public function checkStockStatus($observer) 
{ 
    // return if disabled or observer already executed on this request 
    if (!Mage::helper('stockcheck')->isEnabled() || Mage::registry('stockcheck_observer_executed')) { 
     return $this; 
    } 

    $quote = $observer->getEvent()->getQuote(); 
    $outOfStockCount = 0; 

    foreach ($quote->getAllItems() as $item) { 
     $product = Mage::getModel('catalog/product')->load($item->getProductId()); 
     $stockItem = $product->getStockItem(); 
     if ($stockItem->getIsInStock()) { 
      // in stock - for testing only 
      $this->_getSession()->addSuccess(Mage::helper('stockcheck')->__('in stock')); 
      $item->setData('calculation_price', null); 
      $item->setData('original_price', null); 
     } 
     else { 
      //remove item 
      $this->_getCart()->removeItem($item->getId()); 
      $outOfStockCount++; 
      $this->_getSession()->addError(Mage::helper('stockcheck')->__('Out of Stock')); 
     } 
    } 

    if ($outOfStockCount) > 0) {  
     $quote->setTotalsCollectedFlag(false)->collectTotals(); 
    } 

    Mage::register('stockcheck_observer_executed', true); 

    return $this;   
} 

protected function _getCart() 
{ 
    return Mage::getSingleton('checkout/cart'); 
} 

protected function _getSession() 
{ 
    return Mage::getSingleton('checkout/session'); 
} 

risposta

3

Grazie @Anton per il vostro aiuto!

La risposta che ha finito per lavorare per me è stato quello di effettuare una chiamata al session_write_close(); prima del reindirizzamento (nell'osservatore):

if (// products are out-of-stock and were removed...) { 
    $this->_getSession()->addError('Error message here.'); 
    $this->_getSession()->getQuote()->setTotalsCollectedFlag(false)->collectTotals(); 
    session_write_close(); 
    Mage::app()->getResponse()->setRedirect('index'); 
} 
+0

puoi accettare la risposta quindi per gli altri sapere che è stato risolto –

20

Suggerimento per il giorno: osservando il * _save_after e cercando di forzare lo stesso oggetto di cambiare normalmente chiamare salvare di nuovo e finirai nel ciclo .oO

Tuttavia, se si osserva il metodo collectTotals() nella classe di quotazione, si noterà che manca una bandiera importante ->setTotalsCollectedFlag(false)->collectTotals() per rendere possibile il calcolo una volta che è stato già calcolato.

vita sarebbe qualcosa di diverso se non ci fossero alcuni bug nel vostro cammino verso la gloria così essere a conoscenza il seguente problema in Magento: Issue #26145

+0

Grazie per la punta della giornata! Modificato il codice per rimuovere il ciclo infinito (osservando * _save_before e non facendo nuove chiamate a 'save()'). Tuttavia, anche quando aggiungo '-> setTotalsCollectedFlag (false)' prima di chiamare '-> collectTotals()' i totali non vengono aggiornati. Cos'altro mi manca? –

+0

vedrai le modifiche dopo una ricarica? –

+0

sì, ma il messaggio scompare. Se faccio un reindirizzamento nel mio osservatore, ottengo immediatamente i totali aggiornati, ma anche nessun messaggio. Quello che cerco è entrambi :) –

0

Che dire prossimo flusso:

  1. rimuovere elementi in osservatore sales_quote_save_before e aggiungere un po 'la bandiera di Registro di sistema: Mage::register('ooops_we_need_a_redirect', $url)

  2. In osservatore sales_quote_save_after fanno redirect, se necessario:

    se (Mage :: registro ('ooops_we_need_a_redirect')) {// non reindirizzare }

+0

Non riesco a vedere come risolvere il problema dei messaggi di sessione (ad esempio 'Mage :: getSingleton ('chekout/session') -> addError ('messaggio di errore qui'); ') si perde in un aggiornamento di pagina/reindirizzamento? –

+0

Non riesco a vedere come "ricalcolare il totale del carrello nell'osservatore" sia correlato a "messaggi di sessione (cioè' Mage :: getSingleton ('chekout/session') -> addError ('messaggio di errore qui'); ') si perde su un reindirizzamento/aggiornamento pagina? "... – Zyava

+0

hai assolutamente ragione, il titolo della mia domanda non è così descrittivo come avrebbe potuto essere. A peggiorare le cose, avevo modificato la domanda, eliminando involontariamente ulteriori chiarimenti (per ragioni di brevità). La sfida consisteva nel ricalcolare il totale del carrello ** e ** visualizzare un messaggio di sessione per l'utente. Sono stato in grado di ottenere la rimozione degli elementi e il ricalcolo totale (tramite un reindirizzamento nell'osservatore dopo una chiamata a 'collectTotals()') ** o ** rimuovendo gli elementi e visualizzando il messaggio (senza reindirizzamento), ma rimanendo bloccato con un totale errato. –

Problemi correlati