চেকআউট_ইন্ডেক্স_ইন্ডেক্স.এক্সএমএল এর "ডিসপ্লেআরিয়া" এবং "সরবরাহকারী" এর অর্থ কী?


উত্তর:


22

কি বোঝার জন্য checkoutProviderএবং displayArea, আপনাকে প্রথমে সুযোগ আপনি খুঁজছি হয় বুঝতে হবে: jsLayout

jsLayoutচেকআউট পৃষ্ঠায় জাভাস্ক্রিপ্ট ইউআই উপাদানগুলির জন্য জাভাস্ক্রিপ্ট কনফিগারেশনের একটি গুচ্ছ। আপনি যদি তাকান module-checkout/view/frontend/templates/onepage.phtml, আপনি নিম্নলিখিত x-magento-init-Data লক্ষ্য করবেন:

<script type="text/x-magento-init">
    {
        "#checkout": {
            "Magento_Ui/js/core/app": <?php /* @escapeNotVerified */ echo $block->getJsLayout();?>
        }
    }
</script>

এটা সব শুরু হয় এই যেখানে। এতে বলা হয়েছে:

উপাদানটির জন্য #checkout, Magento_Ui/js/core/appনিম্নলিখিত তথ্যের সাহায্যে কম্পোনেন্টটি আরম্ভ করুন: ...

এবং এটি প্রাপ্ত তথ্য হ'ল এক্সএমএল লেআউটে তৈরি তথ্য jsLayout। এখন, এর অর্থ এই যে সবকিছু আপনার XML- এর এখন মাধ্যমে প্রেরণ করা হয় Magento_Ui/js/core/app-component (প্লাগিন যাব ও লেআউট প্রসেসর এবং স্টাফ মুহূর্ত জন্য সমীকরণ থেকে বের ...)

এখন, আমি কীভাবে module-ui/view/base/web/js/core/app.jsসমস্ত কিছুকে সিদ্ধ করে ফেলার বিষয়ে বিশদে ডুব দিতে যাচ্ছি না , কারণ এটি এই পোস্টটি খুব দীর্ঘায়িত করবে তবে সংক্ষিপ্তসারটি হ'ল:

  • Magento_Ui/js/core/app-Component একটি সৃষ্টি checkout-component।
  • এটি এই ধরণের একটি উপাদান হবে uiComponent(এটি একটি খুব জেনেরিক উপাদান যা আপনার নিজস্ব কাস্টম UI উপাদানগুলি স্থগিত করতে ব্যবহার করা যেতে পারে It এটি বেসিক নকআউট টেম্পলেট রেন্ডারিং এবং স্টাফ সহ আসে)।
  • এটি আমাদের টেমপ্লেট হবে Magento_Checkout/web/frontend/template/onepage.html
  • এটি বিভিন্ন শিশু তৈরি করবে (নাম দিয়ে errors, estimation, steps, ইত্যাদি ...)
  • steps-Child একটি হতে হবে uiComponent
  • এই চক্রটি অব্যাহত রয়েছে ... কনফিগারেশনটি বিভিন্ন পরামিতি সহ শিশুদের তৈরি করে।

এখন আপনার displayAreaএবং- providerপ্রশ্নে উঠার জন্য: উপরে আপনি যেমনটি দেখেছেন, সবকিছু জাভাস্ক্রিপ্ট ক্লাসে মানচিত্র করে। আমরা প্রথমবারের ব্যবহারটি দেখি displayAreaযখন আমরা- stepsকম্পোনেন্ট তৈরি করি, যা প্রকারের uiComponent। সুতরাং uiComponentএর ব্যবহার সন্ধান করার জন্য একটি যৌক্তিক প্রার্থী হবে displayArea

এখন, uiComponentএ ধরণের জাভাস্ক্রিপ্ট শ্রেণি Magento_Ui/js/lib/core/collection। (আপনি এটি সন্ধান করতে পারেন module-ui/view/base/requirejs-config.js)। এই মানচিত্র module-ui/view/base/web/js/lib/core/collection.js। এখানে আমরা নিম্নলিখিত ব্যবহার দেখতে পাচ্ছি:

/**
 * Synchronizes multiple elements arrays with a core '_elems' container.
 * Performs elemets grouping by theirs 'displayArea' property.
 * @private
 *
 * @returns {Collection} Chainable.
 */
_updateCollection: function () {
    var _elems = compact(this._elems),
        grouped;

    grouped = _elems.filter(function (elem) {
        return elem.displayArea && _.isString(elem.displayArea);
    });
    grouped = _.groupBy(grouped, 'displayArea');

    _.each(grouped, this.updateRegion, this);

    this.elems(_elems);

    return this;
},

