Magento 2: ทำไมส่วนประกอบรายชื่อ UI จึงต้องมีสองกลุ่ม


16

Magento 2 มีคุณสมบัติใหม่ " uiComponent" สิ่งนี้อนุญาตให้คุณรวม<uiComponent/>แท็กอย่างง่ายในไฟล์ XML จัดการเลย์เอาต์ของคุณเพื่อเพิ่มสิ่งต่าง ๆ เช่นกริดและแบบฟอร์มในหน้าแอปพลิเคชันของคุณ

มันจะปรากฏว่าการกำหนดค่าสำหรับตารางข้อมูล (กlisting) ต้องสองคอลเลกชันวัตถุมีการกำหนดค่า

บทบาทของการรวบรวมการกำหนดค่าแต่ละรายการด้านล่างคืออะไร หรือฉันจะเข้าใจผิดบทบาทของคอลเลกชันเหล่านี้หรือไม่ หรือมีวิธีการสร้างวัตถุกริดโดยใช้เพียงคอลเลกชันเดียว?

การกำหนดค่าต่อไปนี้ตั้งค่าองค์ประกอบรายการ UI ที่ชื่อ cms_page_listing

vendor/magento/module-cms/view/adminhtml/ui_component/cms_page_listing.xml

และ DI Injection ต่อไปนี้บอก Magento ว่าcms_page_listingควรใช้Magento\Cms\Model\ResourceModel\Page\Grid\Collectionชุดสะสม

<type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
    <arguments>
        <argument name="collections" xsi:type="array">
            <item name="cms_page_listing_data_source" xsi:type="string">Magento\Cms\Model\ResourceModel\Page\Grid\Collection</item>
        </argument>
    </arguments>
</type>

นี่น่าจะเป็นคอลเล็กชั่นหลักที่ใช้เติมข้อมูลกริด

อย่างไรก็ตามยังมีสิ่งนี้PageGridDataProviderในการcms_page_listingกำหนดค่า

<!-- File: vendor/magento/module-cms/view/adminhtml/ui_component/cms_page_listing.xml -->
    <argument name="dataProvider" xsi:type="configurableObject">
        <argument name="class" xsi:type="string">PageGridDataProvider</argument>
        <argument name="name" xsi:type="string">cms_page_listing_data_source</argument>
        <argument name="primaryFieldName" xsi:type="string">page_id</argument>
        <argument name="requestFieldName" xsi:type="string">id</argument>
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="update_url" xsi:type="url" path="mui/index/render"/>
            </item>
        </argument>
    </argument>

การPageGridDataProviderแก้ไขเป็น virtualType

<virtualType name="PageGridDataProvider" type="Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider">
    <arguments>
        <argument name="collection" xsi:type="object" shared="false">Magento\Cms\Model\ResourceModel\Page\Collection</argument>
        <argument name="filterPool" xsi:type="object" shared="false">CmsGirdFilterPool</argument>
    </arguments>
</virtualType>

ชนิดเสมือนนี้กำหนดค่าคอลเลกชันที่สอง ( Magento\Cms\Model\ResourceModel\Page\Collection)

ยังไม่ชัดเจนว่าทำไมการกำหนดค่าที่สองนี้จำเป็นหรือสิ่งที่มีบทบาทในการสร้างตาราง คำถามระดับที่สูงขึ้นน่าจะเป็นสิ่งที่มีบทบาทไม่dataProviderเล่นในการสร้างตาราง UI คำถามที่ใหญ่กว่านี้น่าจะเป็นสิ่งที่วัตถุ PHP ถูกสร้างขึ้นเพื่อสร้าง UI Listing Grid และการกำหนดค่าควบคุมพวกมันอย่างไร

คำตอบ:


10

นี่คือคำตอบสำหรับคำถามแรกของคุณอย่างรวดเร็ว:

ไม่ต้องการการกำหนดค่าสำหรับประเภทเสมือน หากคุณมองเข้าไปMagento\Framework\View\Element\UiComponent\DataProvider\DataProviderคุณจะพบว่าไม่มีการใช้สองอาร์กิวเมนต์เหล่านี้ ("คอลเลกชัน" และ "filterPool")

เราจะลบการกำหนดค่าที่ไม่ได้ใช้นี้โดยเร็วที่สุด ดังนั้นการประกาศผลของประเภทเสมือนผู้ให้บริการข้อมูลควรจะง่ายเหมือนนี้

สำหรับหน้า CMS:

<virtualType name="PageGridDataProvider" type="Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider"/>

และสำหรับบล็อก CMS

<virtualType name="PageGridDataProvider" type="Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider"/>

และในขณะที่ตอนนี้คุณสามารถดูในแฟ้มการกำหนดค่า UI Magento\Framework\View\Element\UiComponent\DataProvider\DataProviderส่วนประกอบคุณไม่ได้บังคับใช้กับผู้ให้บริการการใช้ข้อมูลชนิดเสมือนจริงและคุณสามารถดูได้ให้บริการข้อมูลทั่วไป เราได้ตัดสินใจที่จะใช้ประเภทเสมือนจริงเพื่อให้เป็นอีกหนึ่งจุดขยายสำหรับนักพัฒนา


ดีที่รู้. นอกจากนี้ยังไม่จำเป็นต้องสร้าง Grid Collection เพราะสามารถประกาศเป็นแบบเสมือนได้ (ฉันไม่แน่ใจว่าฉันเห็นที่นี่ครั้งแรกฉันคิดว่าที่ไหนใน magento2 พัฒนาสาขา) github.com/davidverholen/magento2-teaser /blob/1.0/etc/…
David Verholen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.