ترقية شبكة Magento 2 القياسية باستخدام مكونات واجهة المستخدم (الجزء 2)

نشرت: 2016-10-18

في المقالة السابقة ، وصفنا كيفية إنشاء وحدة مع الشروط الأساسية والواجهة التي ستتيح لنا العمل معها. أثناء عملية الإنشاء استخدمنا كتل Magento القياسية. ومع ذلك ، فإن Magento 2 قادر على فعل الكثير.

أنا أتحدث عن إمكانية تحسين الواجهة بمساعدة مكونات واجهة المستخدم. تتم إضافة هذه المكونات مع وحدة Magento / UI.

* على الرغم من إمكانية العثور على هذه المكونات في الإصدار 2.0 ، فإننا نوصيك بشدة باستخدام الإصدار 2.1.

من هذه المقالة ، ستتعلم كيفية إعادة إنشاء الشبكة القياسية (الموجودة في التخطيط: app / code / Vendor / Rules / view / adminhtml / layout / vendor_rules_example_rule_index.xml ) وإثرائها بمكونات واجهة المستخدم.

قارن فقط. هذه شبكة قديمة:

ماجنتو 2 شبكة

بواحد جديد ، مصنوع من مكونات UX:

783ee65384ceff9f3e875c61c792cac2

كما ترى ، فإن الشبكة التي تمت ترقيتها ستكون أكثر سهولة في الاستخدام وموفرة للوقت ، وأسهل في القياس ، ولديها الكثير من الميزات الإضافية الرائعة (مثل الإشارات المرجعية القادرة على حفظ حالة الشبكة الحالية) وتعيين المرشحات الذكية.

دعنا نبدأ.

أولاً ، تحتاج إلى إجراء بعض التغييرات في الوحدة. فيما يلي كيفية القيام بذلك:

1) إنشاء ملف جديد للإعلان عن المكونات الضرورية:

 > app / code / Vendor / Rules / etc / di.xml 
 <؟ xml version = "1.0"؟>
    <config xmlns: xsi = "https://www.w3.org/2001/XMLSchema-instance" xsi: noNamespaceSchemaLocation = "urn: magento: framework: ObjectManager / etc / config.xsd">
        <virtualType name = "VendorRulesRuleGridDataProvider" type = "Magento \ Framework \ View \ Element \ UiComponent \ DataProvider \ DataProvider">
            <الحجج>
                <اسم الوسيطة = "collection" xsi: type = "object" shared = "false"> البائع \ القواعد \ النموذج \ ResourceModel \ Rule \ Collection </argument>
                <اسم الوسيطة = "filterPool" xsi: type = "object" shared = "false"> VendorRulesRuleGridFilterPool </argument>
            </ الحجج>
        </virtualType>
        <virtualType name = "VendorRulesRuleGridFilterPool" type = "Magento \ Framework \ View \ Element \ UiComponent \ DataProvider \ FilterPool">
            <الحجج>
                <اسم الوسيطة = "appliers" xsi: type = "array">
                    <item name = "normal" xsi: type = "object"> Magento \ Framework \ View \ Element \ UiComponent \ DataProvider \ RegularFilter </item>
                    <item name = "fulltext" xsi: type = "object"> Magento \ Framework \ View \ Element \ UiComponent \ DataProvider \ FulltextFilter </item>
                </argument>
            </ الحجج>
        </virtualType>
        <type name = "Vendor \ Rules \ Model \ ResourceModel \ Rule \ Grid \ Collection">
            <الحجج>
                <اسم الوسيطة = "mainTable" xsi: type = "string"> vendor_rules </argument>
                <اسم الوسيطة = "eventPrefix" xsi: type = "string"> vendor_rules_rule_grid_collection </argument>
                <اسم الوسيطة = "eventObject" xsi: type = "string"> rule_grid_collection </argument>
                <اسم الوسيطة = "ResourceModel" xsi: type = "string"> البائع \ القواعد \ النموذج \ ResourceModel \ Rule </argument>
            </ الحجج>
        </type>
        <type name = "Magento \ Framework \ View \ Element \ UiComponent \ DataProvider \ CollectionFactory">
            <الحجج>
                <اسم الوسيطة = "مجموعات" xsi: type = "array">
                    <item name = "vendor_rules_rule_listing_data_source" xsi: type = "string"> البائع \ القواعد \ النموذج \ ResourceModel \ Rule \ Grid \ Collection </item>
                </argument>
            </ الحجج>
        </type>
    </config>

