How to create Checkout ConfigData Provider in Magento2 - Magento Source24

 How to create Checkout ConfigData Provider in Magento2

How to create Checkout ConfigData Provider in Magento2 - Magento Source24

In this blog post i'm share with you to How to create Checkout ConfigData Provider in Magento2 

in this post main feature i have get configuration data in checkout js I 'm create file to validate delevey date behalf of module enable or disble - delivery-date-block.js

this way to get ConfigData in code\code\SR\DeliveryDate\view\frontend\web\js\view\delivery-date-block.js

👉 Step1: Create a system.xml file etc\adminhtml folder 


<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Config:etc/system_file.xsd">

    <system>

        <section id="sr_deliverydate" translate="label" type="text" sortOrder="1300" showInDefault="1" showInWebsite="1" showInStore="1">

            <label>Pickup Date Settings</label>

            <tab>sales</tab>

            <resource>SR_DeliveryDate::deliverydate</resource>

            <group id="general" sortOrder="10" showInDefault="1" showInWebsite="1" showInStore="1">

                <field id="active" showInDefault="1" showInStore="1" showInWebsite="1" sortOrder="10" translate="label" type="select">

                    <label>Enabled</label>

                    <source_model>Magento\Config\Model\Config\Source\Yesno</source_model>

                </field>

                <label>Pickup Date Shipping Method Settings</label>

                <field id="format" translate="label" type="text" sortOrder="10" showInDefault="1" showInWebsite="1" showInStore="1" canRestore="1">

                    <label>Date Format:</label>

                    <comment>yy-mm-dd</comment>

                </field>

                <field id="disabled" translate="label" type="multiselect" sortOrder="15" showInDefault="1" showInWebsite="1" showInStore="1" canRestore="1">

                    <label>Disabled Delivery Date</label>

                    <source_model>SR\DeliveryDate\Model\Config\Source\Disabled</source_model>

                </field>

                <field id="hourMin" translate="label" type="text" sortOrder="20" showInDefault="1" showInWebsite="1" showInStore="1" canRestore="1">

                    <label>Delivery Hour Start:</label>

                    <comment>Should be 8=>8AM, 9=>9AM </comment>

                </field>

                <field id="hourMax" translate="label" type="text" sortOrder="30" showInDefault="1" showInWebsite="1" showInStore="1" canRestore="1">

                    <label>Delivery Hour End:</label>

                    <comment>Should be 22=>7PM, 23=>8PM because Minutes cover 1hr </comment>

                </field>

            </group>

        </section>

            <section id="carriers" showInDefault="1" showInStore="1" showInWebsite="1" sortOrder="1000" translate="label">

            <group id="pickupDateandTime" showInDefault="1" showInStore="1" showInWebsite="1" sortOrder="10" translate="label">

                <label>Pickup Date and Time</label>

                <field id="active" showInDefault="1" showInStore="1" showInWebsite="1" sortOrder="10" translate="label" type="select">

                    <label>Enabled</label>

                    <source_model>Magento\Config\Model\Config\Source\Yesno</source_model>

                </field>

            </group>

        </section>

    </system>

</config>


👉 Step2: Create a file DeliveryDateConfigProvider.php in code\code\SR\DeliveryDate\Model\  Folder


<?php

namespace SR\DeliveryDate\Model;


use Magento\Checkout\Model\ConfigProviderInterface;

use Magento\Store\Model\ScopeInterface;


class DeliveryDateConfigProvider implements ConfigProviderInterface

{

    const XPATH_FORMAT = 'sr_deliverydate/general/format';

    const XPATH_DISABLED = 'sr_deliverydate/general/disabled';

    const XPATH_ACTIVE = 'sr_deliverydate/general/active';

    const XPATH_HOURMIN = 'sr_deliverydate/general/hourMin';

    const XPATH_HOURMAX = 'sr_deliverydate/general/hourMax';


    /**

     * @var \Magento\Store\Model\StoreManagerInterface

     */

    protected $storeManager;


    /**

     * @var \Magento\Framework\App\Config\ScopeConfigInterface

     */

    protected $scopeConfig;


    /**

     * @param \Magento\Store\Model\StoreManagerInterface $storeManager

     * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig

     */

