Skip to content

Custom field in checkout shipping method section giving an error – magento 2.4.4

My requirement

I want to show available stores in checkout when customer choose Store pickup( Custom shipping method).

I did not use Magento default because inventory is not managing location wise.

Great Thanks to this wonderful Article.I followed this Article
https://zanetabaran.com/how-to-in-magento-2-how-to-add-additional-dropdown-with-options-based-on-selected-shipping-methods-in-the-checkout/ to do the task. But i am getting below error on console.

[2022-10-28 09:03:23] [ERROR] Failed to load the “Ayakil_CustomShippingMethod/additional_shipping_option” template requested by “checkout.steps.shipping-step.shippingAddress.shippingAdditional.shipping-option-wrapper”.

I will share my files below.
checkout_index_index.xml file – ( Ayakil/CustomShippingMethod/view/frontend/layout/checkout_index_index.xml )

<?xml version="1.0"?>
<page layout="1column" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
    <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="shipping-step" xsi:type="array">
                                        <item name="children" xsi:type="array">
                                            <item name="shippingAddress" xsi:type="array">
                                                <item name="children" xsi:type="array">
                                                    <item name="shippingAdditional" xsi:type="array">
                                                        <item name="component" xsi:type="string">uiComponent</item>
                                                        <item name="displayArea" xsi:type="string">shippingAdditional</item>
                                                        <item name="children" xsi:type="array">
                                                            <item name="shipping-option-wrapper" xsi:type="array">
                                                                <!-- Component Magento_Checkout/js/view/additional-shipping-option is used as a wrapper for content -->
                                                                <item name="component" xsi:type="string">Ayakil_CustomShippingMethod/js/view/additional_shipping_option</item>
                                                                <item name="provider" xsi:type="string">checkoutProvider</item>
                                                                <item name="sortOrder" xsi:type="string">0</item>
                                                                <item name="children" xsi:type="array">
                                                                    <item name="shipping-option" xsi:type="array">
                                                                        <!-- uiComponent is used as a wrapper for select (its template will render all children as a list) -->
                                                                        <item name="component" xsi:type="string">uiComponent</item>
                                                                        <!-- the following display area is used in template -->
                                                                        <item name="displayArea" xsi:type="string">additionalShippingOptionField</item>
                                                                        <item name="children" xsi:type="array">
                                                                            <item name="select-date" xsi:type="array">
                                                                                <item name="component" xsi:type="string">Ayakil_CustomShippingMethod/js/view/shipping_option_select</item>
                                                                                <item name="config" xsi:type="array">
                                                                                    <!--customScope is used to group elements within a single form (e.g. they can be validated separately)-->
                                                                                    <item name="customScope" xsi:type="string">shippingOptionSelect</item>
                                                                                    <item name="template" xsi:type="string">ui/form/field</item>
                                                                                    <item name="elementTmpl" xsi:type="string">ui/form/element/select</item>
                                                                                </item>
                                                                                <item name="dataScope" xsi:type="string">shippingOptionSelect.select_data</item>
                                                                                <item name="label" xsi:type="string" translate="true">Please select a day of delivery</item>
                                                                                <item name="provider" xsi:type="string">checkoutProvider</item>
                                                                                <item name="visible" xsi:type="boolean">true</item>
                                                                                <item name="validation" xsi:type="array">
                                                                                    <item name="required-entry" xsi:type="boolean">true</item>
                                                                                    <item name="validate-no-empty" xsi:type="boolean">true</item>
                                                                                </item>
                                                                                <item name="sortOrder" xsi:type="number">0</item>
                                                                            </item>
                                                                        </item>
                                                                    </item>
                                                                </item>
                                                            </item>
                                                        </item>
                                                    </item>
                                                </item>
                                            </item>
                                        </item>
                                    </item>
                                </item>
                            </item>
                        </item>
                    </item>
                </item>
            </argument>
        </arguments>
    </referenceBlock>
</body>

additional_shipping_option.js file – (Ayakil/CustomShippingMethod/view/frontend/web/js/view/additional_shipping_option.js)

define([
'uiComponent',
'ko',
'Magento_Checkout/js/model/quote'
], function (Component, ko, quote) {
'use strict';

return Component.extend({
    defaults: {
        template: 'Ayakil_CustomShippingMethod/additional_shipping_option'
    },

    initObservable: function () {
        var self = this._super();

        this.showAdditionalOption = ko.computed(function() {
            var method = quote.shippingMethod();

            if(method && method['carrier_code'] !== undefined) {
                return true;
            }

            return false;

        }, this);

        return this;
    }
});

});

shipping_option_select.js file – (Ayakil/CustomShippingMethod/view/frontend/web/js/view/shipping_option_select.js)

edefine([
'jquery',
'ko',
'Magento_Ui/js/form/element/select',
'Magento_Checkout/js/model/quote'
], function ($, ko, select, quote) {
'use strict';

var self;

return select.extend({

    initialize: function () {
        self = this;
        this._super();
        this.selectedShippingMethod = quote.shippingMethod();

        quote.shippingMethod.subscribe(function(){

            var method = quote.shippingMethod();

            if(method && method['carrier_code'] !== undefined) {
                if(!self.selectedShippingMethod || (self.selectedShippingMethod && self.selectedShippingMethod['carrier_code'] != method['carrier_code'])) {
                    self.selectedShippingMethod = method;
                    self.updateDropdownValues(method);
                }
            }

        }, null, 'change');
    },

    /**
     * Called when shipping method is changed.
     * Also called when initial selection is made.
     *
     * @param value
     * @returns {Object} Chainable
     */
    updateDropdownValues: function(method) {
        var valuesCollection = [];

        if(method['carrier_code'] == 'freeshipping'){
            valuesCollection = [
                {
                    label: 'Monday',
                    value: 'Monday'
                },
                {
                    label: 'Wednesday',
                    value: 'Wednesday'
                },
                {
                    label: 'Friday',
                    value: 'Friday'
                }
            ];
        } else {
            valuesCollection = [
                {
                    label: 'Today',
                    value: 'Today'
                },
                {
                    label: 'Tomorrow',
                    value: 'Tomorrow'
                }
            ];
        }

        self.updateDropdown(valuesCollection);
    },

    /**
     * Called when option is changed in store selection list.
     * Also called when initial selection is made.
     *
     * @param value
     * @returns {Object} Chainable
     */
    updateDropdown: function(value) {
        this.setOptions(value);
    }
});
});

additional_shipping_option.html file – ((Ayakil/CustomShippingMethod/view/frontend/web/template/additional_shipping_option.html)

<div class="additional-shipping-option-wrapper" data-bind="visible: showAdditonalOption()" style="display: block;"> Test
<div class="step-title" data-role="title" data-bind="i18n: 'Choose Store'"></div>
<!-- ko foreach: element.getRegion('additonalShippingOptionField') -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!--/ko-->

Can anyone help me to sort this issue?