VendorRulesRuleGridDataProvide - يوفر هذا النوع الظاهري بيانات لشبكة قواعد واجهة المستخدم. يضيف VendorRulesRuleGridFilterPool بدوره وظيفة تصفية تتيح لك إضافة / تعديل أي عوامل تصفية موجودة.

ملاحظة ، لجعل الشبكة تعمل بشكل صحيح مع هذه المجموعة المعينة ، تحتاج إلى إضافتها إلى قائمة جميع المجموعات المتاحة. للقيام بذلك ، أضف vendor_rules_rule_listing_data_source مع فئة المجموعة القائمة على القيمة: Vendor \ Rules \ Model \ ResourceModel \ Rule \ Grid \ Collection إلى Magento \ Framework \ View \ Element \ UiComponent \ DataProvider \ CollectionFactory groups.

2) بالنسبة لشبكة UI ، نحتاج إلى مجموعة منفصلة تمثل واجهة `Magento \ Framework \ Api \ Search \ SearchResultInterface` .

يحتوي على الطرق القياسية التي ستتيح لك العمل مع الشبكة والفلاتر. يمكن تخصيص هذا الفصل وفقًا لاحتياجاتك الشخصية عن طريق تغيير طريقة عمل البحث بالمجموعات .

 > app / code / Vendor / Rules / Model / ResourceModel / Rule / Grid / Collection.php
 <؟ php

    Vendor \ Rules \ Model \ ResourceModel \ Rule \ Grid؛

    استخدام Vendor \ Rules \ Model \ ResourceModel \ Rule \ Collection كـ RuleCollection ؛
    استخدم Magento \ Framework \ Api \ Search \ SearchResultInterface ؛
    استخدم Magento \ Framework \ Api \ SearchCriteriaInterface ؛
    استخدم Magento \ Framework \ Data \ Collection \ Db \ FetchStrategyInterface ؛
    استخدم Magento \ Framework \ Data \ Collection \ EntityFactory ؛
    استخدام Magento \ Framework \ Event \ ManagerInterface ؛
    استخدم Magento \ Framework \ Model \ ResourceModel \ Db \ AbstractDb ؛
    استخدام Psr \ Log \ LoggerInterface ؛

    تقوم مجموعة فئة بتوسيع RuleCollection بتنفيذ SearchResultInterface
    {
        / **
         * التجمعات
         *
         *var \ Magento \ Framework \ Search \ AggregationInterface
         * /
        التجميعات المحمية بالدولار الأمريكي ؛

        / **
         * البناء
         *
         *param \ Magento \ Framework \ Data \ Collection \ EntityFactory $ elementFactory
         *param \ Psr \ Log \ LoggerInterface $ logger
         *param \ Magento \ Framework \ Data \ Collection \ Db \ FetchStrategyInterface $ fetchStrategy
         *param \ Magento \ Framework \ Event \ ManagerInterface $ eventManager
         *param $ mainTable
         *param $ eventPrefix
         *param $ eventObject
         *param $ ResourceModel
         *param $ model
         *param $ connection
         *param \ Magento \ Framework \ Model \ ResourceModel \ Db \ AbstractDb $ Resource
         * /
        الوظيفة العامة __construct (
            EntityFactory $ كيان مصنع ،
            مسجل LoggerInterface $ ،
            FetchStrategyInterface $ fetchStrategy ،
            ManagerInterface $ eventManager ،
            $ mainTable،
            eventPrefix $ ،
            eventObject ،
            نموذج $ ResourceModel ،
            $ model = 'Magento \ Framework \ View \ Element \ UiComponent \ DataProvider \ Document'،
            اتصال $ = لا شيء ،
            AbstractDb $ Resource = خالية
        ) {
            الأصل :: __ build ($ elementFactory ، $ logger ، $ fetchStrategy ، $ eventManager ، $ connection ، $ Resource) ؛
            $ this -> _ eventPrefix = $ eventPrefix ؛
            $ this -> _ eventObject = $ eventObject ؛
            $ this -> _ init ($ model، $ resourcesModel)؛
            $ this-> setMainTable ($ mainTable) ؛
        }

        / **
         *return \ Magento \ Framework \ Search \ AggregationInterface
         * /
        getAggregations وظيفة عامة ()
        {
            إرجاع $ this-> التجميعات ؛
        }

        / **
         *param \ Magento \ Framework \ Search \ AggregationInterface $ تجميعات
         *return $ هذا
         * /
        مجموعة الوظائف العامة: التجميعات (التجميعات بالدولار الأمريكي)
        {
            $ this-> التجميعات = التجميعات بالدولار الأمريكي ؛
        }

        / **
         * استرجاع جميع المعرفات للتحصيل
         * التوافق مع الإصدارات السابقة مع مجموعة EAV
         *
         *param int $ حد
         *param int $ offset
         *return مجموعة
         * /
        getAllIds الوظيفة العامة ($ limit = null، $ offset = null)
        {
            إرجاع $ this-> getConnection () -> fetchCol ($ this -> _ getAllIdsSelect ($ limit، $ offset)، $ this -> _ bindParams) ؛
        }

        / **
         * احصل على معايير البحث.
         *
         *return \ Magento \ Framework \ Api \ SearchCriteriaInterface | فارغة
         * /
        getSearchCriteria () الوظيفة العامة
        {
            عودة فارغة ؛
        }

        / **
         * تعيين معايير البحث.
         *
         *param \ Magento \ Framework \ Api \ SearchCriteriaInterface $ searchCriteria
         *return $ هذا
         *SuppressWarnings (PHPMD.UnusedFormalParameter)
         * /
        تعيين الوظيفة العامة (SearchCriteriaInterface $ searchCriteria = خالية)
        {
            إرجاع $ هذا ؛
        }

        / **
         * احصل على العدد الإجمالي.
         *
         *return int
         * /
        وظيفة عامة getTotalCount ()
        {
            إرجاع $ this-> getSize ()؛
        }

        / **
         * تعيين العدد الإجمالي.
         *
         *param int $ totalCount
         *return $ هذا
         *SuppressWarnings (PHPMD.UnusedFormalParameter)
         * /
        تعيين الوظيفة العامة توتالكونت ($ totalCount)
        {
            إرجاع $ هذا ؛
        }

        / **
         * قائمة مجموعة العناصر.
         *
         *param \ Magento \ Framework \ Api \ ExtensibleDataInterface [] $ items
         *return $ هذا
         *SuppressWarnings (PHPMD.UnusedFormalParameter)
         * /
        مجموعة الوظائف العامة (مجموعة عناصر $ = خالية)
        {
            إرجاع $ هذا ؛
        }
    }

    ؟>

