チェックアウトページの更新の問題


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
コアTruongDinh

回答:


4

合計サマリーをリロードする必要はないと思います。なぜなら、[ 次へ ]ボタンをクリックすると、Magentoはリクエスト(API)V1/carts/mine/shipping-informationを実行して合計を再計算し、合計データをテンプレートに出力するからです。

ここに画像の説明を入力してください

したがって、料金を確認する場合は、応答を確認する必要があります total_segments

支払い手順の[ へ]をクリックすると、配送情報を設定するリクエストがあります 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();
                        }
                    );
                }
            }

このリクエストは合計を再計算します。

あなたの場合、私たちの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、応答から合計セグメントをチェックします。

ここで git pullを作成します

注:料金が正しい方法で計算されていることを確認してください。支払いのステップで、レスポンスに料金が含まれていることを確認してください。


正しく動作していません。一度確認してください。
sivakumar

TypeError:totals.getSegment(...)is nullprice = totals.getSegment( 'fee')。value;
-sivakumar

チェックする必要があり if (this.totals() && totals.getSegment('fee'))ます。忘れてた。
コアトゥオンディン16

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 Magento。全著作権所有。
 *ライセンスの詳細については、COPYING.txtを参照してください。
 * /
define(
    [
        「アンダースコア」、
        '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、合計){
        'use strict';
        var freeMethodCode = 'free';

        return {
            isFreeAvailable:false、
            / **
             *支払い方法のリストに入力する
             * @param {Array}メソッド
             * /
            setPaymentMethods:関数(メソッド){
                var self = this、
                    freeMethod、
                    FilteredMethods、
                    methodIsAvailable;

                freeMethod = _.find(methods、function(method){
                    return method.method === freeMethodCode;
                });
                this.isFreeAvailable = freeMethod?真/偽;

                if(self.isFreeAvailable && freeMethod && quote.totals()。grand_total <= 0){
                    methods.splice(0、methods.length、freeMethod);
                    selectPaymentMethod(freeMethod);
                }
                FilteredMethods = _.without(methods、freeMethod);

                if(filteredMethods.length === 1){
                    selectPaymentMethod(filteredMethods [0]);
                } else if(quote.paymentMethod()){
                    methodIsAvailable = methods.some(function(item){
                        return item.method === quote.paymentMethod()。method;
                    });
                    //選択できない場合は選択した支払い方法を解除します
                    if(!methodIsAvailable){
                        selectPaymentMethod(null);
                    }
                }
                methodList(methods);
                totals.isLoading(true);
                window.checkoutConfig.show_hide_deliverysign_block = 1;
                totals.isLoading(false);
            }、
            / **
             *利用可能な支払い方法のリストを取得します。
             * @returns {配列}
             * /
            getAvailablePaymentMethods:function(){
                varメソッド= []、
                    self = this;
                _.each(methodList()、function(method){
                    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が既に存在する場合は削除します

次のdeployコマンドを実行します

php bin / magento setup:static-content:deploy


正しく動作していません。一度確認してください。
sivakumar

0

配達サインにもセッション名を作成する必要があります。そのため、コントローラーへの各POSTリクエストでカートの変更がリロードされます。基本的に、アクションノードはコントローラーパスを示し、セクションノードは更新するクライアント側コンテンツを定義します。この変更を適用するには、キャッシュをフラッシュする必要があります。Checkout/etc/frontend/sections.xml たとえば、チェックsections.xmlインetc/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.