Problem beim Aktualisieren der Checkout-Seite

14

Zunächst möchte ich einige Screenshots geben, um mein Problem zu verstehen.

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Jetzt möchte ich hier verwandten Code hinzufügen.

etc / frontend / di.xml

 <?xml version="1.0"?>
    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
        <type name="Magento\Checkout\Model\CompositeConfigProvider">
            <arguments>
                <argument name="configProviders" xsi:type="array">
                    <item name="checkout_deliverysign_block" xsi:type="object">Kensium\DeliverySign\Model\DeliverySignConfigProvider</item>
                </argument>
            </arguments>
        </type>
    </config>

DeliverySignConfigProvider

<?php
namespace Kensium\DeliverySign\Model;

use Magento\Checkout\Model\ConfigProviderInterface;
use Magento\Store\Model\ScopeInterface;

class DeliverySignConfigProvider implements ConfigProviderInterface
{
    /**
     * @var \Magento\Framework\App\Config\ScopeConfigInterface
     */
    protected $scopeConfiguration;

    protected $checkoutSession;

    protected $logger;

    /**
     * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfiguration
     * @codeCoverageIgnore
     */
    public function __construct(
        \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfiguration,
        \Magento\Checkout\Model\Session $checkoutSession,
        \Psr\Log\LoggerInterface $logger

    )
    {
        $this->scopeConfiguration = $scopeConfiguration;
        $this->checkoutSession=$checkoutSession;
        $this->logger=$logger;
    }

    /**
     * {@inheritdoc}
     */
    public function getConfig()
    {
        $deliverySignConfig = [];
        $enabled = $this->scopeConfiguration->getValue('deliverysign/deliverysign/status', ScopeInterface::SCOPE_STORE);
        $minimumOrderAmount = $this->scopeConfiguration->getValue('deliverysign/deliverysign/minimum_order_amount', ScopeInterface::SCOPE_STORE);
        $quote=$this->checkoutSession->getQuote();
        $subtotal=$quote->getSubtotal();
        $this->logger->addDebug($subtotal);
        $deliverySignConfig['delivery_sign_amount'] = $this->scopeConfiguration->getValue('deliverysign/deliverysign/deliverysign_amount', ScopeInterface::SCOPE_STORE);
        $deliverySignConfig['show_hide_deliverysign_block'] = ($enabled && ($minimumOrderAmount<$subtotal) && $quote->getFee()) ? true : false;
        $deliverySignConfig['show_hide_deliverysign_shipblock'] = ($enabled && ($minimumOrderAmount<$subtotal)) ? true : false;
        return $deliverySignConfig;
    }
}

Weitere Details finden Sie weiter unten

https://github.com/sivajik34/Delivery-Signature-Magento2

Meine Beobachtung ist, dass das DeliverySignConfigProviderObjekt nicht aufruft, wenn Sie auf die Schaltfläche " Weiter" klicken , sondern nur, wenn Sie die Seite neu laden . Kann mir jemand dabei helfen?

sivakumar
quelle
Scheinbar funktioniert Ihr Github-Quellcode nicht richtig! Du deklarierst kein Plugin Plugin/Checkout/Model/ShippingInformationManagement.php.
Khoa TruongDinh

Antworten:

4

Ich denke, wir müssen die Gesamtübersicht nicht neu laden. Wenn Sie auf die Schaltfläche Weiter klicken , fordert Magento eine API V1/carts/mine/shipping-informationan, um die Gesamtsummen neu zu berechnen und die Gesamtdaten an unsere Vorlagen auszugeben.

Bildbeschreibung hier eingeben

Wenn wir also die Gebühr überprüfen möchten, sollten wir die Antwort überprüfen total_segments

Wenn Sie neben dem Zahlungsschritt auf Weiter klicken, werden Sie aufgefordert, die Versandinformationen für den Anbieter / magento / module-checkout / view / frontend / web / js / view / shipping.js festzulegen

             /**
             * Set shipping information handler
             */
            setShippingInformation: function () {
                if (this.validateShippingInformation()) {
                    setShippingInformationAction().done(
                        function () {
                            stepNavigator.next();
                        }
                    );
                }
            }

Diese Anforderung berechnet die Gesamtsummen neu.

In Ihrem Fall sollte es in unserer HTML-Vorlage eine isDisplayed()Funktion haben:

Kensium / DeliverySign / view / frontend / web / template / checkout / cart / totals / fee.html

<!-- ko if: isDisplayed() -->
<tr class="totals fee excl" data-bind="visible: canVisibleDeliverySignBlock">
    <th class="mark" colspan="1" scope="row" data-bind="text: title"></th>
    <td class="amount">
        <span class="price" data-bind="text: getValue()"></span>
    </td>
</tr>
<!-- /ko -->

isDisplayed()Funktion prüfen :

Kensium / DeliverySign / view / frontend / web / js / view / checkout / cart / totals / fee.js

