如何在Magento 2中覆盖placeOrder()动作

时间:2017-02-16 14:47:11

标签: magento module

我是Magento的新手。我的商店应该使用网络服务。在magento创建新订单之前,我必须检查来自Web服务的产品的可用性。创建订单成功后,我必须将orderId发送回Web服务。当客户确认按钮“下订单”时,应执行所有这些操作。

enter image description here

在图片中,您会看到“下订单”。我不确定Magento是如何创建新订单的。我假设一个动作placeOrder()将被调用。我的目标是在此操作之前放置方法checkAvailability(),并在此操作之后放置方法sendOrderId()。 checkAvailability()和SendOrderId()是来自webservice的方法。

有人有想法,我该怎么做?在哪里可以做到?

抱歉英语不好。谢谢

3 个答案:

答案 0 :(得分:0)

根据您的要求,您需要使用此活动。

  1. 使用此事件观察器检查checkAvailability()

    checkout_onepage_controller_success_action

  2. 使用此事件观察者使用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);
        });
    };
});