3) قم بتعديل المجموعة الرئيسية بالطريقة الموضحة أدناه (من المهم ، حيث أن مجموعتنا المخصصة موروثة منها). يجب عليك إجراء التغييرات التالية:

 > app / code / Vendor / Rules / Model / ResourceModel / Rule / Collection.php 
 <؟ php

    بائع مساحة الاسم \ Rules \ Model \ ResourceModel \ Rule ؛

    تمتد مجموعة الفئة \ Magento \ Rule \ Model \ ResourceModel \ Rule \ Collection \ AbstractCollection
    {
        / **
         * تعيين نموذج الموارد وتحديد مجال التعيين
         *
         *return الفراغ
         * /
        وظيفة محمية _construct ()
        {
            $ this -> _ init ('Vendor \ Rules \ Model \ Rule'، 'Vendor \ Rules \ Model \ ResourceModel \ Rule')؛
        }

        / **
         * جمع عامل التصفية حسب التاريخ المحدد.
         * جمع عامل التصفية إلى القواعد النشطة فقط.
         *
         * سلسلةparam | خالية $ الآن
         *use $ this-> addStoreGroupDateFilter ()
         *return $ هذا
         * /
        تعيين الوظيفة العامة setValidationFilter ($ now = null)
        {
            إذا (! $ this-> getFlag ('validation_filter')) {
                $ this-> addDateFilter ($ الآن)؛
                $ this-> addIsActiveFilter ()؛
                $ this-> setOrder ('sort_order'، self :: SORT_ORDER_DESC)؛
                $ this-> setFlag ('validation_filter'، true)؛
            }

            إرجاع $ هذا ؛
        }

        / **
         * من تاريخ أو حتى تاريخ التصفية
         *
         *param $ الآن
         *return $ هذا
         * /
        addDateFilter الوظيفة العامة ($ now)
        {
            $ this-> getSelect () -> أين (
                "from_date فارغ أو from_date <=؟" ،
                $ الآن
            ) -> أين (
                'to_date فارغ أو to_date> =؟'،
                $ الآن
            ) ؛

            إرجاع $ هذا ؛
        }
    }

    ؟>

