problem z odświeżaniem strony kasy

14

Przede wszystkim chcę zrobić zrzuty ekranu, aby zrozumieć mój problem.

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Teraz chcę tutaj dodać powiązany kod.

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

Więcej informacji znajdziesz poniżej

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

Moja obserwacja jest taka, że DeliverySignConfigProviderobiekt nie dzwoni po kliknięciu przycisku Dalej , a jedynie jego wywołanie podczas ponownego ładowania strony . Czy możesz mi w tym pomóc?

sivakumar
źródło
Wygląda na to, że kod źródłowy Github nie działa poprawnie! Nie deklarujesz wtyczki Plugin/Checkout/Model/ShippingInformationManagement.php.
Khoa TruongDinh

Odpowiedzi:

4

Myślę, że nie musimy przeładowywać całego podsumowania. Ponieważ po kliknięciu przycisku Dalej Magento poprosi (API) V1/carts/mine/shipping-informationo ponowne obliczenie sum i przesłanie danych sum do naszych szablonów.

wprowadź opis zdjęcia tutaj

Tak więc, jeśli chcemy sprawdzić opłatę, powinniśmy sprawdzić odpowiedź total_segments

Po kliknięciu przycisku obok kroku płatności pojawia się prośba o ustawienie dostawcy informacji o wysyłce / magento / module-Checkout / view / frontend / web / js / view / shipping.js

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

To żądanie ponownie obliczy sumy.

W twoim przypadku w naszym szablonie HTML powinien on mieć isDisplayed()funkcję:

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

Sprawdź isDisplayed()funkcję:

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

Ta funkcja sprawdzi feesegment sumy na podstawie odpowiedzi.

Robię ciągnąć git tutaj .

UWAGA: Upewnij się, że opłata jest naliczana we właściwy sposób. Na etapie płatności sprawdź, czy odpowiedź ma naszą opłatę.

Khoa TruongDinh
źródło
nie działa poprawnie. czy możesz to sprawdzić raz.
sivakumar 27.07.16
TypeError: totals.getSegment (...) is nullprice = totals.getSegment ('opłata'). Wartość;
sivakumar
Powinien sprawdzić if (this.totals() && totals.getSegment('fee')). Zapomniałem.
Khoa TruongDinh
0

Musisz zastąpić klasę modelu kasy „payment-service.js” . Możesz to zrobić w następujący sposób:

# Kensium / DeliverySign / view / frontend / Requjs-config.js
var config = {
    „mapa”: {
        „*”: {
            „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”
        }
    }
};

Stwórz więc Kensium / DeliverySign / view / frontend / web / js / model / payment-service.js, a zawartość powinna być

/ **
 * Copyright © 2016 Magento. Wszelkie prawa zastrzeżone.
 * Szczegółowe informacje na temat licencji znajdują się na COPYING.txt.
 * /
definiować(
    [
        'podkreślać',
        „Magento_Checkout / js / model / quote”,
        „Magento_Checkout / js / model / payment / method-list”,
        „Magento_Checkout / js / action / select-payment-method”,
        „Magento_Checkout / js / model / totals”
    ],
    funkcja (_, cytat, methodList, selectPaymentMethod, sumy) {
        „stosować ścisłe”;
        var freeMethodCode = 'free';

        powrót {
            isFreeAvailable: false,
            / **
             * Wypełnij listę metod płatności
             * Metody @param {Array}
             * /
            setPaymentMethods: funkcja (metody) {
                var self = to,
                    freeMethod,
                    filterMethods,
                    methodIsAvailable;

                freeMethod = _.find (metody, funkcja (metoda) {
                    return method.method === freeMethodCode;
                });
                this.isFreeAvailable = freeMethod? prawda fałsz;

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

                if (filterMethods.length === 1) {
                    selectPaymentMethod (filterMethods [0]);
                } else if (quote.paymentMethod ()) {
                    methodIsAvailable = methods.some (funkcja (pozycja) {
                        return item.method === quote.paymentMethod (). metoda;
                    });
                    // Odznacz wybraną metodę płatności, jeśli nie jest dostępna
                    if (! methodIsAvailable) {
                        selectPaymentMethod (null);
                    }
                }
                methodList (metody);
                totals.isLoading (true);
                window.checkoutConfig.show_hide_deliverysign_block = 1;
                totals.isLoading (false);
            },
            / **
             * Uzyskaj listę dostępnych metod płatności.
             * @returns {Array}
             * /
            getAvailablePaymentMethods: function () {
                metody var = [],
                    jaźń = to;
                _.each (methodList (), function (method) {
                    if (self.isFreeAvailable && (
                            quote.totals (). grand_total 0 && method.method! == freeMethodCode
                        ) || ! self.isFreeAvailable
                    ) {
                        methods.push (metoda);
                    }
                });

                metody zwrotu;
            }
        };
    }
);

Usuń pub / static / frontend / Magento / luma / en_US / Kensium_DeliverySign, jeśli już istnieje

Uruchom następujące polecenie wdrażania

konfiguracja php bin / magento: zawartość statyczna: wdrożenie

Sohel Rana
źródło
nie działa poprawnie. czy możesz to sprawdzić raz.
sivakumar
0

Powinieneś również utworzyć nazwę sesji na Delivery Delivery. To przeładuje zmiany koszyka na każde żądanie POST do twojego kontrolera. Zasadniczo węzeł akcji wskazuje ścieżkę kontrolera, a węzeł sekcji określa, która treść po stronie klienta powinna zostać zaktualizowana. Aby zastosować tę zmianę, należy opróżnić pamięć podręczną. Sprawdzić Checkout/etc/frontend/sections.xml na przykład sections.xmlwetc/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>
Min
źródło