결제 페이지 새로 고침 문제


14

우선 내 문제를 이해하기 위해 스크린 샷을주고 싶습니다.

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

이제 여기에 관련 코드를 추가하고 싶습니다.

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

자세한 내용은 아래를 참조하십시오

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

내 관찰은 다음 버튼DeliverySignConfigProvider 을 클릭 할 때 객체가 호출되지 않고 페이지를 다시로드 할 때만 호출됩니다 . 누구든지 나를 도울 수 있습니까?


Github 소스 코드가 제대로 작동하지 않는 것 같습니다! Plugin을 선언하지 않았습니다 Plugin/Checkout/Model/ShippingInformationManagement.php.
Khoa TruongDinh

답변:


4

전체 요약을 다시로드 할 필요는 없다고 생각합니다. 다음 버튼을 클릭하면 Magento는 V1/carts/mine/shipping-information총계를 다시 계산하고 총계 데이터를 템플릿으로 출력하도록 요청 (API) 합니다.

여기에 이미지 설명을 입력하십시오

따라서 수수료를 확인하려면 응답을 확인해야합니다 total_segments

결제 단계 에있는을 클릭하면 배송 정보 공급 업체 / 마 젠토 / 모듈-체크 아웃 /view/frontend/web/js/view/shipping.js 를 설정하라는 요청이 있습니다.

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

이 요청은 총계를 다시 계산합니다.

귀하의 경우 html 템플릿에는 다음과 같은 isDisplayed()기능 이 있어야 합니다.

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

isDisplayed()기능 점검 :

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

이 함수는 fee응답에서 총 세그먼트를 확인합니다 .

나는 여기에 자식을 당긴다 .

참고 : 요금이 올바르게 계산되었는지 확인하십시오. 결제 단계에서 응답에 수수료가 있는지 확인하십시오.


제대로 작동하지 않습니다. 한 번 확인할 수 있습니다.
sivakumar

TypeError : totals.getSegment (...)는 nullprice = totals.getSegment ( 'fee'). value;
sivakumar

확인해야 if (this.totals() && totals.getSegment('fee'))합니다. 잊어 버렸습니다.
Khoa TruongDinh

0

결제 'payment-service.js' 모델 클래스 를 덮어 써야합니다 . 다음과 같은 방법으로이 작업을 수행 할 수 있습니다.

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

그래서 만들 Kensium / DeliverySign /보기 / 프론트 엔드 / 웹 / JS / 모델 / 납부 - service.js을 하고 내용이 있어야한다

/ **
 * 저작권 © 2016 마 젠토. 판권 소유.
 * 라이센스 세부 사항은 COPYING.txt를 참조하십시오.
 * /
밝히다(
    [
        '밑줄',
        'Magento_Checkout / js / model / quote',
        'Magento_Checkout / js / model / payment / method-list',
        'Magento_Checkout / js / action / select-payment-method',
        'Magento_Checkout / js / model / totals'
    ],
    함수 (_, quote, methodList, selectPaymentMethod, totals) {
        '엄격한 사용';
        var freeMethodCode = '무료';

        {
            isFreeAvailable : false,
            / **
             * 결제 수단 목록을 채 웁니다.
             * @param {Array} 메소드
             * /
            setPaymentMethods : 함수 (방법) {
                var self = this,
                    freeMethod,
                    filtersMethods,
                    methodIsAvailable;

                freeMethod = _.find (방법, 함수 (방법) {
                    return method.method === freeMethodCode;
                });
                this.isFreeAvailable = freeMethod? 허위 사실;

                if (self.isFreeAvailable && freeMethod && quote.totals (). grand_total <= 0) {
                    methods.splice (0, methods.length, freeMethod);
                    selectPaymentMethod (freeMethod);
                }
                filteringMethods = _.with ((방법, freeMethod);

                if (filteredMethods.length === 1) {
                    selectPaymentMethod (filteredMethods [0]);
                } else if (quote.paymentMethod ()) {
                    methodIsAvailable = methods.some (함수 (항목) {
                        return item.method === quote.paymentMethod (). method;
                    });
                    // 사용할 수없는 경우 선택한 결제 수단을 설정 해제
                    if (! methodIsAvailable) {
                        selectPaymentMethod (null);
                    }
                }
                methodList (방법);
                totals.isLoading (true);
                window.checkoutConfig.show_hide_deliverysign_block = 1;
                totals.isLoading (false);
            },
            / **
             * 사용 가능한 결제 수단 목록을 확인하십시오.
             * @ 반환 {배열}
             * /
            getAvailablePaymentMethods : 함수 () {
                var methods = [],
                    자기 = 이것;
                _.each (methodList (), 함수 (방법) {
                    if (self.isFreeAvailable && (
                            quote.totals (). grand_total 0 && method.method! == freeMethodCode
                        ) || ! self.isFreeAvailable
                    ) {
                        methods.push (method);
                    }
                });

                반환 방법;
            }
        };
    }
);

pub / static / frontend / Magento / luma / en_US / Kensium_DeliverySign 이 이미있는 경우 삭제

다음 배포 명령 실행

PHP bin / magento 설정 : 정적 내용 : 배포


제대로 작동하지 않습니다. 한 번 확인할 수 있습니다.
sivakumar

0

Delivery Sign에 세션 이름도 만들어야합니다. 따라서 이것은 각 POST 요청에서 카트 변경 사항을 컨트롤러에 다시로드합니다. 기본적으로 작업 노드는 컨트롤러 경로를 나타내며 섹션 노드는 업데이트 할 클라이언트 쪽 콘텐츠를 정의합니다. 이 변경 사항을 적용하려면 캐시를 비워야합니다. 확인 Checkout/etc/frontend/sections.xml 예를 들어 A에 대한 sections.xmletc/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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.