Magento 2.2.7单步结账:添加折扣码后强制更新配送方式
在Magento 2.2.7单步结账中添加折扣码后强制刷新配送方式
在Magento 2.2.7的单步结账场景里,我遇到过用户添加免运费这类折扣码后,配送方式列表不会自动更新的问题——明明折扣已经生效,但用户还是看不到对应的配送选项。后来通过重写优惠券应用的核心逻辑,在折扣码成功生效后强制触发配送信息的重新获取,完美解决了这个问题,分享给你:
完整代码实现
define([ 'ko', 'jquery', 'Magento_Checkout/js/model/quote', 'Magento_Checkout/js/model/resource-url-manager', 'Magento_Checkout/js/model/error-processor', 'Magento_SalesRule/js/model/payment/discount-messages', 'mage/storage', 'mage/translate', 'Magento_Checkout/js/action/get-payment-information', 'Magento_Checkout/js/model/totals', 'Magento_Checkout/js/model/full-screen-loader' ], function ( ko, $, quote, urlManager, errorProcessor, messageContainer, storage, $t, getPaymentInformationAction, totals, fullScreenLoader ) { 'use strict'; return function (couponCode, isApplied) { var quoteId = quote.getQuoteId(), url = urlManager.getApplyCouponUrl(couponCode, quoteId), message = $t('Your coupon was successfully applied!!'); fullScreenLoader.startLoader(); return storage.put( url, {}, false ).done(function (response) { var deferred; if (response) { isApplied(true); totals.isLoading(true); // 触发支付/配送信息的重新获取,这是强制刷新配送方式的核心 deferred = $.Deferred(); getPaymentInformationAction(deferred); $.when(deferred).done(function () { fullScreenLoader.stopLoader(); totals.isLoading(false); console.log("配送方式已更新"); }); messageContainer.addSuccessMessage({ 'message': message }); } }).fail(function (response) { fullScreenLoader.stopLoader(); totals.isLoading(false); errorProcessor.process(response, messageContainer); }); }; });
关键逻辑拆解
核心刷新触发点:
getPaymentInformationAction是实现配送方式刷新的关键,它会向后端请求最新的订单支付与配送信息——包括折扣码生效后符合条件的所有配送选项,相当于强制让系统重新计算并返回当前订单的配送方式列表。异步流程处理:
用$.Deferred()来管理异步请求的状态,确保只有在后端返回最新配送信息后,才关闭加载遮罩并结束加载状态,避免用户看到未更新的内容。用户体验优化:
通过fullScreenLoader和totals.isLoading标记加载状态,既防止用户重复操作,也能让用户直观感受到系统正在更新信息。
你只需要把这段代码替换Magento默认的Magento_SalesRule/js/action/apply-coupon文件,或者通过requirejs映射规则重写该模块,就能实现添加折扣码后自动刷新配送方式的效果。
内容的提问来源于stack exchange,提问作者Dario Vranjković
相关产品推荐
相关产品推荐

