ödeme sayfası yenileme sorunu


14

Öncelikle sorunumu anlamak için bazı ekran görüntüleri vermek istiyorum.

resim açıklamasını buraya girin

resim açıklamasını buraya girin

resim açıklamasını buraya girin

Şimdi buraya ilgili kodu eklemek istiyorum.

etc / ön / 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;
    }
}

Daha fazla ayrıntı için lütfen aşağıya bakın

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

Gözlemim, sonraki düğmeyiDeliverySignConfigProvider tıklattığınızda nesne çağırmıyor , yalnızca sayfayı yeniden yüklediğinizde çağırıyor . Bana bu konuda yardımcı olabilir misiniz?


Github kaynak kodunuzun düzgün çalışmadığını görün! Eklenti bildirmezsiniz Plugin/Checkout/Model/ShippingInformationManagement.php.
Khoa TruongDinh

Yanıtlar:


4

Toplam özeti yeniden yüklememize gerek olmadığını düşünüyorum. Çünkü, İleri düğmesini tıklattığınızda, Magento V1/carts/mine/shipping-informationtoplamları yeniden hesaplamak ve toplam verileri şablonlarımıza çıkarmak için bir istek (API) yapar.

resim açıklamasını buraya girin

Yani, ücreti kontrol etmek istiyorsak, yanıtı kontrol etmeliyiz total_segments

Tıkladığınızda İleri ödeme adıma, ayarlanan gönderim bilgilerine bir istek vardır satıcı / magento / modül-çıkış / görüş / kullanıcı arayüzü / web / js / view / shipping.js

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

Bu istek toplamları yeniden hesaplar.

Sizin durumunuzda, html şablonumuzda bir isDisplayed()işlevi olmalıdır :

Kensium / DeliverySign / görüş / kullanıcı arayüzü / web / şablon / ödeme / sepeti / toplamlar / 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 -->

Kontrol isDisplayed()fonksiyonu:

Kensium / DeliverySign / görünüm / kullanıcı arayüzü / web / js / görünüm / ödeme / sepeti / toplamları / 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);
        }
    });
});

Bu işlev fee, yanıttaki toplam segmenti kontrol eder .

Bir git çekme yapmak burada .

NOT: Ücretinizin doğru şekilde hesaplandığından emin olun. Ödeme adımında, lütfen yanıtın ücretimize sahip olduğunu kontrol edin.


düzgün çalışmıyor. bir kez kontrol edebilirsin.
sivakumar

TypeError: totals.getSegment (...) nullprice = totals.getSegment ('ücret'). Değer;
sivakumar

Kontrol etmelisiniz if (this.totals() && totals.getSegment('fee')). Unuttum.
Khoa TruongDinh

0

Checkout 'payment-service.js' model sınıfının üzerine yazmanız gerekiyor . Bunu aşağıdaki şekilde yapabilirsiniz:

# Kensium / DeliverySign / görünüm / kullanıcı arayüzü / requirejs-config.js
var config = {
    "harita": {
        "*": {
            'Magento_Checkout / js / model / shipping-save-işlemci / varsayılan': 'Kensium_DeliverySign / js / model / shipping-save-işlemci / varsayılan',
            'Magento_Checkout / js / model / ödeme hizmeti': 'Kensium_DeliverySign / js / model / ödeme hizmeti'
        }
    }
};

Bu yüzden Kensium / DeliverySign / view / frontend / web / js / model / payment-service.js oluşturun ve içerik

/ **
 * Telif Hakkı © 2016 Magento. Tüm hakları Saklıdır.
 * Lisans ayrıntıları için COPYING.txt dosyasına bakın.
 * /
tanımlamak(
    [
        'vurgulamak',
        'Magento_Checkout / js / model / quote',
        'Magento_Checkout / js / model / ödeme / yöntem listesi',
        'Magento_Checkout / js / aksiyon / seçmek ödeme-yöntemi',
        'Magento_Checkout / js / modeli / toplamları'
    ],
    function (_, alıntı, methodList, selectPaymentMethod, totals) {
        'katı kullanın';
        var freeMethodCode = 'ücretsiz';

        dönüş {
            isFreeAvailable: yanlış,
            / **
             * Ödeme yöntemleri listesini doldurun
             * @param {Dizi} yöntemleri
             * /
            setPaymentMethods: function (yöntemleri) {
                var self = bu,
                    freeMethod,
                    filteredMethods,
                    methodIsAvailable;

                freeMethod = _.find (yöntemler, işlev (yöntem) {
                    return method.method === freeMethodCode;
                });
                this.isFreeAvailable = freeMethod? doğru yanlış;

                if (self.isFreeAvailable && freeMethod && quote.totals (). grand_total <= 0) {
                    yöntemleri. ek (0, yöntemler. uzunluk, serbestMethod);
                    selectPaymentMethod (freeMethod);
                }
                filterMethods = _. olmadan (yöntemler, freeMethod);

                if (filterMethods.length === 1) {
                    selectPaymentMethod (filteredMethods [0]);
                } else if (quote.paymentMethod ()) {
                    methodIsAvailable = method.some (function (item) {
                        return item.method === quote.paymentMethod (). yöntemi;
                    });
                    // Mevcut değilse seçilen ödeme yöntemini kaldır
                    if (! methodIsAvailable) {
                        selectPaymentMethod (boş);
                    }
                }
                methodList (yöntem);
                (Doğru) totals.isLoading;
                window.checkoutConfig.show_hide_deliverysign_block = 1;
                (False) totals.isLoading;
            },
            / **
             * Mevcut ödeme yöntemlerinin listesini alın.
             * @returns {Dizi}
             * /
            getAvailablePaymentMethods: function () {
                var yöntemleri = [],
                    öz = bu;
                _.each (methodList (), işlev (yöntem) {
                    eğer (self.isFreeAvailable && (
                            quote.totals (). grand_total 0 && method.method! == freeMethodCode
                        ) || ! self.isFreeAvailable
                    ) {
                        methods.push (yöntem);
                    }
                });

                dönüş yöntemleri;
            }
        };
    }
);

Sil pub / statik / kullanıcı arayüzü / Magento / parlaklık / tr / Kensium_DeliverySign zaten varsa

Aşağıdaki konuşlandırma komutunu çalıştır

php bin / magento kurulumu: statik içerik: dağıtma


düzgün çalışmıyor. bir kez kontrol edebilirsin.
sivakumar

0

Ayrıca Teslim İşaretinde bir oturum adı oluşturmanız gerekir. Böylece her POST isteğindeki alışveriş sepeti değişiklikleri denetleyicinize yeniden yüklenir. Temel olarak, eylem düğümü denetleyici yolunu gösterir ve bölüm düğümü, hangi istemci tarafı içeriğinin güncellenmesi gerektiğini tanımlar. Bu değişikliğin geçerli olması için önbelleklerin temizlenmesi gerekir. Kontrol Checkout/etc/frontend/sections.xml Örneğin a 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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.