    public function __construct(

        \Magento\Store\Model\StoreManagerInterface $storeManager,

        \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig

    ) {

        $this->storeManager = $storeManager;

        $this->scopeConfig = $scopeConfig;

    }


    /**

     * {@inheritdoc}

     */

    public function getConfig()

    {

        $store = $this->getStoreId();

        $disabled = $this->scopeConfig->getValue(self::XPATH_DISABLED, ScopeInterface::SCOPE_STORE, $store);

        $active = $this->scopeConfig->getValue(self::XPATH_ACTIVE, ScopeInterface::SCOPE_STORE, $store);

        $hourMin = $this->scopeConfig->getValue(self::XPATH_HOURMIN, ScopeInterface::SCOPE_STORE, $store);

        $hourMax = $this->scopeConfig->getValue(self::XPATH_HOURMAX, ScopeInterface::SCOPE_STORE, $store);

        $format = $this->scopeConfig->getValue(self::XPATH_FORMAT, ScopeInterface::SCOPE_STORE, $store);

        

        $noday = 0;

        if($disabled == -1) {

            $noday = 1;

        }


        $config = [

            'shipping' => [

                'delivery_date' => [

                    'format' => $format,

                    'disabled' => $disabled,

                    'active' => $active,

                    'noday' => $noday,

                    'hourMin' => $hourMin,

                    'hourMax' => $hourMax

                ]

            ]

        ];


        return $config;

    }


    public function getStoreId()

    {

        return $this->storeManager->getStore()->getStoreId();

    }

}


👉 Step3 : Create a delivery-date-block.js file in code\code\SR\DeliveryDate\view\frontend\web\js\view\delivery-date-block.js


define([

    'jquery',

    'ko',

    'uiComponent',

    'Magento_Ui/js/form/element/abstract',

    'mage/calendar'

], function ($, ko, Component) {

    'use strict';

   

    var active = window.checkoutConfig.shipping.delivery_date.active;

       if(active == 1){

    return Component.extend({

        

        defaults: {

            template: 'SR_DeliveryDate/delivery-date-block'

        },


        initialize: function () {

            this._super();

            var disabled = window.checkoutConfig.shipping.delivery_date.disabled;

            var noday = window.checkoutConfig.shipping.delivery_date.noday;

            var hourMin = parseInt(window.checkoutConfig.shipping.delivery_date.hourMin);

            var hourMax = parseInt(window.checkoutConfig.shipping.delivery_date.hourMax);

            var format = window.checkoutConfig.shipping.delivery_date.format;

            var date = new Date();

            if(!format) {

                format = 'yy-mm-dd';

            }

            var disabledDay = disabled.split(",").map(function(item) {

                return parseInt(item, 10);

            });


            ko.bindingHandlers.datepicker = {

                init: function (element, valueAccessor, allBindingsAccessor) {

                  

                        var $el = $(element);

                  

                //    console.log($el);

                    //initialize datepicker

                    if(noday) {

                        var options = {

                            showsTime: false,

                            dateFormat:format,

                            hourMin: hourMin,

                            hourMax: hourMax,

                            minDate: '+1d',

                            maxDate: '+7d'

                           

                        };

                    } else {

                        var options = {

                            showsTime: false,

                            dateFormat:format,

                            hourMin: hourMin,

                            hourMax: hourMax,

                            minDate: '+1d',

                            maxDate: '+7d',

                            beforeShowDay: function(date) {

                                var day = date.getDay();

                                alert(day);

                                if(disabledDay.indexOf(day) > -1) {

                                    return [false];

                                } else {

                                    return [true];

                                }

                            }

                        };

                    }


                    $el.datepicker(options);


                    var writable = valueAccessor();

                    if (!ko.isObservable(writable)) {

                        var propWriters = allBindingsAccessor()._ko_property_writers;

                        if (propWriters && propWriters.datepicker) {

                            writable = propWriters.datepicker;

                        } else {

                            return;

                        }

                    }

                    writable($(element).datepicker("getDate"));

                },

                // update: function (element, valueAccessor) {

                //     var widget = $(element).data("datepicker");

               

                //     if (widget) {

                //         var date = ko.utils.unwrapObservable(valueAccessor());

                //         widget.date(date);

                //     }

                // }

                

            };


            return this;

        }

    });


}else{

    return Component.extend({      

    });

}    

});


