проблема обновления страницы оформления заказа
Прежде всего я хочу дать несколько снимков экрана, чтобы понять мою проблему.
Теперь я хочу добавить сюда связанный код.
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>
Поставщик конфигурации deliverysignconfig
<?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
объект не вызывается, когда вы нажимаете кнопку "Далее", только его вызов, когда вы перезагружаете страницу.
Кто-нибудь может мне в этом помочь?
3 answers
Я думаю, что нам не нужно перезагружать общую сводку. Потому что, когда вы нажмете кнопку Далее, 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
из ответа.
Я заставляю мерзавца тянуть здесь.
ПРИМЕЧАНИЕ: Убедитесь, что ваш гонорар рассчитан правильно. На этапе оплаты, пожалуйста, проверьте, что в ответе указана наша плата.
Вам нужно перезаписать проверку 'payment-service.js ' класс модели. Вы можете сделать это следующим образом:
#Kensium/DeliverySign/view/frontend/requirejs-config.js var config = { "map": { "*": { '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/view/frontend/web/js/model/payment-service.js и содержание должно быть
/** * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ define( [ 'underscore', '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, totals) { 'use strict'; var freeMethodCode = 'free'; return { isFreeAvailable: false, /** * Populate the list of payment methods * @param {Array} methods */ setPaymentMethods: function (methods) { var self = this, freeMethod, filteredMethods, methodIsAvailable; freeMethod = _.find(methods, function (method) { return method.method === freeMethodCode; }); this.isFreeAvailable = freeMethod ? true : false; 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; }); //Unset selected payment method if not available if (!methodIsAvailable) { selectPaymentMethod(null); } } methodList(methods); totals.isLoading(true); window.checkoutConfig.show_hide_deliverysign_block = 1; totals.isLoading(false); }, /** * Get the list of available payment methods. * @returns {Array} */ getAvailablePaymentMethods: function () { var methods = [], self = this; _.each(methodList(), function (method) { if (self.isFreeAvailable && ( quote.totals().grand_total 0 && method.method !== freeMethodCode ) || !self.isFreeAvailable ) { methods.push(method); } }); return methods; } }; } );
Удалить pub/статический/интерфейс/Magento/luma/en_US/kensium_deliverysign, если он уже существует
Выполните следующую команду развертывания
Настройка Php bin/magento: статический контент: развертывание
Вы также должны создать имя сеанса на знаке доставки.
Таким образом, это приведет к перезагрузке изменений корзины при каждом запросе на отправку вашему контроллеру. По сути, узел действия указывает путь контроллера, а узел раздела определяет, какое содержимое на стороне клиента должно быть обновлено.
Для применения этого изменения кэши должны быть очищены.
Проверка 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>