So lösen Sie ein Minicart-Update nach dem Hinzufügen zum Warenkorb aus

10

Ich habe die folgende Klasse, die ich verwende, um das Hinzufügen zum Warenkorb auf benutzerdefinierte Weise zu testen.

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

Das funktioniert super. Wenn Sie den Warenkorb anzeigen, wird mein Artikel angezeigt, in der Datenbank usw. sieht alles cool aus. Der Minicart zeigt jedoch weiterhin an, als ob sich keine Artikel im Warenkorb befinden.

Wenn ich dann ein anderes Produkt in den Warenkorb lege, indem ich auf der Produkt- oder Listenseite auf die Schaltfläche "In den Warenkorb" klicke, wird es dem Warenkorb hinzugefügt und der Minicart aktualisiert, um beide Artikel anzuzeigen.

Wo löst es den Minicart aus, sich selbst zu aktualisieren, oder woher weiß der Minicart, dass er aktualisiert werden muss?

Smartie
quelle

Antworten:

36

Danke für Ihre Hilfe :)

Ich habe herausgefunden, wie man es auslöst. Sie müssen ein sections.xmlInside etc / Frontend Ihres Moduls einrichten , das Magento mitteilt, welche Abschnitte für einen bestimmten Ajax-Aufruf aktualisiert werden sollen. Hier ist ein Beispiel;

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

Nachdem mein Ajax-Anruf bei [frontName]/[ActionPath]/[ActionName]Magento beendet wurde, ruft er / customer / section / load erneut an und übergibt die zu ladenden Abschnitte.

Standardmäßig werden alle Nachrichten angefordert. Wenn Sie jedoch Ihre section.xml korrekt eingerichtet haben, werden auch die dort definierten Abschnittsnamen angezeigt.

Smartie
quelle
@ Smartic, gute Informationen, die ich von hier bekommen habe
Amit Bera
Bitte helfen Sie mit magento.stackexchange.com/questions/166641/…
Ankit Shah
Genial, ich habe daran gearbeitet, andere Blöcke über Ajax zu aktualisieren, und das hat mich dorthin gebracht. Vielen Dank, dass Sie Ihre Lösung veröffentlicht haben.
Eirik
@Smartie gibt es eine Möglichkeit, den Warenkorbbereich nach einem Magento-API-Aufruf zu aktualisieren?
ND17
1
@Smartie Bei mehreren hinzugefügten Produkten wird nur die Menge des ersten Produkts aktualisiert, und die Anzahl der Restprodukte wird nicht im Minikorb angezeigt. Müssen wir hier noch etwas hinzufügen?
DEEP JOSHI
6

Dies hängt nicht direkt mit der Frage zusammen. Wenn Sie jedoch den Warenkorb über AJAX-Aufrufe in normalen Magento- require.jsDateien aktualisieren , können Sie das Magento_Customer/js/customer-dataObjekt anfordern und den Minicart auf diese Weise auffordern, ebenfalls zu aktualisieren:

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

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

thaddeusmt
quelle
Also habe ich es hier geschafft und nach einer Lösung für mein benutzerdefiniertes page_layout gesucht. Meine Mini-Cart-Anzahl war immer 0, wenn ich eine meiner benutzerdefinierten Seiten besuchte. Am Ende musste ich rennen customerData.invalidate(sections);und dann konnte Magento den Rest erledigen.
James Harrington
2

Im Laden, wenn Sie in der Quelle im Minicart-Bereich tauchen

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

Wie Sie hier sehen können, führt magento2 Komponenten innerhalb des Skript-Tags aus und dynamische Bindungsdaten, um Minicart zu blockieren. Verwenden Sie knockoutJs

Etwas Interessantes entdecke ich

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

Aus dem Checkout-Layout. Es definiert einen componentfür Minicart-Inhalt zu getdata. Weiter sehen, Magento_Checkout/js/view/minicartSie werden sehen

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