সুতরাং এটি কার্যকরভাবে কী করে, এটি ইউআই উপাদানগুলির একটি নির্দিষ্ট গোষ্ঠীতে একটি uiComp घटक 'মানচিত্র' করে। এটি জেনে রাখা জরুরী, কারণ এটি এক্সআইএমএল লেআউটটিকে ঠিকঠাক করেই ইউআই উপাদানগুলিকে বিন্যাসের অন্যান্য স্থানে সরিয়ে নিতে দেয়, ঠিক যেমন আপনি phtmlসার্ভার-সাইড রেন্ডার করা টেম্পলেটগুলির সাহায্যে এটি করেন। কেবলমাত্র ওভাররাইড করুন displayAreaএবং আপনি যে কোনও জাভাস্ক্রিপ্ট ইউআই কম্পোনেন্টকে অন্য কোথাও রেন্ডার করতে পারেন (লক্ষ্য অঞ্চলটি কোথাও রেন্ডার করা হয়েছে)।

এখন আপনার দ্বিতীয় প্রশ্নের জন্য: provider। ঠিক যেমন আমরা সন্ধান করেছি displayArea, আমাদের প্রথমে ইউআই কম্পোনেন্টটি দেখা শুরু করা উচিত, যা Magento_Checkout/js/view/form/element/email। এবং যদি আমরা এর দিকে তাকাই requirejs-config.js, আমরা শেষ পর্যন্ত খুঁজে পাই module-checkout/view/frontend/web/js/view/form/element/email.js

কিন্তু ... providerএই ক্লাসে কোনও ব্যবহার হয় না। সুতরাং আসুন আমরা কেবল শ্রেণীর মধ্যে এটি প্রসারিত কিছু খুঁজে পেতে পারি কিনা তা দেখতে দিন: Component(যা আমাদের uiComponentক্লাস আবার)।

তবে ... না provider। ঠিক আছে, uiComponentকেবল প্রসারিত হয় Element(যা এখানে অবস্থিত module-ui/view/base/web/js/lib/core/element/element.js), সুতরাং আসুন কেবল সেখানে দেখুন:

/**
 * Parses 'modules' object and creates
 * async wrappers for specified components.
 *
 * @returns {Element} Chainable.
 */
initModules: function () {
    _.each(this.modules, function (name, property) {
        if (name) {
            this[property] = this.requestModule(name);
        }
    }, this);

    if (!_.isFunction(this.source)) {
        this.source = registry.get(this.provider);
    }

    return this;
},

বিঙ্গো! দেখা যাচ্ছে যে সরবরাহকারীর কাছ থেকে ডেটা আনতে উত্স হিসাবে ব্যবহৃত হয়। যদি আমরা এর নির্মাণকারীর দিকে নজর রাখি তবে Elementআপনি দেখতে পাবেন যে এটি ডিফল্টরূপে এটি খালি হয়ে গেছে:

provider: '',

সুতরাং আমাদের কনফিগারেশন ফিরে। আমরা যদি এখন আমাদের কনফিগারেশনটি পড়ি, আমরা বুঝতে পারি যে আইটেমটি shippingAddressএকটি উপাদান Magento_Checkout/js/view/shipping, এটি থেকে ডেটা এনেছে checkoutProvider

যাতে আমাদের দুটি প্রশ্ন রেখে যায়:

  1. checkoutProviderসংজ্ঞায়িত কোথায় ?
  2. এটি শিপিং জাভাস্ক্রিপ্টে কীভাবে ব্যবহৃত হয়?

ঠিক আছে, আপনি যদি নীচে স্ক্রোল করেন তবে checkout_index_index.xmlআপনি লক্ষ্য করবেন যে এটি কোনও ভ্যানিলা ছাড়া আর কিছু নয় uiComponent:

<item name="checkoutProvider" xsi:type="array">
    <item name="component" xsi:type="string">uiComponent</item>
</item>

এবং যদি আপনি তাকান module-checkout/view/frontend/web/js/view/shipping.js, আপনি দেখতে পাবেন যে এটি এরকম ব্যবহৃত হয়:

registry.async('checkoutProvider')(function (checkoutProvider) {
    var shippingAddressData = checkoutData.getShippingAddressFromData();

    if (shippingAddressData) {
        checkoutProvider.set(
            'shippingAddress',
            $.extend({}, checkoutProvider.get('shippingAddress'), shippingAddressData)
        );
    }
    checkoutProvider.on('shippingAddress', function (shippingAddressData) {
        checkoutData.setShippingAddressFromData(shippingAddressData);
    });
});

সত্যি কথা বলতে: এখান থেকেই আমার বিশ্লেষণ থেমে গেছে, কারণ যা চলছে তা অনুসন্ধান করা এবং বিনিয়োগ করা আমার পক্ষে কঠিন হয়ে পড়ে, তবে আমি আশা করি যে অন্য কেউ এটিকে এখানে থেকে বেছে নিতে পারে ...

আমি জানি যে এটি registry.async()একটি পদ্ধতিতে ফিরে আসার সাথে কিছু করার আছে যা তাত্ক্ষণিকভাবে একটি কলব্যাক ফাংশন দিয়ে তাত্ক্ষণিকভাবে কার্যকর করা হয়, তবে অন্য কাউকে এটি ব্যাখ্যা করার প্রয়োজন ...