4) بعد ذلك ، قم بإزالة الترميز القديم من تخطيط الشبكة وإضافة قائمة واجهة المستخدم هناك:

 > app / code / Vendor / Rules / view / adminhtml / layout / vendor_rules_example_rule_index.xml 
 <؟ xml version = "1.0"؟>
    <page xmlns: xsi = "https://www.w3.org/2001/XMLSchema-instance" xsi: noNamespaceSchemaLocation = "urn: magento: framework: View / Layout / etc / page_configuration.xsd">
        <الجسم>
        <اسم referenceBlock = "القائمة">
            <طريقة الإجراء = "setActive">
                <اسم الوسيطة = "itemId" xsi: type = "string"> قواعد_المورد :: vendor_rules </argument>
            </action>
        </referenceBlock>
        <referenceBlock name = "page.title">
            <طريقة الإجراء = "setTitleClass">
                <اسم الوسيطة = "class" xsi: type = "string"> معقد </ الوسيطة>
            </action>
        </referenceBlock>
        <referenceContainer name = "content">
            <uiComponent name = "vendor_rules_rule_listing" />
        </referenceContainer>
        </body>
    </page>

في الأساس ، نضيف فقط " vendor_rules_rule_listing " المذكورة في محتوى الصفحة (الإجراء الرئيسي) ، ونغير حالة قائمة منتجاتنا إلى "نشطة" ، وقم بتعيين فئة العنوان.

