2011-10-03 15 views
11

Mam obserwatora, który usuwa przedmioty z koszyka, jeśli nie ma ich w magazynie (tzn. Klienci wracają do koszyka po raz pierwszy, a produkt w koszyku wyczerpał się), oraz pokazuje wiadomość dla użytkownika.Magento przeliczyć ponownie koszyk ogółem w obserwatorze

Usuwanie elementu (-ów) działa, ale aktualizacja wartości koszyka nie jest możliwa. Każda pomoc będzie bardzo ceniona!

Mój obserwator zauważa zdarzenie 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'); 
} 

Odpowiedz

3

Dziękuję @Anton za pomoc!

Odpowiedź, że skończyło się na pracy dla mnie było, aby nawiązać połączenie z session_write_close(); przed przekierowaniem (w charakterze obserwatora):

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

możesz zaakceptować odpowiedź, aby inni wiedzieli, że jest ona rozwiązana –

20

wskazówka dla Dnia: obserwując * _save_after i próbuje zmusić ten sam obiekt, aby zmienić zwykle nazywamy zapisać ponownie, a skończysz w nieskończonej pętli .oO

Jednak jeśli zauważysz metodę collectTotals() w klasie cytatów, zauważysz, że brakuje ważnej flagi ->setTotalsCollectedFlag(false)->collectTotals(), aby umożliwić obliczenie po obliczeniu.

Życie byłoby coś innego, jeśli nie było pewne błędy w swojej drodze do chwały, więc być świadomi następującej kwestii w Magento: Issue #26145

+0

Dzięki za cynk dnia! Edytował kod, aby usunąć nieskończoną pętlę (obserwując * _save_before i nie wykonując nowych wywołań funkcji 'save()'). Jednak nawet gdy dodaję '-> setTotalsCollectedFlag (false)' przed wywołaniem '-> collectTotals()' sumy nie są aktualizowane. Czego jeszcze brakuje? –

+0

zobaczysz zmiany po przeładowaniu? –

+0

tak, ale komunikat znika. Jeśli wykonuję przekierowanie w moim obserwatorze, natychmiast otrzymuję zaktualizowane sumy, ale także brak wiadomości. To, czego szukam, to zarówno :) –

0

co obok przepływu:

  1. Usuń pozycje w obserwator na sales_quote_save_before i dodać jakieś flagi do rejestru: Mage::register('ooops_we_need_a_redirect', $url)

  2. W obserwatora na sales_quote_save_after należy przekierować jeśli potrzebne:

    if (Mage :: rejestru ('ooops_we_need_a_redirect')) {// nie przekierować }

+0

Nie widzę, jak rozwiązałoby to problem z komunikatami sesji (np. 'Mage :: getSingleton ('chekout/session') -> addError ("komunikat o błędzie tutaj"); ') gubić się na przekierowaniu/odświeżaniu strony? –

+0

Nie widzę, jak "ponownie oblicz suma koszyka w obserwatorze" jest związane z "komunikatami sesji" (tj. 'Mage :: getSingleton (" chekout/session ") -> addError (" komunikat o błędzie tutaj ");)) gubią się na przekierowanie/odświeżenie strony? "... – Zyava

+0

masz absolutną rację, tytuł mojego pytania nie jest tak opisowy jak mógł być. Co gorsza, zredagowałem to pytanie, nieumyślnie usuwając dodatkowe wyjaśnienia (ze względu na zwięzłość). Wyzwanie polegało na ponownym obliczeniu sumy koszyka ** i ** wyświetleniu użytkownikowi komunikatu sesji. Udało mi się uzyskać usunięcie elementów i całkowitą rekultywację (poprzez przekierowanie w obserwatorze po wywołaniu 'collectTotals()') ** lub ** usunięcie pozycji i wyświetlenie wiadomości (bez przekierowania), ale utknięcie z niepoprawną sumą. –