I am creating the functionality for showing error or success messages in the custom popup box after order placement in Magento 2.4. Any reference or help is appreciated.
-
Please provide more information. Do you want the popup on checkout or on success page? Should it be shown with some delay?– dudzioCommented May 15 at 9:09
-
After we press the place order button, then success or error message appears in the popup with order details like order number.– Mitul VadaliaCommented May 15 at 10:36
Add a comment
|
1 Answer
you can use this code to add popup on place order.
vendor/magento/module-checkout/view/frontend/web/js/view/payment/default.js
define([
'ko',
'jquery',
'uiComponent',
'Magento_Checkout/js/action/place-order',
'Magento_Checkout/js/action/select-payment-method',
'Magento_Checkout/js/model/quote',
'Magento_Customer/js/model/customer',
'Magento_Checkout/js/model/payment-service',
'Magento_Checkout/js/checkout-data',
'Magento_Checkout/js/model/checkout-data-resolver',
'uiRegistry',
'Magento_Checkout/js/model/payment/additional-validators',
'Magento_Ui/js/model/messages',
'uiLayout',
'Magento_Ui/js/modal/modal'
], function (
ko,
$,
Component,
placeOrderAction,
selectPaymentMethodAction,
quote,
customer,
paymentService,
checkoutData,
checkoutDataResolver,
registry,
additionalValidators,
Messages,
layout,
modal
) {
'use strict';
return Component.extend({
redirectAfterPlaceOrder: true,
isPlaceOrderActionAllowed: ko.observable(quote.billingAddress() != null),
/**
* After place order callback
*/
afterPlaceOrder: function () {
// Override this function and put after place order logic here
},
/**
* Initialize view.
*
* @return {exports}
*/
initialize: function () {
var billingAddressCode,
billingAddressData,
defaultAddressData;
this._super().initChildren();
quote.billingAddress.subscribe(function (address) {
this.isPlaceOrderActionAllowed(address !== null);
}, this);
checkoutDataResolver.resolveBillingAddress();
billingAddressCode = 'billingAddress' + this.getCode();
registry.async('checkoutProvider')(function (checkoutProvider) {
defaultAddressData = checkoutProvider.get(billingAddressCode);
if (defaultAddressData === undefined) {
// Skip if payment does not have a billing address form
return;
}
billingAddressData = checkoutData.getBillingAddressFromData();
if (billingAddressData) {
checkoutProvider.set(
billingAddressCode,
$.extend(true, {}, defaultAddressData, billingAddressData)
);
}
checkoutProvider.on(billingAddressCode, function (providerBillingAddressData) {
checkoutData.setBillingAddressFromData(providerBillingAddressData);
}, billingAddressCode);
});
return this;
},
/**
* Initialize child elements
*
* @returns {Component} Chainable.
*/
initChildren: function () {
this.messageContainer = new Messages();
this.createMessagesComponent();
return this;
},
/**
* Create child message renderer component
*
* @returns {Component} Chainable.
*/
createMessagesComponent: function () {
var messagesComponent = {
parent: this.name,
name: this.name + '.messages',
displayArea: 'messages',
component: 'Magento_Ui/js/view/messages',
config: {
messageContainer: this.messageContainer
}
};
layout([messagesComponent]);
return this;
},
/**
* Place order.
*/
placeOrder: function (data, event) {
var self = this;
if (event) {
event.preventDefault();
}
if (this.validate() &&
additionalValidators.validate() &&
this.isPlaceOrderActionAllowed() === true
) {
this.isPlaceOrderActionAllowed(false);
this.getPlaceOrderDeferredObject()
.done(
function () {
self.afterPlaceOrder(response);
// Show popup instead of redirecting
self.showOrderSuccessPopup(response);
}
).always(
function () {
self.isPlaceOrderActionAllowed(true);
}
);
return true;
}
return false;
},
/**
* @return {*}
*/
getPlaceOrderDeferredObject: function () {
return $.when(
placeOrderAction(this.getData(), this.messageContainer)
);
},
/**
* @return {Boolean}
*/
selectPaymentMethod: function () {
selectPaymentMethodAction(this.getData());
checkoutData.setSelectedPaymentMethod(this.item.method);
return true;
},
isChecked: ko.computed(function () {
return quote.paymentMethod() ? quote.paymentMethod().method : null;
}),
isRadioButtonVisible: ko.computed(function () {
return paymentService.getAvailablePaymentMethods().length !== 1;
}),
/**
* Get payment method data
*/
getData: function () {
return {
'method': this.item.method,
'po_number': null,
'additional_data': null
};
},
/**
* Get payment method type.
*/
getTitle: function () {
return this.item.title;
},
/**
* Get payment method code.
*/
getCode: function () {
return this.item.method;
},
/**
* @return {Boolean}
*/
validate: function () {
return true;
},
/**
* @return {String}
*/
getBillingAddressFormName: function () {
return 'billing-address-form-' + this.item.method;
},
/**
* Dispose billing address subscriptions
*/
disposeSubscriptions: function () {
// dispose all active subscriptions
var billingAddressCode = 'billingAddress' + this.getCode();
registry.async('checkoutProvider')(function (checkoutProvider) {
checkoutProvider.off(billingAddressCode);
});
},
/**
* Show Order Success Popup
*/
showOrderSuccessPopup: function(response) {
// Create the modal HTML
var modalHtml = `
<div id="order-success-popup" class="modal" style="display: none;">
<div class="modal-content">
<h1>Order Placed Successfully</h1>
<p>Your order id is: <strong>${response}</strong></p>
<p>Your order has been placed successfully!</p>
<button id="close-popup" class="action primary">Close</button>
</div>
</div>
`;
// Append the modal HTML to the body
$('body').append(modalHtml);
// Initialize the modal
var options = {
type: 'popup',
responsive: true,
innerScroll: true,
title: 'Order Placed Successfully',
buttons: []
};
var popup = modal(options, $('#order-success-popup'));
// Open the modal
$('#order-success-popup').modal('openModal');
// Close the modal on button click
$('#close-popup').on('click', function() {
$('#order-success-popup').modal('closeModal');
});
}
});
});
Result will be like this.
-
After closing popup you can redirect to homepage , if need help let me know.– Kareem kCommented May 17 at 11:08
-
Can we add order details in the popup like its ID or increment id , and on closing the popup, it should redirect to home page Commented May 17 at 11:31
-
-
To redirect use this in close-popup $('#close-popup').on('click', function() { $('#order-success-popup').modal('closeModal'); window.location.href = urlBuilder.build(''); // Redirect to home page });– Kareem kCommented May 17 at 12:49