Come attivare un aggiornamento per minicart dopo l'aggiunta al carrello


10

Ho la seguente classe che sto usando per testare l'aggiunta al carrello in modo personalizzato;

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();
    }
}

Funziona benissimo. Quando vedi il carrello mostra il mio articolo, tutto sembra bello nel database ecc. Tuttavia, la minicart mostra ancora come se non ci fossero articoli nel carrello.

Se poi aggiungo un altro prodotto al carrello usando il pulsante "aggiungi al carrello" sul prodotto o elencando le pagine, questo si aggiunge al carrello e aggiorna la minicart per mostrare entrambi gli articoli.

Dove si attiva l'aggiornamento della minicart o in che modo la minicart sa di dover aggiornare?

Risposte:


36

Grazie per l'aiuto :)

Ho scoperto come attivarlo, è necessario impostare un sections.xmlfrontend etc / interno del modulo che indichi a Magento quali sezioni aggiornare per una determinata chiamata Ajax. Ecco un esempio;

<?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>

Dopo che la mia chiamata Ajax è terminata con [frontName]/[ActionPath]/[ActionName]Magento, effettua un'altra chiamata a / customer / section / load passando le sezioni da caricare.

Per impostazione predefinita, richiede eventuali messaggi, ma se hai impostato correttamente il file section.xml, vedrai anche i nomi delle sezioni che hai definito anche lì.


@ smartic, Buone informazioni che ho ricevuto da qui
Amit Bera

Per favore aiutatemi
Ankit Shah

Fantastico, stavo lavorando per aggiornare altri blocchi tramite Ajax e questo mi ha portato lì. Grazie per aver postato la tua soluzione.
Eirik,

@Smartie c'è un modo per aggiornare la sezione carrello dopo qualche chiamata api magento?
ND17,

1
@Smartie Per l'aggiunta multipla di prodotti, si aggiorna solo la quantità del primo prodotto e il conteggio dei prodotti rimanenti non viene visualizzato nel mini carrello. Dobbiamo aggiungere altro qui?
DEEP JOSHI

6

Questo non è direttamente correlato alla domanda, ma se stai aggiornando il carrello tramite chiamate AJAX in normali require.jsfile Magento , puoi richiedere l' Magento_Customer/js/customer-dataoggetto e chiedere alla minicart di aggiornare in questo modo:

<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


Così l'ho fatto qui cercando una soluzione per il mio page_layout personalizzato. Il mio conteggio mini carrello era sempre 0 ogni volta che sono andato su una qualsiasi delle mie pagine personalizzate. Ho finito per correre customerData.invalidate(sections);e poi Magento è stato in grado di fare il resto.
James Harrington,

2

In vetrina se ti immergi nella sorgente nell'area della 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>

Come puoi vedere qui magento2 esegue componenti all'interno del tag script e dei dati di bind dinamico per bloccare l'utilizzo di minicart knockoutJs

Qualcosa di interessante che scopro

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

Dal layout di Google Checkout. Definisce un componentcontenuto per minicart per getdata. Continua Magento_Checkout/js/view/minicarta vedere

.....
$('[data-block="minicart"]').on('contentLoading', function(event) {
      addToCartCalls++;
      self.isLoading(true);
});
.....
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.