* অস্বীকৃতি: সর্বদা, আমি ভুল হলে দয়া করে আমাকে সংশোধন করুন! বাস্তবের জন্য উপরেরগুলির কোনও চেষ্টা করে দেখেনি, তবে আমি প্রায় বছর ধরে ম্যাজেন্টো 2 এর সাথে কাজ করছি এবং আমি বিশ্বাস করি এটি এটি কীভাবে কাজ করে। দুর্ভাগ্যক্রমে আপনি যদি ম্যাজেন্টো মহাসাগরের নীচে ডুব দিতে চান তবে খুব বেশি ডকুমেন্টেশন নেই।


2
তাহলে ডিসপ্লেআরিয়া কী?
মারিওন জেকেকে এডাজ

1
এটি উজ্জ্বল বিশ্লেষণ, আপনি কি আরও একটি বোঝার বিকাশ করেছেন?
এলএম_ফিল্ডিং

11

আমার আসল উত্তরের 6 মাস পরে আমি মনে করি আমি কী displayAreaতা থেকে আরও ভাল উত্তর দিতে পারি ।

আমার বোধগম্যতার মধ্যে, getTemplate()এগুলি সবই নকআউটস' - স্মৃতিবিজড়িত, দ্য- getRegion()মডেল এবং ইউআই উপাদানগুলির শিশুদের সাথে একত্রিত হয় । এর একটি ভাল উদাহরণ দেখা যাবে যখন আপনি পরীক্ষা করছেন vendor/magento/module-checkout/view/frontend/templates/registration.phtmlএবং vendor/magento/module-checkout/view/frontend/web/template/registration.html

ইন registration.phtml, আপনি একটি ডিফল্ট ম্যাজেন্টো ইউআই উপাদান দেখতে পাবেন যার সন্তান রয়েছে:

<script type="text/x-magento-init">
    {
        "#registration": {
            "Magento_Ui/js/core/app": {
               "components": {
                    "registration": {
                        "component": "Magento_Checkout/js/view/registration",
                        "config": {
                            "registrationUrl": "<?php /* @escapeNotVerified */ echo $block->getCreateAccountUrl(); ?>",
                            "email": "<?php /* @escapeNotVerified */ echo $block->getEmailAddress(); ?>"
                        },
                        "children": {
                            "errors": {
                                "component": "Magento_Ui/js/view/messages",
                                "sortOrder": 0,
                                "displayArea": "messages",
                                "config": {
                                    "autoHideTimeOut": -1
                                 }
                            }
                        }
                    }
                }
            }
        }
    }
</script>

উল্লেখ্য ব্যবহার displayAreaমধ্যে children-node। মূলত, এটি নকআউটকে বলে যে এই শিশু উপাদানটিকে 'বার্তা' নামক অঞ্চলে রেন্ডার করা উচিত ।

এখন এর শীর্ষে একবার দেখুন registration.html:

<!-- ko foreach: getRegion('messages') -->
    <!-- ko template: getTemplate() --><!-- /ko -->
<!--/ko-->

নকআউট কোডের এই লাইনটি মূলত যা করে তা হ'ল: এটি সমস্ত বাচ্চার উপাদানগুলির উপরে পুনরাবৃত্তি করে যা প্রদর্শনআরিয়া'র বার্তাগুলিতে উপস্থিত থাকে এবং তাদের রেন্ডার করে।

মূলত, যদি আপনি আমাকে জিজ্ঞাসা করেন তবে নামকরণটি কিছুটা বিভ্রান্তিকর। আপনি কেন এক জায়গায় 'ডিসপ্লেআরিয়া ' এবং অন্য জায়গায় 'অঞ্চল' ব্যবহার করবেন ? তবে সম্ভবত আমার ধারণা সম্পূর্ণ ভুল। সম্ভবত কোনও ম্যাজেন্টো কোর বিকাশকারী এতে আরও কিছুটা আলোকিত করতে পারেন?


1
এটাই আমাকে এত দিন বিভ্রান্ত করেছে, আমি দেখছি getRegionএবং আমার মন কেবল প্ররোচিত। উভয় জবাবের জন্য আপনাকে ধন্যবাদ, খুব সহায়ক!
বেন ক্রুক

1
ঠিক আছে, এটি আমার 2 সেন্ট মাত্র। আমি আশা করি মূল বিকাশকারীদের কেউ এই বিষয়ে কিছু আলো ভাগ করতে পারেন। ম্যাজেন্টো 2 এর গভীরতর অভ্যন্তরগুলি এবং বিশেষত পুরো নকআউট / এক্সএইচআর বাস্তবায়ন এমন কিছু যা এতদূর ভাল ডকুমেন্টেড হয় নি।
জিল বার্কার্স

2
সম্মত হন, যদি না আপনি মূল ফাইলগুলির মধ্যে অনেকগুলি অনুসন্ধান করেন তবে এই স্ট্যাক এক্সচেঞ্জ ব্যতীত অন্য কোন উপায় নেই যে কী ঘটছে তা জানার জন্য।
বেন ক্রুক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.