Atualização Ajax do botão Prosseguir para checkout se o produto estiver fora de estoque
-
13-12-2019 - |
Pergunta
Agora, a adição e remoção de produtos ocorrem via ajax.Mas quando o produto estiver fora de estoque, quero remover o botão prosseguir para finalizar a compra via ajax.
Depois que o produto fora de estoque for removido do carrinho, o botão prosseguir para finalizar a compra deverá ser exibido novamente.
public function deleteAction()
{
if ($this->getRequest()->isXmlHttpRequest()) {
$itemId = (int) $this->getRequest()->getParam('id');
$msg = '';
if ($itemId) {
try {
$this->_getCart()->removeItem($itemId)
->save();
$msg = $this->__('Item was removed successfully.');
} catch (Exception $e) {
$msg = $this->__('Cannot remove the item.');
// $this->_getSession()->addError($this->__('Cannot remove the item.'));
Mage::logException($e);
}
}
//$this->_redirectReferer(Mage::getUrl('*/*'));
$layout = $this->getLayout();
$update = $layout->getUpdate();
$update->load('born_checkout_cartheader');
$layout->generateXml();
$layout->generateBlocks();
$minicartHtml = $layout->getOutput();
$update->setCacheId(null);
$update->load('born_checkout_cart');
$layout->generateXml();
$layout->generateBlocks();
$cartHtml = $layout->getOutput();
$result = array('minicartHtml' => $minicartHtml,'cartHtml' => $cartHtml,'msg' => $msg);
$this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result));
} else {
parent::deleteAction();
}
}
Solução
Acredito que o botão "prosseguir para finalização da compra" está sendo removido quando você tem um erro nos itens do carrinho (pode acontecer quando o item fica fora de estoque).
Durante a atualização do ajax, a sessão de checkout não é atualizada com o sinalizador Error, o que leva a esse problema.Há uma verificação de sinalizador de erro na página cart.phtml.Você pode ver um código como este <?php if(!$this->hasError()): ?>
<ul class="checkout-types">
.....
</ul>
<?php endif; ?>
A bandeira está colocada Mage_CatalogInventory_Model_Stock_Item::checkQuoteItemQty()
então o que acontece é que o sinalizador de erro será atualizado somente quando você atualizar a página.
SOLUÇÃO
Você precisa atualizar o sinalizador de erro em seu controlador ANTES de gerar seus blocos.
//get all cart items and check for errors.
$cartItems = Mage::getSingleton('checkout/cart')->getQuote()->getAllVisibleItems();
$checkoutSession = Mage::getSingleton('checkout/session');
foreach ($cartItems as $item) {
if ($checkoutSession) {
$baseMessages = $item->getMessage(false);
if ($baseMessages) {
foreach ($baseMessages as $message) {
$messages[] = array(
'text' => $message,
'type' => $item->getHasError() ? 'error' : 'notice'
);
}
}
/* @var $collection Mage_Core_Model_Message_Collection */
$collection = $checkoutSession->getQuoteItemMessages($item->getId(), true);
if ($collection) {
$additionalMessages = $collection->getItems();
foreach ($additionalMessages as $message) {
/* @var $message Mage_Core_Model_Message_Abstract */
$messages[] = array(
'text' => $message->getCode(),
'type' => ($message->getType() == Mage_Core_Model_Message::ERROR) ? 'error' : 'notice'
);
}
}
}
}
$errMsgCount = count($messages, COUNT_RECURSIVE);
//update checkout/session to show checkout button if no error
if(!$errMsgCount){ $checkoutSession->getQuote()->setHasError(FALSE); }
Coloque o código acima na ação do seu controlador antes de gerar blocos.