I'm trying to add a back button to payment.html in my module.
I added the button in the html in my module like this:
<!-- <li id="payment" role="presentation" class="checkout-payment-method" data-bind="fadeVisible: isVisible"> <div id="checkout-step-payment" class="step-content" data-role="content" role="tabpanel" aria-hidden="false"> <!-- ko if: (quoteIsVirtual) --> <!-- ko foreach: getRegion('customer-email') --> <!-- ko template: getTemplate() --><!-- /ko --> <!--/ko--> <!--/ko--> <form id="co-payment-form" class="form payments" novalidate="novalidate"> <input data-bind='attr: {value: getFormKey()}' type="hidden" name="form_key"/> <fieldset class="fieldset"> <legend class="legend"> <span data-bind="i18n: 'Payment Information'"></span> </legend><br /> <!-- ko foreach: getRegion('beforeMethods') --> <!-- ko template: getTemplate() --><!-- /ko --> <!-- /ko --> <div id="checkout-payment-method-load" class="opc-payment" data-bind="visible: isPaymentMethodsAvailable"> <!-- ko foreach: getRegion('payment-methods-list') --> <!-- ko template: getTemplate() --><!-- /ko --> <!-- /ko --> </div> <button class="button action continue primary" data-bind="goToPrevStep()"> <span data-bind="i18n: 'Back'"></span> </button> <div class="no-quotes-block" data-bind="visible: isPaymentMethodsAvailable() == false"> <!-- ko i18n: 'No Payment method available.'--><!-- /ko --> </div> <!-- ko foreach: getRegion('afterMethods') --> <!-- ko template: getTemplate() --><!-- /ko --> <!-- /ko --> </fieldset> </form> </div>
But i'm unsure on the best way to add the js. I tried overwriting the payment.js but ofcourse then i also need to copy over the all the dependancies.
Is there any better way to do this.
I know I need something like this but with a prev or navigateTo function.
goToPrevStep:function(){ stepNavigator.next(); },
That is dependent on stepNavigator. But i'm unsure where to exactly put it.
Or is this the best solution? I feel like there should be a prettier solution, right?
Solved! Go to Solution.
I ended up extending the xml with a custom component and adding JS to that.
checkout_index_index.xml
<?xml version="1.0"?> <!-- /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ --> <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="checkout" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <body> <referenceContainer name="content"> <referenceBlock name="checkout.root"> <arguments> <argument name="jsLayout" xsi:type="array"> <item name="components" xsi:type="array"> <item name="checkout" xsi:type="array"> <item name="children" xsi:type="array"> <item name="steps" xsi:type="array"> <item name="children" xsi:type="array"> <item name="billing-step" xsi:type="array"> <item name="children" xsi:type="array"> <item name="payment" xsi:type="array"> <item name="children" xsi:type="array"> <item name="afterMethods" xsi:type="array"> <item name="children" xsi:type="array"> <item name="back-button" xsi:type="array"> <item name="sortOrder" xsi:type="string">35</item> <item name="component" xsi:type="string">uiComponent</item> <item name="config" xsi:type="array"> <item name="template" xsi:type="string">BB_Checkout/back-button</item> <item name="component" xsi:type="string">BB_Checkout/js/view/back-button</item> </item> </item> </item> </item> </item> </item> </item> </item> </item> </item> </item> </item> </item> </argument> </arguments> </referenceBlock> </referenceContainer> </body> </page>
back-button.js
define([ 'uiComponent', 'Magento_Checkout/js/model/step-navigator' ], function (Component, stepNavigator) { return Component.extend({ goToPrevStep: function () { stepNavigator.navigateTo('shipping'); } }) });
back-button.html
<div class="back"> <a data-bind="click: goToPrevStep()" aria-describedby="checkout-back" class="action back"> <span data-bind="i18n: '< Back'"></span> </a> </div>
Thanks for the help
Hello @SannNL
Good question.
Based on the magento2 standard you can do the same way as Magento doing for place order button.
vendor\magento\module-checkout\view\frontend\web\template\review\actions\default.html
<!-- /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ --> <div class="actions-toolbar" id="review-buttons-container"> <div class="primary"> <button data-role="review-save" type="submit" data-bind="click: placeOrder($parents[1]), attr: {title: $t('Place Order')}" class="button action primary checkout"><span data-bind="i18n: 'Place Order'"></span></button> </div> <div class="secondary"> <span id="checkout-review-edit-label" data-bind="i18n: 'Forgot an Item?'"></span> <a data-bind="attr: {href: $parents[1].cartUrl}" aria-describedby="checkout-review-edit-label" class="action edit"> <span data-bind="i18n: 'Edit Your Cart'"></span> </a> </div> </div>
In this file you can add your code for go to previous page.
vendor\magento\module-checkout\view\frontend\web\js\view\review\actions\default.js
/** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ /** * @deprecated since version 2.2.0 */ define([ 'uiComponent' ], function (Component) { 'use strict'; return Component.extend({ defaults: { template: 'Magento_Checkout/review/actions/default' }, /** * @param {Object} parent * @return {Function} */ placeOrder: function (parent) { return parent.placeOrder.bind(parent); } }); }); where you need to add your function and as well step-navigation into require.
Hope it will help you.
If it will work then mark as solution.
Ah that looks like a better solution, thanks.
I'm a bit unsure on how I would get the button to display on the payment page after adding it to default.html though?
I now have this:
Default.html
<div class="actions-toolbar" id="review-buttons-container"> <div class="primary"> <button data-role="review-save" type="submit" data-bind="click: placeOrder($parents[1]), attr: {title: $t('Place Order')}" class="button action primary checkout"><span data-bind="i18n: 'Place Order'"></span></button> </div> <div class="secondary"> <span id="checkout-review-edit-label" data-bind="i18n: 'Forgot an Item?'"></span> <a data-bind="attr: {href: $parents[1].cartUrl}" aria-describedby="checkout-review-edit-label" class="action edit"> <span data-bind="i18n: 'Edit Your Cart'"></span> </a> </div> <div class="back"> <a data-bind="click: goToPrevStep()" aria-describedby="checkout-back" class="action back"> <span data-bind="i18n: 'Back'"></span> </a> </div> </div>
default.js (btw the @depricated worries me since i'm on 2.2.3)
/**
* @deprecated since version 2.2.0
*/
define([
'uiComponent',
'Magento_Checkout/js/model/step-navigator'
], function (
Component,
stepNavigator
) {
'use strict';
return Component.extend({
defaults: {
template: 'Magento_Checkout/review/actions/default'
},
/**
* @param {Object} parent
* @return {Function}
*/
placeOrder: function (parent) {
return parent.placeOrder.bind(parent);
},
goToPrevStep:function(){
stepNavigator.next();
},
});
});
Payment.html
<li id="payment" role="presentation" class="checkout-payment-method" data-bind="fadeVisible: isVisible"> <div id="checkout-step-payment" class="step-content" data-role="content" role="tabpanel" aria-hidden="false"> <!-- ko if: (quoteIsVirtual) --> <!-- ko foreach: getRegion('customer-email') --> <!-- ko template: getTemplate() --><!-- /ko --> <!--/ko--> <!--/ko--> <form id="co-payment-form" class="form payments" novalidate="novalidate"> <input data-bind='attr: {value: getFormKey()}' type="hidden" name="form_key"/> <fieldset class="fieldset"> <legend class="legend"> <span data-bind="i18n: 'Payment Information'"></span> </legend><br /> <!-- ko foreach: getRegion('beforeMethods') --> <!-- ko template: getTemplate() --><!-- /ko --> <!-- /ko --> <div id="checkout-payment-method-load" class="opc-payment" data-bind="visible: isPaymentMethodsAvailable"> <!-- ko foreach: getRegion('payment-methods-list') --> <!-- ko template: getTemplate() --><!-- /ko --> <!-- /ko --> </div> <div class="back"> <a data-bind="click: goToPrevStep()" aria-describedby="checkout-back" class="action back"> <span data-bind="i18n: 'Back'"></span> </a> </div> <div class="no-quotes-block" data-bind="visible: isPaymentMethodsAvailable() == false"> <!-- ko i18n: 'No Payment method available.'--><!-- /ko --> </div> <!-- ko foreach: getRegion('afterMethods') --> <!-- ko template: getTemplate() --><!-- /ko --> <!-- /ko --> </fieldset> </form> </div> </li>
Thanks in advance @Sunil Patel
Hello @SannNL
Payment page means the second step of checkout page right?
Yes I would like to add it next to the place order button.
Error: 'Unable to process binding "click: function (){return goToPrevStep() }"
Message: goToPrevStep is not defined'.
Hello @SannNL
click: goToPrevStep()
should be
click: goToPrevStep($parents[1])
Hope it will help you.
If it will work then mark as solution.
Sadly I still get this error:
Hello @SannNL
I am not able to see that image.
Can you please your site URL?
I have the site on a local dev environment sadly.
This way you can click on the image:
Hello
still i am not able to see image, please share image via online tool.