👉 Step4: this is form file delivery-date-block.html in code\code\SR\DeliveryDate\view\frontend\web\template


<div class="deleverydateandtime">

    <label class="label">Delivery Date</label>

<br/>

<div class="control delivery_date_class">

    <input class="input-text" type="text" data-bind="datepicker: true" placeholder="Select Date" name="delivery_date" id="delivery_date"/>

</div>

<!-- <br/>

<label class="label">Comment</label>

<div class="control">

    <textarea name="delivery_comment" id="delivery_comment"></textarea>

</div> -->

<br/>

<label class="label">Delevery Time </label> 

<div class="control delivery_time_class">

<select name="delivery_time" class="input-select" id="delivery_time">

    <option value="">Select Time</option>

    <option value="07:00AM - 10:00AM">07:00AM - 10:00AM</option>

    <option value="10:00AM - 01:00PM">10:00AM - 01:00PM</option>

    <option value="01:00PM - 03:00PM">01:00PM - 03:00PM</option>

    <option value="03:00PM - 06:00PM">03:00PM - 06:00PM</option>

   </select> 

</div>

<br/>

<br/>

</div>


<style>

    .delivery_date_class{

        margin-top: 10px;

    }

    .delivery_time_class{

        margin-top: 10px;

    } 

    input#delivery_date {

    width: 59%;

}

select#delivery_time {

    width: 59%;

</style>


👉 Step5: create a default.js file in code\SR\DeliveryDate\view\frontend\web\js\model\shipping-save-processor


/*global define,alert*/

define(

    [

        'jquery',

        'ko',

        'Magento_Checkout/js/model/quote',

        'Magento_Checkout/js/model/resource-url-manager',

        'mage/storage',

        'Magento_Checkout/js/model/payment-service',

        'Magento_Checkout/js/model/payment/method-converter',

        'Magento_Checkout/js/model/error-processor',

        'Magento_Checkout/js/model/full-screen-loader',

        'Magento_Checkout/js/action/select-billing-address'

    ],

    function (

        $,

        ko,

        quote,

        resourceUrlManager,

        storage,

        paymentService,

        methodConverter,

        errorProcessor,

        fullScreenLoader,

        selectBillingAddressAction

    ) {

        'use strict';


        return {

            saveShippingInformation: function () {

                var payload;


                if (!quote.billingAddress()) {

                    selectBillingAddressAction(quote.shippingAddress());

                }


                payload = {

                    addressInformation: {

                        shipping_address: quote.shippingAddress(),

                        billing_address: quote.billingAddress(),

                        shipping_method_code: quote.shippingMethod().method_code,

                        shipping_carrier_code: quote.shippingMethod().carrier_code,

                        extension_attributes:{

                            delivery_date: $('[name="delivery_date"]').val(),

                            delivery_comment: $('[name="delivery_comment"]').val(),

                            delivery_time: $('[name="delivery_time"]').val()

                        }

                    }

                };


                fullScreenLoader.startLoader();


                return storage.post(

                    resourceUrlManager.getUrlForSetShippingInformation(quote),

                    JSON.stringify(payload)

                ).done(

                    function (response) {

                        quote.setTotals(response.totals);

                        paymentService.setPaymentMethods(methodConverter(response.payment_methods));

                        fullScreenLoader.stopLoader();

                    }

                ).fail(

                    function (response) {

                        errorProcessor.process(response);

                        fullScreenLoader.stopLoader();

                    }

                );

            }

        };

    }

);


👉 Step 6: create a file checkout_index_index.xml in code\code\SR\DeliveryDate\view\frontend\layout


<?xml version="1.0"?>

<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" 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="delivery_date" xsi:type="array">

                                                                    <item name="component" xsi:type="string">SR_DeliveryDate/js/view/delivery-date-block</item>

                                                                </item>

                                                            </item>

                                                        </item>

                                                    </item>

                                                </item>

                                            </item>

                                        </item>

                                    </item>

                                </item>

                            </item>

                        </item>

                    </item>

                </argument>

            </arguments>

        </referenceBlock>

    </body>

</page>



Deepak Kumar Bind

Success is peace of mind, which is a direct result of self-satisfaction in knowing you made the effort to become the best of which you are capable.

Post a Comment

If you liked this post please do not forget to leave a comment. Thanks

Previous Post Next Post