#magento #magento2 #checkout
#magento #magento2 #Оформить покупку
Вопрос:
На странице оформления заказа мне нужно обновить итоги заказа и удалить НДС из итога после проверки поля НДС (проверка выполняется в контроллере). Также цены необходимо сохранить в представлении заказа в бэкэнде.
Я уже пытался выполнить обновление с помощью пользовательского js, и оно отлично работает во внешнем интерфейсе, но не экономит при просмотре заказа в серверной части
define([
'jquery',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/model/resource-url-manager',
'mage/storage',
'Magento_Checkout/js/action/get-payment-information',
'Magento_Checkout/js/model/totals',
'Magento_Checkout/js/model/full-screen-loader',
'Magento_Checkout/js/action/get-totals',
'Magento_Checkout/js/model/cart/totals-processor/default'
], function ($, quote, urlManager,storage, getPaymentInformationAction, totals, fullscreenLoader,
getTotalsAction) {
'use strict';
return function (removeTax, tax) {
var payload = {
addressInformation: {
shipping_address: quote.shippingAddress(),
billing_address: quote.billingAddress(),
shipping_method_code: quote.shippingMethod().method_code,
shipping_carrier_code: quote.shippingMethod().carrier_code
}
};
fullscreenLoader.startLoader();
return storage.post(
urlManager.getUrlForSetShippingInformation(quote),
JSON.stringify(payload)
).done(function (response) {
if(removeTax) {
response.totals.total_segments[2].value = -tax;
response.totals.total_segments[4].value -= tax;
} else {
response.totals.total_segments[2].value = tax;
response.totals.total_segments[4].value = tax;
}
var deferred = $.Deferred();
totals.isLoading(true);
getTotalsAction([], deferred);
$.when(deferred).done(function () {
quote.setTotals(response.totals);
totals.isLoading(false);
fullscreenLoader.stopLoader();
});
}).fail(function (response) {
console.log('fail');
totals.isLoading(false);
fullScreenLoader.stopLoader();
});
};
});
С другой стороны, я попытался также изменить итоги заказа на etc/sales.xml . Здесь мне удается обновить как внешний интерфейс, так и представление заказа администратора, но мне не удается внести эти корректировки только после проверки поля НДС. Вот моя функция сбора модели:
public function collect(
MagentoQuoteModelQuote $quote,
MagentoQuoteApiDataShippingAssignmentInterface $shippingAssignment,
MagentoQuoteModelQuoteAddressTotal $total
) {
parent::collect($quote, $shippingAssignment, $total);
$currentTax = $total->getTaxAmount();
$total->setTaxAmount(-$currentTax);
$total->setBaseTaxAmount(-$currentTax);
$total->setGrandTotal($total->getGrandTotal() - $currentTax);
$total->setBaseGrandTotal($total->getBaseGrandTotal() - $currentTax);
return $this;
}
Итак, я попытался установить сообщение сеанса следующим образом: $this-> session-> setMySession («Действительный НДС»); в контроллере, где я выполняю проверку НДС, а затем в модели, чтобы вносить изменения, только если:
if($this->session->getMySession() == "Valid VAT" ){
.........
}
но это не устанавливает сообщение сеанса, потому что модель загружается один раз при первой загрузке страницы, и мне не удается перезагрузить ее после проверки.
Может кто-нибудь помочь или подсказать, как я могу внести изменения в цены только после проверки в контроллере?
Заранее спасибо
Комментарии:
1. Почему бы не использовать наблюдателя для проверки правильности поля и изменения итогов до или после сохранения заказа?
2. Я пытался использовать наблюдателя, но когда я пытаюсь обновить итоговые данные, вызывая метод сбора класса Magento Quote Model Quote Address Total AbstractTotal, он не работает нормально