Aktualisieren Sie den Preis auf der Checkout-Seite, ohne Magento 2 zu aktualisieren

7

Ich habe einen Controller, bei dem ich auf der Checkout-Seite einen Rabatt gewähren kann. Jetzt kann ich die Preisänderung sehen, sobald ich die Seite aktualisiert habe.

Ich suche nach einer Lösung, um den Preis mit einer Js-Datei zu aktualisieren.

define([
        'jquery',
        'Magento_Checkout/js/action/get-totals'
        ], function ($, getTotalsAction) {
        "use strict";

          $.ajax({
                method: "post",
                url: demoUrl, //your ajax Url
                data: {/*here post data*/},
                dataType: "html",
                success: function (resp) {
                   //below two lines refershing cart summary
                    var deferred = $.Deferred();
                    getTotalsAction([], deferred); //this function already created in Magento_Checkout/js/action/get-totals.js file
                }

            });

});

Aber wenn ich dieses Skript in meinen Controller einfüge, passiert nichts!

Hat jemand eine Idee, wie man den Preis aktualisieren kann, ohne die Seite zu aktualisieren?

Ich weiß, dass Magento 2 standardmäßig eine Funktion hat, um dies zu tun. Wenn ich einen gültigen Gutscheincode eingebe, wird der Preis aktualisiert, ohne die Seite zu aktualisieren!

Alin Lupoiu
quelle
Hallo. Hast du das erreicht?
Spiil
Hallo, ja, aber ich habe dies mit jQuery erreicht
Alin Lupoiu
Könnten Sie mir bitte Ihre Lösung mitteilen?
Spiil
Könnten Sie uns bitte Ihre Lösung mitteilen?
Condor
Teilen Sie Ihre Ajax-Call-Datei (gesamte JS-Datei), damit ich Ihnen helfen kann.
Glücklicher

Antworten:

1

Verwenden Sie section.xml an folgendem Speicherort: vendor / module_name / etc / frontend / section.xml

<?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="route/controller/actionname">
        <section name="cart"/>
        <section name="checkout-data"/>
    </action>
</config>  
Shashank Gupta
quelle
0

Die Gesamtübersicht der Bestellung sollte nach dem Anwenden des benutzerdefinierten Gutscheins neu geladen werden. Wir sollten die Ereignishandle-Funktion für das benutzerdefinierte Formular hinzufügen, zum Beispiel: onclick, onchange. Wir können der Logik der Couponform folgen.

Das Gutscheinformular:

Geben Sie hier die Bildbeschreibung ein

Wir können die Handle-Funktion für Klickereignisse finden: vendor/magento/module-sales-rule/view/frontend/web/js/view/payment/discount.js

     apply: function() {
            if (this.validate()) {
                isLoading(true);
                setCouponCodeAction(couponCode(), isApplied, isLoading);
            }
        },

Es gibt einen Hinweis: Wir sollten mage/storage,-> verwenden lib/web/mage/storage.js, um eine asynchrone POST-, GET-, PUT- und DELETE-Anforderung an den Server auszuführen. Zum Beispiel:vendor/magento/module-sales-rule/view/frontend/web/js/action/set-coupon-code.js

Khoa TruongDinh
quelle
Bitte helfen Sie mit magento.stackexchange.com/questions/166641/…
Ankit Shah
0

Die checkoutData werden im localStorage des Browsers gespeichert und bei bestimmten Aktionen aktualisiert.

Sie sollten den devdocs-Artikel über FPC-Holepunching hier lesen: http://devdocs.magento.com/guides/v2.0/config-guide/cache/cache-priv-priv.html

Um das Checkout-Datenobjekt zu aktualisieren, müssen Sie ein Abschnitts-Upgrade für Ihren Ajax-Aufruf wie folgt definieren: https://github.com/magento/magento2/blob/develop/app/code/Magento/Checkout/etc/frontend/sections. xml # L33

Beachten Sie, dass dieses Update (wie in den Devdocs beschrieben) nur bei POST- oder PUT-Anforderungen ausgelöst wird.

Magento sollte dann direkt nach erfolgreichem Abschluss Ihres Ajax-Aufrufs eine Anforderung zur Aktualisierung der Abschnitte für den Abschnitt "Checkout-Daten" auslösen

David Verholen
quelle
0

Wenn Sie einen Controller haben, müssen Sie eine Ajax-Funktion in benutzerdefinierten JS haben. Als Antwort auf diesen Ajax-Aufruf verwenden Sie also unter zwei Zeilen.

 var deferred = $.Deferred();
 getTotalsAction([], deferred);

Und dafür müssen Sie ein Objekt erstellen, dh getTotolsAction, wie in Ihrem Fragencode in Ihrem benutzerdefinierten js gezeigt.

Hinweis: Verwenden Sie keinen JS-Code im Controller, funktioniert nicht.

Glücklich
quelle
0

Ich benutze diesen Ansatz:

require(['Magento_Checkout/js/action/get-totals'], function(a) { a([]); } );
vladPavlov
quelle