problema di aggiornamento della pagina di pagamento


14

Prima di tutto voglio dare alcune schermate per capire il mio problema.

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Ora voglio aggiungere il codice correlato qui.

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

Di seguito puoi trovare ulteriori dettagli

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

La mia osservazione è che l' DeliverySignConfigProvideroggetto non chiama quando si fa clic sul pulsante successivo , ma solo quando si ricarica la pagina . Qualcuno mi può aiutare in questo?


Sembra che il codice sorgente di Github non funzioni correttamente! Non dichiari Plugin Plugin/Checkout/Model/ShippingInformationManagement.php.
Khoa TruongDinh

Risposte:


4

Penso che non sia necessario ricaricare il riepilogo totale. Perché, quando si fa clic sul pulsante Avanti , Magento farà una richiesta (API) V1/carts/mine/shipping-informationper ricalcolare i totali e trasmettere i dati dei totali ai nostri modelli.

inserisci qui la descrizione dell'immagine

Quindi, se vogliamo controllare la commissione, dovremmo controllare la risposta total_segments

Quando si fa clic su Accanto alla fase di pagamento, è presente una richiesta per impostare il fornitore di informazioni sulla spedizione / magento / module-checkout / view / frontend / web / js / view / shipping.js

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

Questa richiesta ricalcola i totali.

Nel tuo caso, nel nostro modello html, dovrebbe avere una isDisplayed()funzione:

Kensium / DeliverySign / view / frontend / web / template / cassa / carrello / totali / 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 -->

Verifica isDisplayed()funzione:

Kensium / DeliverySign / view / frontend / web / js / view / checkout / carrello / totali / 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);
        }
    });
});

Questa funzione controllerà il feesegmento dei totali dalla risposta.

Faccio un tiro qui .

NOTA: assicurarsi che la commissione sia calcolata nel modo giusto. Nella fase di pagamento, controlla che la risposta abbia la nostra commissione.


non funziona correttamente. puoi controllare una volta.
sivakumar,

TypeError: totals.getSegment (...) is nullprice = totals.getSegment ('fee'). Value;
sivakumar,

Dovrebbe controllare if (this.totals() && totals.getSegment('fee')). Ho dimenticato.
Khoa TruongDinh,

0

Devi sovrascrivere la classe del modello di pagamento 'payment-service.js' . Puoi farlo nel modo seguente:

# Kensium / DeliverySign / view / frontend / requirejs-config.js
var config = {
    "carta geografica": {
        "*": {
            "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'
        }
    }
};

Quindi crea Kensium / DeliverySign / view / frontend / web / js / model / payment-service.js e il contenuto dovrebbe essere

/ **
 * Copyright © 2016 Magento. Tutti i diritti riservati.
 * Vedere COPYING.txt per i dettagli della licenza.
 * /
definire(
    [
        'sottolineare',
        'Magento_Checkout / js / modello / quote',
        'Magento_Checkout / js / modello / pagamento / metodo-list',
        'Magento_Checkout / js / action / select-pagamento-il metodo',
        'Magento_Checkout / js / modello / i totali'
    ],
    funzione (_, quote, methodList, selectPaymentMethod, totali) {
        'usa rigoroso';
        var freeMethodCode = 'free';

        ritorno {
            isFreeAvailable: false,
            / **
             * Popolare l'elenco dei metodi di pagamento
             * Metodi @param {Array}
             * /
            setPaymentMethods: function (metodi) {
                var self = this,
                    freeMethod,
                    filteredMethods,
                    methodIsAvailable;

                freeMethod = _.find (metodi, funzione (metodo) {
                    return method.method === freeMethodCode;
                });
                this.isFreeAvailable = freeMethod? vero falso;

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

                if (filteredMethods.length === 1) {
                    selectPaymentMethod (filteredMethods [0]);
                } else if (quote.paymentMethod ()) {
                    methodIsAvailable = method.some (function (item) {
                        restituisce il metodo item.method === quote.paymentMethod ().;
                    });
                    // Disattiva il metodo di pagamento selezionato se non disponibile
                    if (! methodIsAvailable) {
                        selectPaymentMethod (null);
                    }
                }
                methodList (metodi);
                totals.isLoading (true);
                window.checkoutConfig.show_hide_deliverysign_block = 1;
                totals.isLoading (false);
            },
            / **
             * Ottieni l'elenco dei metodi di pagamento disponibili.
             * @returns {Array}
             * /
            getAvailablePaymentMethods: function () {
                var method = [],
                    self = this;
                _.each (methodList (), function (method) {
                    if (self.isFreeAvailable && (
                            quote.totals (). grand_total 0 && method.method! == freeMethodCode
                        ) || ! self.isFreeAvailable
                    ) {
                        methods.push (metodo);
                    }
                });

                metodi di restituzione;
            }
        };
    }
);

Elimina pub / static / frontend / Magento / luma / en_US / Kensium_Delivery Firma se già esistente

Esegui seguendo il comando deploy

php bin / magento setup: static-content: deploy


non funziona correttamente. puoi controllare una volta.
sivakumar,

0

È inoltre necessario creare un nome di sessione sul segno di consegna. Quindi, questo ricaricherebbe le modifiche del carrello su ogni richiesta POST al controller. Fondamentalmente, il nodo azione indica il percorso del controller e il nodo sezione definisce quale contenuto lato client deve essere aggiornato. Le cache devono essere svuotate per applicare questa modifica. Seleziona Checkout/etc/frontend/sections.xml Ad esempio un 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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.