define([
    'ko',
    'uiComponent',
    'Magento_Checkout/js/model/quote',
    'Magento_Catalog/js/price-utils',
    'Magento_Checkout/js/model/totals'

], function (ko, Component, quote, priceUtils, totals) {
    'use strict';
    var show_hide_deliverysign_blockConfig = window.checkoutConfig.show_hide_deliverysign_block;
    var delivery_sign_amount = window.checkoutConfig.delivery_sign_amount;

    return Component.extend({

        totals: quote.getTotals(),
        canVisibleDeliverySignBlock: show_hide_deliverysign_blockConfig,
        getFormattedPrice: ko.observable(priceUtils.formatPrice(delivery_sign_amount, quote.getPriceFormat())),

        isDisplayed: function () {
            return this.getValue() != 0;
        },
        getValue: function() {
            var price = 0;
            if (this.totals() && totals.getSegment('fee')) {
                price = totals.getSegment('fee').value;
            }
            return this.getFormattedPrice(price);
        }
    });
});

Diese Funktion überprüft das Summensegment feeaus der Antwort.

Ich mache einen Git - Pull hier .

HINWEIS: Stellen Sie sicher, dass Ihre Gebühr richtig berechnet wird. Bitte überprüfen Sie im Zahlungsschritt, ob die Antwort unsere Gebühr enthält.

Khoa TruongDinh
quelle
es funktioniert nicht richtig. können Sie einmal überprüfen.
Sivakumar
TypeError: totals.getSegment (...) ist nullprice = totals.getSegment ('fee'). Value;
Sivakumar
Sollte überprüfen if (this.totals() && totals.getSegment('fee')). Ich habe vergessen.
Khoa TruongDinh
0

Sie müssen die Modellklasse "payment-service.js" überschreiben . Sie können dies folgendermaßen tun:

# Kensium / DeliverySign / view / frontend / requirejs-config.js
var config = {
    "Karte": {
        "*": {
            'Magento_Checkout / js / model / shipping-save-processor / default': 'Kensium_DeliverySign / js / model / shipping-save-processor / default',
            'Magento_Checkout / js / model / payment-service': 'Kensium_DeliverySign / js / model / payment-service'
        }
    }
};

Also erstelle Kensium / DeliverySign / view / frontend / web / js / model / payment-service.js und der Inhalt sollte sein

/ **
 * Copyright © 2016 Magento. Alle Rechte vorbehalten.
 * Weitere Informationen zur Lizenz finden Sie in der Datei COPYING.txt.
 * /
definieren(
    [
        'unterstreichen',
        "Magento_Checkout / js / model / quote",
        'Magento_Checkout / js / model / payment / method-list',
        'Magento_Checkout / js / action / select-payment-method',
        'Magento_Checkout / js / model / totals'
    ],
    function (_, quote, methodList, selectPaymentMethod, totals) {
        'use strict';
        var freeMethodCode = 'frei';

        Rückkehr {
            isFreeAvailable: false,
            / **
             * Füllen Sie die Liste der Zahlungsmethoden aus
             * @param {Array} Methoden
             * /
            setPaymentMethods: function (methods) {
                var self = this,
                    freeMethod,
                    filtersMethods,
                    methodIsAvailable;

                freeMethod = _.find (Methoden, Funktion (Methode) {
                    return method.method === freeMethodCode;
                });
                this.isFreeAvailable = freeMethod? wahr falsch;

                if (self.isFreeAvailable && freeMethod && quote.totals (). grand_total <= 0) {
                    methods.splice (0, methods.length, freeMethod);
                    selectPaymentMethod (freeMethod);
                }
                filtersMethods = _.without (methods, freeMethod);

                if (filtersMethods.length === 1) {
                    selectPaymentMethod (filtersMethods [0]);
                } else if (quote.paymentMethod ()) {
                    methodIsAvailable = methods.some (function (item) {
                        return item.method === quote.paymentMethod (). method;
                    });
                    // Ausgewählte Zahlungsmethode deaktivieren, falls nicht verfügbar
                    if (! methodIsAvailable) {
                        selectPaymentMethod (null);
                    }
                }
                methodList (methods);
                totals.isLoading (true);
                window.checkoutConfig.show_hide_deliverysign_block = 1;
                totals.isLoading (false);
            },
            / **
             * Holen Sie sich die Liste der verfügbaren Zahlungsmethoden.
             * @returns {Array}
             * /
            getAvailablePaymentMethods: function () {
                var methods = [],
                    Selbst = das;
                _.each (methodList (), function (method) {
                    if (self.isFreeAvailable && (
                            quote.totals (). grand_total 0 && method.method! == freeMethodCode
                        ) || ! self.isFreeAvailable
                    ) {
                        methods.push (Methode);
                    }
                });

                Rückgabemethoden;
            }
        };
    }
);

Löschen Sie pub / static / frontend / Magento / luma / de_DE / Kensium_DeliverySign, falls bereits vorhanden

Führen Sie den folgenden Bereitstellungsbefehl aus

php bin / magento setup: static-content: deploy

Sohel Rana
quelle
es funktioniert nicht richtig. können Sie einmal überprüfen.
Sivakumar
0

Sie sollten auch einen Sitzungsnamen auf dem Zustellungszeichen erstellen. Dies würde also die Warenkorbänderungen bei jeder POST-Anforderung an Ihren Controller neu laden. Grundsätzlich gibt der Aktionsknoten den Controller-Pfad an und der Abschnittsknoten definiert, welcher clientseitige Inhalt aktualisiert werden soll. Caches müssen geleert werden, damit diese Änderung wirksam wird. PrüfenCheckout/etc/frontend/sections.xml Sie beispielsweise ein sections.xmlinetc/frontend

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Customer:etc/sections.xsd">
    <action name="youraction/process/observer">
        <section name="cart"/>
    </action>
</config>
Minh
quelle