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!


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>  

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



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


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.


0

Ich benutze diesen Ansatz:

require(['Magento_Checkout/js/action/get-totals'], function(a) { a([]); } );
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.