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();
        }
    }
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top