problema de actualización de página de pago


14

En primer lugar, quiero dar algunas capturas de pantalla para comprender mi problema.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Ahora quiero agregar código relacionado aquí.

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

A continuación encontrará más detalles.

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

Mi observación es que el DeliverySignConfigProviderobjeto no llama cuando haces clic en el botón Siguiente , solo llama cuando vuelves a cargar la página . ¿Alguien me puede ayudar en esto?


¡Parece que su código fuente de Github no funciona correctamente! No declaras el complemento Plugin/Checkout/Model/ShippingInformationManagement.php.
Khoa TruongDinh

Respuestas:


4

Creo que no necesitamos volver a cargar el resumen total. Porque, cuando haga clic en el botón Siguiente , Magento realizará una solicitud (API) V1/carts/mine/shipping-informationpara volver a calcular los totales y enviar los datos de totales a nuestras plantillas.

ingrese la descripción de la imagen aquí

Entonces, si queremos verificar la tarifa, debemos verificar la respuesta total_segments

Cuando haga clic en Al lado del paso de pago, hay una solicitud para configurar la información de envío vendor / magento / module-checkout / view / frontend / web / js / view / shipping.js

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

Esta solicitud volverá a calcular los totales.

En su caso, en nuestra plantilla html, debería tener una isDisplayed()función:

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

Comprobar isDisplayed()función:

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

Esta función verificará el feesegmento de totales de la respuesta.

Hago un tirón aquí .

NOTA: Asegúrese de que su tarifa se calcule correctamente. En el paso de pago, verifique que la respuesta tenga nuestra tarifa.


no funciona correctamente. puede verificar una vez.
sivakumar

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

Debería comprobarlo if (this.totals() && totals.getSegment('fee')). Olvidé.
Khoa TruongDinh

0

Debe sobrescribir la clase de modelo de pago 'service-service.js' . Puede hacer esto de la siguiente manera:

# Kensium / DeliverySign / view / frontend / requirejs-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'
        }
    }
};

Así que cree Kensium / DeliverySign / view / frontend / web / js / model / payment-service.js y el contenido debe ser

/ **
 * Copyright © 2016 Magento. Todos los derechos reservados.
 * Ver COPYING.txt para detalles de la licencia.
 * /
definir(
    [
        'guion bajo',
        '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, totales) {
        'uso estricto';
        var freeMethodCode = 'free';

        regreso {
            isFreeAvailable: falso,
            / **
             * Rellene la lista de métodos de pago
             * @param {Array} métodos
             * /
            setPaymentMethods: function (métodos) {
                var self = this,
                    freeMethod,
                    Métodos filtrados,
                    methodIsAvailable;

                freeMethod = _.find (métodos, función (método) {
                    return method.method === freeMethodCode;
                });
                this.isFreeAvailable = freeMethod? verdadero Falso;

                if (self.isFreeAvailable && freeMethod && quote.totals (). grand_total <= 0) {
                    métodos.splice (0, métodos.longitud, método libre);
                    selectPaymentMethod (freeMethod);
                }
                filterMethods = _.without (métodos, freeMethod);

                if (filterMethods.length === 1) {
                    selectPaymentMethod (filterMethods [0]);
                } else if (quote.paymentMethod ()) {
                    methodIsAvailable = method.some (function (item) {
                        return item.method === quote.paymentMethod (). method;
                    });
                    // Desarmar el método de pago seleccionado si no está disponible
                    if (! methodIsAvailable) {
                        selectPaymentMethod (nulo);
                    }
                }
                lista de métodos (métodos);
                totals.isLoading (verdadero);
                window.checkoutConfig.show_hide_deliverysign_block = 1;
                totals.isLoading (falso);
            },
            / **
             * Obtenga la lista de métodos de pago disponibles.
             * @returns {Array}
             * /
            getAvailablePaymentMethods: function () {
                métodos var = [],
                    auto = esto;
                _.each (methodList (), function (method) {
                    if (self.isFreeAvailable && (
                            quote.totals (). grand_total 0 && method.method! == freeMethodCode
                        ) || ! self.isFreeAvailable
                    ) {
                        métodos.push (método);
                    }
                });

                métodos de devolución;
            }
        };
    }
);

Eliminar pub / static / frontend / Magento / luma / en_US / Kensium_DeliverySign si ya existe

Ejecute el siguiente comando de despliegue

php bin / magento setup: static-content: deploy


no funciona correctamente. puede verificar una vez.
sivakumar

0

También debe crear un nombre de sesión en Delivery Sign. Entonces, esto recargaría los cambios del carrito en cada solicitud POST a su controlador. Básicamente, el nodo de acción indica la ruta del controlador y el nodo de sección define qué contenido del lado del cliente debe actualizarse. Los cachés deben ser vaciados para que se aplique este cambio. Marque, Checkout/etc/frontend/sections.xml por ejemplo, un sections.xmlenetc/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>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.