ترقية شبكة 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 ) وإثرائها بمكونات واجهة المستخدم.
قارن فقط. هذه شبكة قديمة:

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

كما ترى ، فإن الشبكة التي تمت ترقيتها ستكون أكثر سهولة في الاستخدام وموفرة للوقت ، وأسهل في القياس ، ولديها الكثير من الميزات الإضافية الرائعة (مثل الإشارات المرجعية القادرة على حفظ حالة الشبكة الحالية) وتعيين المرشحات الذكية.
دعنا نبدأ.
أولاً ، تحتاج إلى إجراء بعض التغييرات في الوحدة. فيما يلي كيفية القيام بذلك:
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" لتسهيل فهم قيمته).
تبدو هكذا:

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

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