Minicart pop-up quando adiciono um produto ao carrinho magento 2

15

Estou usando o magento 2.0.7, e o que estou tentando fazer é abrir o carrinho (o carrinho superior direito do ajax) quando adiciono um produto a ele, basicamente o aciono. Tentei adicionar a classe "showcart" às minhas classes de botão adicionar ao carrinho, mas, se o fizer, o botão abre o carrinho e não adiciona mais o produto.

alexcr
fonte

Respostas:

36

Esta é a minha primeira resposta neste site. Eu tenho tentado fazer isso funcionar nos últimos dois dias e finalmente consegui fazê-lo funcionar, então achei que seria bom compartilhá-lo.

Primeiro de tudo você precisa criar um módulo:

  • registration.php
  • etc / module.xml
  • view / frontend / layout / default.xml
  • view / frontend / templates / minicart_open.phtml
  • view / frontend / web / js / view / minicart_open.js

Etapa 1. Você precisa adicionar um modelo ao site. A maneira de fazer isso é usando o default.xml

<referenceContainer name="content">
  <block class="Magento\Framework\View\Element\Template" name="minicart.autoopen" template="Company_ModuleName::minicart_open.phtml"/>
</referenceContainer>

Etapa 2. Então, dentro do minicart_open.phtml, precisamos chamar nosso arquivo js (componente), anexando-o à div pai do minicart. Nesse caso, [data-block = 'minicart']. Veja este link para mais detalhes.

<script type="text/x-magento-init">
{
     "[data-block='minicart']" : {
        "Company_ModuleName/js/view/minicart_open" : {}
     }
}
</script>

Etapa 3. E, finalmente, dentro de minicart_open.js, o código mágico:

define(["jquery/ui","jquery"], function(Component, $){
    return function(config, element){
        var minicart = $(element);
        minicart.on('contentLoading', function () {
            minicart.on('contentUpdated', function () {
                minicart.find('[data-role="dropdownDialog"]').dropdownDialog("open");
            });
        });
    }
});

Basicamente, esse código estende a funcionalidade do arquivo vendor/magento/module-checkout/view/frontend/web/js/view/minicart.jse diz que quando a chamada AJAX for concluída (contentUpdated), o minicart deverá ser aberto.

E é isso, uma tarefa simples com muita teoria por trás. Espero que ajude.

pinicio
fonte
Funcionou como um encanto. Tks!
medina
Parece uma boa solução, por que isso precisa ser um módulo? Fazer essas alterações no seu tema não teria o mesmo efeito?
Ben Crook
Além da resposta acima de @pinicio: Note-se que a solução só funcionará se ajax é usado para o suplemento ao carrinho função: magento.stackexchange.com/questions/125681/...
Soeren
1
Funciona na atualização do carrinho, como quando adicionamos o produto, mas não deve funcionar quando removemos o item do carrinho. mas está funcionando naquele momento também.
Ronak Chauhan 12/04/19
Se eu tentar excluir um item do mini carrinho, item não é deleting..ie) uma vez que eu clique no ícone de exclusão, somente após a atualização da página, o item excluído está sendo refleted
Sushivam
6

Isso pode ser feito simplesmente modificando o arquivo minicart.js.

Navegar para vendor/magento/Magento_Checkout/view/web/js/view/minicart.js

Sob initialize: function, você verá

$('[data-block="minicart"]').on('contentLoading', function (event) {

Substitua a função por este código.

$('[data-block="minicart"]').on('contentLoading', function (event) {
            addToCartCalls++;
            self.isLoading(true);
            $('[data-block="minicart"]').on('contentUpdated', function ()  {
                $('[data-block="minicart"]').find('[data-role="dropdownDialog"]').dropdownDialog("open");       
                setTimeout(function() {
                $('[data-block="minicart"]').find('[data-role="dropdownDialog"]').dropdownDialog("close");
            }, 4000);
            });
        });

Você pode alterar o tempo limite conforme sua exigência.

faça upload do arquivo e limpe o cache executando o comando

php bin/magento cache:clean

Felicidades!

Ajendra Panwar
fonte
1
i tentou um presente, mas não funcionou, eu corou o cache
inrsaurabh
Verifique se você não substituiu este fornecedor de arquivos / magento / Magento_Checkout / view / web / js / view / minicart.js no seu tema.
precisa saber é o seguinte
Você nunca deve alterar os arquivos principais diretamente. Em vez disso, altere-o no seu tema ou em um módulo personalizado.
pinicio 29/11
Ainda bem que ajudou você :)
Ajendra Panwar
1
Funcionou como um encanto no Magento 2.2.3. Tks montões!
medina
4

solução alternativa: check vendor/magento/module-catalog/view/frontend/web/js/catalog-add-to-cart.jsline: 100

$(document).trigger('ajax:addToCart', form.data().productSku);

Poderíamos adicionar um arquivo js personalizado:

<script type="text/x-magento-init">
{
    "*": {
        "Magento_Catalog/js/view/minicart-open": {}
    }
}

Nos js:

$(document).on('ajax:addToCart', function () {#code here...}
Jonas Chen
fonte
2

Simplesmente, você pode usar esse código no minicart.phtml abaixo do seu código de modelo. Estou usando esse código e ele está trabalhando para melhor. você pode experimentá-lo. Obrigado.

<script type="text/javascript">
    require(['jquery'], function ($) {
        $('.minicart-wrapper').on('contentLoading', function (event) {
            $('[data-block="minicart"]').on('contentUpdated', function () {
                $('[data-block="minicart"]').find('[data-role="dropdownDialog"]').dropdownDialog("open");
                setTimeout(function () {
                    $('[data-block="minicart"]').find('[data-role="dropdownDialog"]').dropdownDialog("close");
                }, 4000);
            });
        });
    });
</script>
Rafiqul Islam
fonte
Graças ao seu trabalho ... Eu quero aprender o fluxo do Magento JS. Como funciona, por favor, compartilhe algum link
55840 8/19
1

Esta resposta acima funciona, mas está faltando a chave de fechamento:

            $('[data-block="minicart"]').on('contentLoading', function (event) {
            addToCartCalls++;
            self.isLoading(true);
                $('[data-block="minicart"]').on('contentUpdated', function ()  {
                    $('[data-block="minicart"]').find('[data-role="dropdownDialog"]').dropdownDialog("open");

                setTimeout(function() {
                $('[data-block="minicart"]').find('[data-role="dropdownDialog"]').dropdownDialog("close");
                }, 4000);
            });
        });
Rich S
fonte