5) في الخطوة التالية ، نقوم بصندوق قائمة واجهة المستخدم ، والتي سيتم وضعها هنا:

 > app / code / Vendor / Rules / view / adminhtml / ui_component / vendor_rules_rule_listing.xml 
 <؟ xml version = "1.0"؟>
    <إدراج xmlns: xsi = "https://www.w3.org/2001/XMLSchema-instance" xsi: noNamespaceSchemaLocation = "urn: magento: framework: Ui / etc / ui_configuration.xsd">
        <اسم الوسيطة = "data" xsi: type = "array">
            <item name = "js_config" xsi: type = "array">
                <item name = "provider" xsi: type = "string"> vendor_rules_rule_listing.vendor_rules_rule_listing_data_source </item>
                <item name = "deps" xsi: type = "string"> vendor_rules_rule_listing.vendor_rules_rule_listing_data_source </item>
            </item>
            <item name = "spinner" xsi: type = "string"> vendor_rules_rule_columns </item>
            <اسم العنصر = "أزرار" xsi: type = "array">
                <اسم العنصر = "إضافة" xsi: type = "array">
                    <item name = "name" xsi: type = "string"> إضافة </item>
                    <item name = "label" xsi: type = "string" translate = "true"> إضافة قاعدة جديدة </ item
                    <item name = "class" xsi: type = "string"> أساسي </item>
                    <item name = "url" xsi: type = "string"> * / * / newaction </item>
                </item>
            </item>
        </argument>
        <dataSource name = "vendor_rules_rule_listing_data_source">
            <اسم الوسيطة = "dataProvider" xsi: type = "configurableObject">
                <اسم الوسيطة = "class" xsi: type = "string"> VendorRulesRuleGridDataProvider </argument>
                <اسم الوسيطة = "name" xsi: type = "string"> vendor_rules_rule_listing_data_source </argument>
                <اسم الوسيطة = "primaryFieldName" xsi: type = "string"> rule_id </argument>
                <اسم الوسيطة = "requestFieldName" xsi: type = "string"> rule_id </argument>
                <اسم الوسيطة = "data" xsi: type = "array">
                    <اسم العنصر = "config" xsi: type = "array">
                        <item name = "update_url" xsi: type = "url" path = "mui / index / render" />
                    </item>
                </argument>
            </argument>
            <اسم الوسيطة = "data" xsi: type = "array">
                <item name = "js_config" xsi: type = "array">
                    <item name = "component" xsi: type = "string"> Magento_Ui / js / Grid / Provider </item>
                </item>
            </argument>
        </dataSource>
        <اسم الحاوية = "List_top">
            <اسم الوسيطة = "data" xsi: type = "array">
                <اسم العنصر = "config" xsi: type = "array">
                    <item name = "template" xsi: type = "string"> ui / grid / toolbar </item>
                    <item name = "stickyTmpl" xsi: type = "string"> ui / grid / sticky / toolbar </item>
                </item>
            </argument>
            <اسم الإشارة المرجعية = "الإشارات المرجعية">
                <اسم الوسيطة = "data" xsi: type = "array">
                    <اسم العنصر = "config" xsi: type = "array">
                        <item name = "storageConfig" xsi: type = "array">
                            <item name = "namespace" xsi: type = "string"> vendor_rules_rule_listing </item>
                        </item>
                    </item>
                </argument>
            </bookmark>
            <اسم المكون = "عمود_التحكم">
                <اسم الوسيطة = "data" xsi: type = "array">
                    <اسم العنصر = "config" xsi: type = "array">
                        <اسم العنصر = "أعمدة البيانات" xsi: type = "array">
                            <item name = "provider" xsi: type = "string"> vendor_rules_rule_listing.vendor_rules_rule_listing.vendor_rules_rule_columns </item>
                        </item>
                        <item name = "component" xsi: type = "string"> Magento_Ui / js / grid / controls / أعمدة </item>
                        <item name = "displayArea" xsi: type = "string"> dataGridActions </item>
                    </item>
                </argument>
            </component>
            <اسم المرشحات = "list_filters">
                <اسم الوسيطة = "data" xsi: type = "array">
                    <اسم العنصر = "config" xsi: type = "array">
                        <item name = "columnProvider" xsi: type = "string"> vendor_rules_rule_listing.vendor_rules_rule_listing.vendor_rules_rule_columns </item>
                        <item name = "storageConfig" xsi: type = "array">
                            <item name = "provider" xsi: type = "string"> vendor_rules_rule_listing.vendor_rules_rule_listing.listing_top.bookmarks </item>
                            <item name = "namespace" xsi: type = "string"> current.filters </item>
                        </item>
                        <اسم العنصر = "قوالب" xsi: type = "array">
                            <اسم العنصر = "عوامل التصفية" xsi: type = "array">
                                <اسم العنصر = "حدد" xsi: type = "array">
                                    <item name = "component" xsi: type = "string"> Magento_Ui / js / form / element / ui-select </item>
                                    <item name = "template" xsi: type = "string"> واجهة المستخدم / الشبكة / الفلاتر / العناصر / ui-select </item>
                                </item>
                            </item>
                        </item>
                        <item name = "childDefaults" xsi: type = "array">
                            <item name = "provider" xsi: type = "string"> vendor_rules_rule_listing.vendor_rules_rule_listing.listing_top.listing_filters </item>
                            <اسم العنصر = "يستورد" xsi: type = "array">
                                <item name = "visual" xsi: type = "string"> vendor_rules_rule_listing.vendor_rules_rule_listing.vendor_rules_rule_columns. $ {$ .index}: مرئية </item>
                            </item>
                        </item>
                    </item>
                    <item name = "Observers" xsi: type = "array">
                        <item name = "column" xsi: type = "string"> عمود </item>
                    </item>
                </argument>
            </filters>
            <اسم الصفحة = "list_paging">
                <اسم الوسيطة = "data" xsi: type = "array">
                    <اسم العنصر = "config" xsi: type = "array">
                        <item name = "storageConfig" xsi: type = "array">
                            <item name = "provider" xsi: type = "string"> vendor_rules_rule_listing.vendor_rules_rule_listing.listing_top.bookmarks </item>
                            <item name = "namespace" xsi: type = "string"> current.paging </item>
                        </item>
                        <item name = "selectProvider" xsi: type = "string"> vendor_rules_rule_listing.vendor_rules_rule_listing.vendor_rules_rule_columns.ids </item>
                    </item>
                </argument>
            </paging>
        </container>
        <اسم الأعمدة = "vendor_rules_rule_columns">
            <اسم الوسيطة = "data" xsi: type = "array">
                <اسم العنصر = "config" xsi: type = "array">
                    <item name = "storageConfig" xsi: type = "array">
                        <item name = "provider" xsi: type = "string"> vendor_rules_rule_listing.vendor_rules_rule_listing.listing_top.bookmarks </item>
                        <item name = "namespace" xsi: type = "string"> الحالي </item>
                    </item>
                </item>
            </argument>
            <selectionsColumn name = "ids">
                <اسم الوسيطة = "data" xsi: type = "array">
                    <اسم العنصر = "config" xsi: type = "array">
                        <item name = "resizeEnabled" xsi: type = "boolean"> خطأ </item>
                        <item name = "resizeDefaultWidth" xsi: type = "string"> 55 </item>
                        <item name = "indexField" xsi: type = "string"> rule_id </item>
                    </item>
                </argument>
            </selectionsColumn>
            <اسم العمود = "rule_id">
                <اسم الوسيطة = "data" xsi: type = "array">
                    <item name = "js_config" xsi: type = "array">
                        <item name = "component" xsi: type = "string"> Magento_Ui / js / grid / عمود / عمود </item>
                    </item>
                    <اسم العنصر = "config" xsi: type = "array">
                        <item name = "filter" xsi: type = "string"> textRange </item>
                        <item name = "dataType" xsi: type = "string"> نص </item>
                        <item name = "sorting" xsi: type = "string"> تصاعدي </item>
                        <item name = "align" xsi: type = "string"> يسار </item>
                        <item name = "label" xsi: type = "string" translate = "true"> ID </item>
                        <item name = "sortOrder" xsi: type = "number"> 1 </item>
                    </item>
                </argument>
            </column>
            <اسم العمود = "الاسم">
                <اسم الوسيطة = "data" xsi: type = "array">
                    <item name = "js_config" xsi: type = "array">
                        <item name = "component" xsi: type = "string"> Magento_Ui / js / grid / عمود / عمود </item>
                    </item>
                    <اسم العنصر = "config" xsi: type = "array">
                        <item name = "filter" xsi: type = "string"> نص </item>
                        <item name = "dataType" xsi: type = "string"> نص </item>
                        <item name = "align" xsi: type = "string"> يسار </item>
                        <item name = "label" xsi: type = "string" translate = "true"> الاسم </item>
                    </item>
                </argument>
            </column>
            <اسم العمود = "is_active">
                <اسم الوسيطة = "data" xsi: type = "array">
                    <item name = "options" xsi: type = "array">
                        <item name = "active" xsi: type = "array">
                            <item name = "value" xsi: type = "string"> 1 </item>
                            <item name = "label" xsi: type = "string" translate = "true"> نشطة </item>
                        </item>
                        <item name = "inactive" xsi: type = "array">
                            <item name = "value" xsi: type = "string"> 0 </item>
                            <item name = "label" xsi: type = "string" translate = "true"> غير نشط </ em>
                        </item>
                    </item>
                    <اسم العنصر = "config" xsi: type = "array">
                        <item name = "filter" xsi: type = "string"> حدد </item>
                        <item name = "component" xsi: type = "string"> Magento_Ui / js / grid / عمود / حدد </item>
                        <item name = "editor" xsi: type = "string"> حدد </item>
                        <item name = "dataType" xsi: type = "string"> حدد </item>
                        <item name = "label" xsi: type = "string" translate = "true"> نشط </ em>
                        <item name = "sortOrder" xsi: type = "number"> 65 </item>
                    </item>
                </argument>
            </column>
            <اسم العمود = "sort_order">
                <اسم الوسيطة = "data" xsi: type = "array">
                    <item name = "js_config" xsi: type = "array">
                        <item name = "component" xsi: type = "string"> Magento_Ui / js / grid / عمود / عمود </item>
                    </item>
                    <اسم العنصر = "config" xsi: type = "array">
                        <item name = "filter" xsi: type = "string"> نص </item>
                        <item name = "dataType" xsi: type = "string"> number </item>
                        <item name = "align" xsi: type = "string"> يسار </item>
                        <item name = "label" xsi: type = "string" translate = "true"> الأولوية </item>
                    </item>
                </argument>
            </column>
            <اسم العمود = "from_date" class = "Magento \ Ui \ Component \ List \ Columns \ Date">
                <اسم الوسيطة = "data" xsi: type = "array">
                    <اسم العنصر = "config" xsi: type = "array">
                        <item name = "sorting" xsi: type = "string"> وصف </ em>
                        <item name = "filter" xsi: type = "string"> dateRange </item>
                        <item name = "dataType" xsi: type = "string"> التاريخ </item>
                        <item name = "component" xsi: type = "string"> Magento_Ui / js / grid / الأعمدة / التاريخ </item>
                        <item name = "label" xsi: type = "string" translate = "true"> ابدأ </item>
                    </item>
                </argument>
            </column>
            <اسم العمود = "to_date" class = "Magento \ Ui \ Component \ List \ Columns \ Date">
                <اسم الوسيطة = "data" xsi: type = "array">
                    <اسم العنصر = "config" xsi: type = "array">
                        <item name = "sorting" xsi: type = "string"> وصف </ em>
                        <item name = "filter" xsi: type = "string"> dateRange </item>
                        <item name = "dataType" xsi: type = "string"> التاريخ </item>
                        <item name = "component" xsi: type = "string"> Magento_Ui / js / grid / الأعمدة / التاريخ </item>
                        <item name = "label" xsi: type = "string" translate = "true"> End </item>
                    </item>
                </argument>
            </column>
            <ActionsColumn name = "Actions" class = "Vendor \ Rules \ Ui \ Component \ List \ Column \ RuleActions">
                <اسم الوسيطة = "data" xsi: type = "array">
                    <اسم العنصر = "config" xsi: type = "array">
                        <item name = "indexField" xsi: type = "string"> rule_id </item>
                        <item name = "urlEntityParamName" xsi: type = "string"> rule_id </item>
                        <item name = "sortOrder" xsi: type = "number"> 70 </item>
                    </item>
                </argument>
            </actionsColumn>
        </columns>
        <اسم الحاوية = "مثبت">
            <اسم الوسيطة = "data" xsi: type = "array">
                <اسم العنصر = "config" xsi: type = "array">
                    <item name = "component" xsi: type = "string"> Magento_Ui / js / grid / sticky / sticky </item>
                    <item name = "toolbarProvider" xsi: type = "string"> vendor_rules_rule_listing.vendor_rules_rule_listing.listing_top </item>
                    <item name = "ListProvider" xsi: type = "string"> vendor_rules_rule_listing.vendor_rules_rule_listing.vendor_rules_rule_columns </item>
                </item>
            </argument>
        </container>
    </listing>

