我是Magento的新手。我的商店应该使用网络服务。在magento创建新订单之前,我必须检查来自Web服务的产品的可用性。创建订单成功后,我必须将orderId发送回Web服务。当客户确认按钮“下订单”时,应执行所有这些操作。
在图片中,您会看到“下订单”。我不确定Magento是如何创建新订单的。我假设一个动作placeOrder()将被调用。我的目标是在此操作之前放置方法checkAvailability(),并在此操作之后放置方法sendOrderId()。 checkAvailability()和SendOrderId()是来自webservice的方法。
有人有想法,我该怎么做?在哪里可以做到?
抱歉英语不好。谢谢
答案 0 :(得分:0)
根据您的要求,您需要使用此活动。
使用此事件观察器检查checkAvailability()
checkout_onepage_controller_success_action
使用此事件观察者使用SendOrderId()
sales_order_place_after
答案 1 :(得分:0)
我有一个类似的案例。我需要覆盖在第三方模块( Amasty_Checkout )中宣布的placeOrder操作。
因此,我的解决方案是在主题中创建mixin。
1)用myTheme/Amasty_Checkout/requirejs-config.js
宣布主题中的mixin:
var config = {
config: {
mixins: {
'Amasty_Checkout/js/view/onepage': {
'Amasty_Checkout/js/view/onepage-extend': true
}
}
}
};
2)添加带有代码的mixin myTheme/Amasty_Checkout/web/js/view/onepage-extend.js
:
define(
[
'jquery',
'uiComponent',
'ko',
'uiRegistry',
'Magento_Checkout/js/model/quote',
'Amasty_Checkout/js/action/set-shipping-information',
'Amasty_Checkout/js/model/agreement-validator',
'Amasty_Checkout/js/model/agreement-validator-old',
'Magento_Checkout/js/model/payment/additional-validators',
'Amasty_Checkout/js/model/amalert',
'mage/translate'
],
function (
$,
Component,
ko,
registry,
quote,
setShippingInformationAction,
checkoutValidator,
checkoutValidatorOld,
additionalValidators,
alert,
$t
) {
'use strict';
var mixin = {
placeOrder: function () {
// Here you put your extended code
}
};
return function (target) { // target == Result that Magento_Ui/.../default returns.
return target.extend(mixin); // new result that all other modules receive
};
});
请注意,就我而言,我复制了我需要覆盖的原始模块脚本('Amasty_Checkout/js/view/onepage'
)中define [...]部分中的所有内容。
以下是帮助我解决问题的资源https://github.com/magento/magento2/issues/1864#issuecomment-141112927
我希望这可以帮助某人节省时间。
答案 2 :(得分:0)
如果您需要覆盖函数而不是类方法(我曾经覆盖过Magento_Checkout / js / action / place-order)。
requirejs-config.js
var config = {
config: {
mixins: {
'Magento_Checkout/js/action/place-order': {
'My_Module/js/action/place-order': true
}
}
}
};
place-order.js
define(['mage/utils/wrapper'], function (wrapper) {
'use strict';
return function (placeOrderAction) {
return wrapper.wrap(placeOrderAction, function (originalAction, paymentData, redirectOnSuccess) {
// my own code here
return originalAction(paymentData, redirectOnSuccess);
});
};
});