problème d'actualisation de la page de paiement


14

Tout d'abord, je veux donner quelques captures d'écran pour comprendre mon problème.

entrez la description de l'image ici

entrez la description de l'image ici

entrez la description de l'image ici

Maintenant, je veux ajouter du code associé ici.

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

Veuillez trouver ci-dessous pour plus de détails

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

Mon observation est que l' DeliverySignConfigProviderobjet n'appelle pas lorsque vous cliquez sur le bouton suivant , seulement son appel lorsque vous rechargez la page . Pouvez-vous m'aider à ce sujet?


Il semble que votre code source Github ne fonctionne pas correctement! Vous ne déclarez pas Plugin Plugin/Checkout/Model/ShippingInformationManagement.php.
Khoa TruongDinh

Réponses:


4

Je pense que nous n'avons pas besoin de recharger le résumé total. Parce que, quand cliquez sur le Next bouton, Magento fera une demande (API) V1/carts/mine/shipping-informationpour recalculer les totaux et la production des données des totaux à nos modèles.

entrez la description de l'image ici

Donc, si nous voulons vérifier les frais, nous devons vérifier la réponse total_segments

Lorsque vous cliquez sur À côté de l'étape de paiement, il est demandé de définir les informations d'expédition fournisseur / magento / module-checkout / view / frontend / web / js / view / shipping.js

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

Cette demande recalculera les totaux.

Dans votre cas, dans notre modèle html, il devrait avoir une isDisplayed()fonction:

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

Vérifier la isDisplayed()fonction:

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

Cette fonction vérifiera le feesegment des totaux de la réponse.

Je fais un git pull ici .

REMARQUE: assurez-vous que vos frais sont calculés correctement. À l'étape du paiement, veuillez vérifier que la réponse a nos frais.


son ne fonctionne pas correctement. pouvez-vous vérifier une fois.
sivakumar

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

Devrait vérifier if (this.totals() && totals.getSegment('fee')). J'ai oublié.
Khoa TruongDinh

0

Vous devez remplacer la classe de modèle de paiement «service de paiement.js» . Vous pouvez procéder de la manière suivante:

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

Créez donc Kensium / DeliverySign / view / frontend / web / js / model / payment-service.js et le contenu devrait être

/ **
 * Copyright © 2016 Magento. Tous les droits sont réservés.
 * Voir COPYING.txt pour les détails de la licence.
 * /
définir(
    [
        'souligner',
        '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) {
        «utiliser strictement»;
        var freeMethodCode = 'free';

        revenir {
            isFreeAvailable: false,
            / **
             * Remplissez la liste des méthodes de paiement
             * Méthodes @param {Array}
             * /
            setPaymentMethods: fonction (méthodes) {
                var self = this,
                    freeMethod,
                    filtresMéthodes,
                    methodIsAvailable;

                freeMethod = _.find (méthodes, fonction (méthode) {
                    return method.method === freeMethodCode;
                });
                this.isFreeAvailable = freeMethod? vrai faux;

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

                if (filterMethods.length === 1) {
                    selectPaymentMethod (filterMethods [0]);
                } sinon si (quote.paymentMethod ()) {
                    methodIsAvailable = methods.some (fonction (élément) {
                        return item.method === quote.paymentMethod (). method;
                    });
                    // Désactiver le mode de paiement sélectionné s'il n'est pas disponible
                    if (! methodIsAvailable) {
                        selectPaymentMethod (null);
                    }
                }
                methodList (méthodes);
                totals.isLoading (true);
                window.checkoutConfig.show_hide_deliverysign_block = 1;
                totals.isLoading (false);
            },
            / **
             * Obtenez la liste des méthodes de paiement disponibles.
             * @returns {Array}
             * /
            getAvailablePaymentMethods: function () {
                méthodes var = [],
                    soi = ceci;
                _.each (methodList (), fonction (méthode) {
                    if (self.isFreeAvailable && (
                            quote.totals (). grand_total 0 && method.method! == freeMethodCode
                        ) || ! self.isFreeAvailable
                    ) {
                        methods.push (méthode);
                    }
                });

                méthodes de retour;
            }
        };
    }
);

Supprimer pub / static / frontend / Magento / luma / en_US / Kensium_DeliverySign s'il existe déjà

Exécuter la commande de déploiement suivante

configuration de php bin / magento: contenu statique: déployer


son ne fonctionne pas correctement. pouvez-vous vérifier une fois.
sivakumar

0

Vous devez également créer un nom de session sur Delivery Sign. Donc, cela rechargerait les modifications du panier sur chaque demande POST sur votre contrôleur. Fondamentalement, le nœud d'action indique le chemin du contrôleur et le nœud de section définit le contenu côté client à mettre à jour. Les caches doivent être vidées pour que ce changement s'applique. Vérifiez Checkout/etc/frontend/sections.xml par exemple un sections.xmldansetc/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>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.