تحتوي قائمة "مصدر البيانات" على ارتباط إلى " dataProvider " - النوع الذي أنشأناه في " di.xml ". يحتوي على بيانات الإدخال الضرورية للشبكة.

من هنا ، نحتاج إلى تحديد المفتاح المُودع - في حالتنا هو " rule_id ".

بالإضافة إلى ذلك ، يمكنك أيضًا إضافة الأزرار المخصصة ، ما عليك سوى وصفها في قسم "الأزرار". في مثالنا ، أضفنا زر "إضافة" القياسي بعنوان " * / * / newaction " (* في المسار يتوافق مع المعنى الحالي).

يحتوي " اسم الحاوية =" List_top " على بعض مكونات القائمة الإضافية: المرشحات ، ترقيم الصفحات ، إلخ. يمكنك تغييرها وفقًا لمتطلباتك الشخصية.

يحتوي " اسم الأعمدة =" vendor_rules_rule_columns " على العمود المتماثل تقريبًا ، كما هو الحال في الشبكة الافتراضية. الاختلاف الوحيد ذو المعنى هو عمود " ActionsColumn " الجديد الذي يقدم مجموعة من الإجراءات: التحرير والحذف. يمكن أيضًا تمديد هذه الإجراءات ، إذا لزم الأمر.

