Magento пересчитывает общий объем телеграммы в наблюдателе
У меня есть наблюдатель, который удаляет предметы из корзины, если их нет на складе (т.е. клиент возвращается к своей корзине x времени, а товар в корзине уже отсутствует) и показывает сообщение пользователю.
Удаление элементов (ов) работает, но обновление общей суммы корзины не выполняется. Любая помощь будет очень признательна!
Мой наблюдатель замечает событие 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');
}
Ответы
Ответ 1
Спасибо @Антон за вашу помощь!
Ответ, который закончился для меня, заключался в том, чтобы сделать вызов session_write_close();
перед перенаправлением (в наблюдателе):
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');
}
Ответ 2
Совет в течение дня:, наблюдая за * _ save_after и пытаясь заставить тот же объект изменить обычно будет вызывать сохранить снова, и вы окажетесь в бесконечном цикле.oO
Однако, если вы наблюдаете метод collectTotals() в классе кавычек, вы заметите, что вам не хватает важного флага ->setTotalsCollectedFlag(false)->collectTotals()
, чтобы сделать расчет возможным, как только он уже был рассчитан.
Жизнь была бы чем-то другим, если бы не было ошибок на вашем пути к славе, поэтому помните о следующей проблеме в Magento: Проблема № 26145
Ответ 3
Как насчет следующего потока:
-
Удалите элементы в observer в sales_quote_save_before
и добавьте в реестр следующий флаг: Mage::register('ooops_we_need_a_redirect', $url)
-
В обозревателе sales_quote_save_after
при необходимости перенаправляйтесь:
if (Mage:: registry ('ooops_we_need_a_redirect')) { // сделать перенаправление
}