Comment déclencher une mise à jour de minicart après l'ajout au panier

10

J'ai la classe suivante que j'utilise pour tester l'ajout au panier d'une manière personnalisée;

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

Cela fonctionne très bien. Lorsque vous affichez le panier, il montre mon article, tout a l'air cool dans la base de données, etc. Cependant, le mini-chariot s'affiche toujours comme s'il n'y avait aucun article dans le panier.

Si j'ajoute ensuite un autre produit au panier en utilisant le bouton "ajouter au panier" sur les pages produit ou liste, il ajoute au panier et met à jour le mini-chariot pour afficher les deux articles.

Où déclenche-t-il le mini-chariot pour se mettre à jour ou comment le mini-chariot sait-il qu'il doit se rafraîchir?

Smartie
la source

Réponses:

36

Merci de votre aide :)

J'ai trouvé comment le déclencher, vous devez configurer un sections.xmletc etc / frontend de votre module qui indique à Magento quelles sections mettre à jour pour un appel Ajax donné. Voici un exemple;

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

Une fois mon appel Ajax terminé, [frontName]/[ActionPath]/[ActionName]Magento fait un autre appel à / customer / section / load en passant les sections à charger.

Par défaut, il demande tous les messages, mais si vous avez correctement configuré votre sections.xml, vous verrez également les noms de section que vous avez définis ici.

Smartie
la source
@ smartic, Bonne information j'ai obtenu un clef d'ici
Amit Bera
S'il vous plaît aider avec magento.stackexchange.com/questions/166641/…
Ankit Shah
Génial, je travaillais sur la mise à jour d'autres blocs via ajax et cela m'a permis d'y arriver. Merci d'avoir posté votre solution.
Eirik
@Smartie existe-t-il un moyen de mettre à jour la section du panier après un appel API magento?
ND17
1
@Smartie Pour plusieurs produits ajoutés, la mise à jour de la quantité du premier produit uniquement et le nombre de produits restants ne sont pas affichés dans le mini-panier. Faut-il ajouter quelque chose de plus ici?
DEEP JOSHI
6

Ce n'est pas directement lié à la question, mais si vous mettez à jour le panier via des appels AJAX dans des require.jsfichiers Magento normaux , vous pouvez exiger l' Magento_Customer/js/customer-dataobjet et demander au minicart de se rafraîchir de cette manière également:

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

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

thaddeusmt
la source
Je l'ai donc fait ici à la recherche d'une solution pour ma page_layout personnalisée. Le nombre de mes mini-chariots était toujours de 0 lorsque je consultais l'une de mes pages personnalisées. J'ai fini par devoir courir customerData.invalidate(sections);et Magento a pu faire le reste.
James Harrington
2

En devanture si vous plongez dans la source dans la zone 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>

Comme vous pouvez le voir ici, magento2 exécute des composants à l'intérieur de la balise de script et des données de liaison dynamique pour bloquer l'utilisation des knockoutJs par minicart

Quelque chose d'intéressant que je découvre

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

À partir de la disposition de la caisse. Il définit un componentcontenu minicart pour obtenir des données Continuez de voir, Magento_Checkout/js/view/minicartvous verrez

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