Como acionar uma atualização de minicart após adicionar ao carrinho

10

Eu tenho a seguinte classe que estou usando para testar a adição ao carrinho de maneira personalizada;

use Magento\Framework\App\Action;
use Magento\Checkout\Model\Cart;

class Add extends Action\Action
{
    protected $cart;

    public function __construct(
        Action\Context $context,
        Cart $cart
    ){
        $this->cart = $cart;
        parent::__construct($context);
    }

    public function execute()
    {
        $this->cart->addProductsByIds([1])
            ->save();
    }
}

Isso funciona muito bem. Quando você visualiza o carrinho, ele mostra meu item, tudo parece legal no banco de dados, etc. No entanto, o minicart ainda mostra como se não houvesse itens na cesta.

Se eu adicionar outro produto ao carrinho usando o botão "adicionar ao carrinho" no produto ou nas páginas de listagem, ele adiciona ao carrinho e atualiza o minicart para mostrar os dois itens.

Onde ele aciona o minicart para se atualizar ou como o minicart sabe que precisa atualizar?

Smartie
fonte

Respostas:

36

Obrigado pela ajuda :)

Eu descobri como ativá-lo, você precisa configurar um sections.xmlfront-end etc / front-end do seu módulo que informe ao Magento quais seções devem ser atualizadas para uma chamada do Ajax. Aqui está um exemplo;

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Customer:etc/sections.xsd">
    <action name="[frontName]/[ActionPath]/[ActionName]">
        <section name="cart"/>
    </action>
</config>

Depois que minha ligação do Ajax termina, o [frontName]/[ActionPath]/[ActionName]Magento faz outra ligação para / customer / section / load, passando as seções para carregar.

Por padrão, ele solicita qualquer mensagem, mas se você configurou seu section.xml corretamente, também verá os nomes de seção que você definiu lá.

Smartie
fonte
@ smartic, Boas informações que tenho aqui daqui
Amit Bera
Por favor, ajude com magento.stackexchange.com/questions/166641/…
Ankit Shah
Incrível, eu estava trabalhando na atualização de outros blocos via ajax e isso me levou até lá. Obrigado por postar sua solução.
Eirik
@ Smartie, existe alguma maneira de atualizar a seção do carrinho depois de alguma chamada da API do Magento?
ND17
1
@Smartie Para adicionar vários produtos, apenas a quantidade de atualização do primeiro produto e a contagem restante do produto não são mostradas no carrinho de compras. Nós precisamos adicionar mais alguma coisa aqui?
DEEP JOSHI
6

Isso não está diretamente relacionado à pergunta, mas se você estiver atualizando o carrinho por meio de chamadas AJAX em require.jsarquivos Magento normais , poderá exigir o Magento_Customer/js/customer-dataobjeto e solicitar ao minicart que atualize dessa maneira:

<script>
    require([
        'Magento_Customer/js/customer-data'
    ], function (customerData) {
        var sections = ['cart'];
        customerData.invalidate(sections);
        customerData.reload(sections, true);
    });
</script>

Fonte: https://github.com/magento/magento2/issues/5621

thaddeusmt
fonte
Então, eu fiz aqui procurando uma solução para o meu page_layout personalizado. Minha contagem de mini cart sempre foi 0 sempre que fui a qualquer uma das minhas páginas personalizadas. Acabei tendo que correr customerData.invalidate(sections);e o Magento foi capaz de fazer o resto.
James Harrington
2

Na loja, se você mergulhar na fonte na área de minicart

<div data-block="minicart" class="minicart-wrapper">
  <a class="action showcart" 
   data-bind="scope: 'minicart_content'">
     ... 
  </a>

   <script type="text/x-magento-init">
   {
    "[data-block='minicart']": {
        "Magento_Ui/js/core/app": {"components":{....}
     }
   }
</script>
</div>

Como você pode ver aqui, o magento2 executa componentes dentro da tag de script e dos dados de ligação dinâmica para bloquear o uso do minicart por knockoutJs

Algo interessante que eu descubro

\vendor\magento\module-checkout\view\frontend\layout\default.xml

No layout do Google Checkout. Ele define um componentpara o minicart-content para getdata Continue veja Magento_Checkout/js/view/minicartvocê verá

.....
$('[data-block="minicart"]').on('contentLoading', function(event) {
      addToCartCalls++;
      self.isLoading(true);
});
.....
mrtuvn
fonte