كما لاحظت على الأرجح ، يحتوي هذا العمود على فئة جديدة. دعنا نتعلم كيف يمكننا إنشائه:

 > التطبيق / الكود / البائع / القواعد / واجهة المستخدم / المكون / القائمة / العمود / RuleActions.php 
 <؟ php
    Vendor \ Rules \ Ui \ Component \ List \ Column؛

    يمتد class RuleActions \ Magento \ Ui \ Component \ List \ Columns \ Column
    {
        / **
         * مسار Url للتحرير
         *
         *var سلسلة
         * /
        const URL_PATH_EDIT = 'vendor_rules / example_rule / edit' ،

        / **
         * مسار URL للحذف
         *
         *var سلسلة
         * /
        const URL_PATH_DELETE = 'vendor_rules / example_rule / delete' ،

        / **
         * منشئ URL
         *
         *var \ Magento \ Framework \ UrlInterface
         * /
        محمية urlBuilder $؛

        / **
         * البناء
         *
         *param \ Magento \ Framework \ UrlInterface $ urlBuilder
         *param \ Magento \ Framework \ View \ Element \ UiComponent \ ContextInterface $ Context
         *param \ Magento \ Framework \ View \ Element \ UiComponentFactory $ uiComponentFactory
         *param مجموعة $ مكونات
         *param array $ data
         * /
        الوظيفة العامة __construct (
            \ Magento \ Framework \ UrlInterface $ urlBuilder ،
            \ Magento \ Framework \ View \ Element \ UiComponent \ ContextInterface $ سياق ،
            \ Magento \ Framework \ View \ Element \ UiComponentFactory $ uiComponentFactory ،
            مجموعة مكونات $ = [] ،
            مجموعة بيانات $ = []
        ) {
            $ this-> urlBuilder = $ urlBuilder؛
            الأصل :: __ build ($ Context، $ uiComponentFactory، $ component، $ data)؛
        }

        / **
         * تحضير مصدر البيانات
         *
         *param array $ dataSource
         *return مجموعة
         * /
        تحضير الوظيفة العامة
        {
            if (! isset ($ dataSource ['data'] ['items'])) {
                إرجاع $ dataSource؛
            }

            foreach ($ dataSource ['data'] ['items'] كـ & $ item) {

                إذا (! isset ($ item ['rule_id'])) {
                    استمر؛
                }

                $ item [$ this-> getData ('name')] = [
                    'تحرير' => [
                        'href' => $ this-> urlBuilder-> getUrl (
                            ثابت :: URL_PATH_EDIT ،
                            [
                                'id' => $ item ['rule_id']،
                            ]
                        ) ،
                        "التسمية" => __ ("تحرير") ،
                    ] ،
                    "حذف" => [
                        'href' => $ this-> urlBuilder-> getUrl (
                            ثابت :: URL_PATH_DELETE ،
                            [
                                'id' => $ item ['rule_id']،
                            ]
                        ) ،
                        "تسمية" => __ ("حذف") ،
                        "تأكيد" => [
                            'title' => __ ('Delete "$ {$. $ data.name}")،
                            'message' => __ ('هل أنت متأكد أنك تريد حذف القاعدة "$ {$. $ data.name}"؟')،
                        ] ،
                    ] ،
                ] ؛
            }

            إرجاع $ dataSource؛
        }
    }

    ؟>

هذه الفئة هي المسؤولة عن معالجة الإجراءات من الشبكة. من هنا ، يمكن تغيير عناوين URL أو اسم المعلمة المرسلة. في حالتنا ، المفتاح هو rule_id (يتم إرساله تحت اسم "id" لتسهيل فهم قيمته).

تبدو هكذا:

cbb7bf8d8c4d8c6139a4062ef4623fdc

إذا كنت قد فعلت كل شيء بالطريقة الصحيحة ، فيجب أن تبدو شبكتك كما يلي:

783ee65384ceff9f3e875c61c792cac2

كما نرى من المثال ، من السهل جدًا تحويل الشبكة القياسية الحالية إلى واجهة مستخدم. بالإضافة إلى توسيع وظائف الشبكة القياسية ، فإنه يسمح لك أيضًا بتبسيط العمل مع هذا الجزء من وظيفة Magento 2.

ملاحظة : في المقالة التالية من السلسلة ، سنقوم بشرح إمكانية إضافة كتلة - أفعال وأعمدة إضافية.

ابقوا متابعين!