Magento 2: Mengapa Komponen Daftar UI membutuhkan Dua Koleksi?

16

Magento 2 memiliki uiComponentfitur " " baru . Ini memungkinkan Anda untuk memasukkan <uiComponent/>tag sederhana dalam tata letak Anda menangani file XML untuk menambahkan hal-hal seperti Grid dan formulir ke halaman aplikasi Anda.

Ini muncul bahwa konfigurasi untuk data grid (a listing) membutuhkan dua benda koleksi dikonfigurasi.

Apa peran masing-masing koleksi konfigurasi di bawah ini? Atau apakah saya salah paham tentang peran koleksi ini? Atau adakah cara untuk membuat objek kotak hanya menggunakan satu koleksi?

Konfigurasi berikut ini menetapkan Komponen daftar UI bernama cms_page_listing

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

Dan Injeksi DI berikut memberitahu Magento bahwa cms_page_listingharus menggunakan Magento\Cms\Model\ResourceModel\Page\Grid\Collectionkoleksi.

<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>

Ini tampaknya menjadi koleksi utama yang digunakan untuk mengisi kotak.

Namun , ada juga ini PageGridDataProviderdalam cms_page_listingkonfigurasi.

<!-- 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>

The PageGridDataProviderresolve ke virtualType sebuah

<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>

Tipe virtual ini mengonfigurasi koleksi kedua ( Magento\Cms\Model\ResourceModel\Page\Collection).

Tidak jelas mengapa konfigurasi kedua ini diperlukan, atau apa perannya dalam membuat kisi. Pertanyaan tingkat yang lebih tinggi mungkin adalah peran apa yang dimainkan oleh dataProviderpermainan dalam menciptakan Kotak UI . Pertanyaan yang lebih besar lebih besar mungkin Apa objek PHP yang dibuat untuk membuat Grid Daftar UI, dan bagaimana konfigurasi mengontrolnya

Alan Storm
sumber

Jawaban:

10

Inilah jawaban cepat untuk pertanyaan pertama Anda:

Konfigurasi untuk tipe virtual tidak diperlukan. Jika Anda melihat ke dalam Magento\Framework\View\Element\UiComponent\DataProvider\DataProviderAnda akan menemukan bahwa tidak satu pun dari dua argumen yang digunakan ("koleksi" serta "filterPool").

Kami akan segera menghapus konfigurasi yang tidak digunakan ini. Jadi, deklarasi hasil penyedia data tipe virtual harus sesederhana ini:

untuk Halaman CMS:

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

dan untuk Blok CMS

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

Dan seperti sekarang Anda dapat melihat, dalam file konfigurasi Komponen UI Anda tidak dipaksa untuk menggunakan tipe virtual penyedia data dan Anda dapat merujuk ke penyedia data generik Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider. Kami telah memutuskan untuk menggunakan tipe virtual, hanya untuk menyediakan titik ekstensi lain untuk pengembang.

Vitalii K
sumber
bagus untuk mengetahui. Juga tidak perlu membuat Koleksi Grid karena juga dapat dideklarasikan sebagai tipe virtual (Saya # m tidak yakin di mana saya telah melihat ini pertama, saya pikir suatu tempat di magento2 mengembangkan cabang) github.com/davidverholen/magento2-teaser /blob/1.0/etc/…
David Verholen