Magento 2: Bir kullanıcı arayüzü listeleme bileşeninin neden iki koleksiyona ihtiyacı var?


16

Magento 2'nin yeni bir " uiComponent" özelliği var. Bu, <uiComponent/>uygulama sayfanıza Izgaralar ve formlar gibi şeyler eklemek için mizanpaj tanıtıcı XML dosyalarınıza basit bir etiket eklemenizi sağlar.

Görünen bir veri şebekesine (a yapılandırma olduğunu listing) gerektirir iki toplama nesneleri yapılandırılabilir.

Aşağıdaki her yapılandırma koleksiyonunun rolü nedir? Yoksa bu koleksiyonların rollerini yanlış mı anlıyorum? Yoksa tek bir koleksiyon kullanarak ızgara nesnesi oluşturmanın bir yolu var mı?

Aşağıdaki yapılandırma, bir UI listeleme Bileşeni oluşturur cms_page_listing

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

Ve aşağıdaki DI Enjeksiyonu Magento'ya a'nın cms_page_listingbir Magento\Cms\Model\ResourceModel\Page\Grid\Collectionkoleksiyon kullanması gerektiğini söyler .

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

Bu, ızgarayı doldurmak için kullanılan ana koleksiyon gibi görünüyor.

Bununla birlikte , yapılandırmada da bu PageGridDataProvidervardır 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>

PageGridDataProviderBir virtualType için giderir

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

Bu sanal tür ikinci bir koleksiyonu ( Magento\Cms\Model\ResourceModel\Page\Collection) yapılandırır .

Bu ikinci yapılandırmanın neden gerekli olduğu veya bir ızgara oluşturmadaki rolünün ne olduğu açık değildir. Daha yüksek seviye soru, muhtemelen bir UI Izgarası oluşturmada hangi rolün oynadığıdırdataProvider . Daha büyük olan soru muhtemelen bir UI Listeleme Izgarası oluşturmak için hangi PHP nesnelerinin oluşturulduğu ve bir yapılandırmanın bunları nasıl kontrol ettiği

Yanıtlar:


10

İlk sorunuza hızlı bir cevap:

Sanal tür için yapılandırma gerekli değildir. Eğer bakarsanız Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider, bu iki argümanın hiçbirinin kullanılmadığını görürsünüz ("toplama" ve "filterPool").

Bu kullanılmayan yapılandırmayı mümkün olan en kısa sürede kaldıracağız. Bu nedenle, veri sağlayıcılarının sanal türlerinin sonuç bildirimi şu kadar basit olmalıdır:

CMS Sayfaları için:

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

ve CMS Blokları için

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

Gördüğünüz gibi, UI Bileşenleri yapılandırma dosyalarında veri sağlayıcı sanal türünü kullanmanız zorunlu değildir ve genel veri sağlayıcısına başvurabilirsiniz Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider. Sanal türü kullanmaya karar verdik, sadece geliştiriciler için başka bir uzantı noktası sağlamak için.


bilmek güzel. Ayrıca sanal bir tür olarak da ilan edilebildiğinden bir Izgara Koleksiyonu oluşturmak gerekli değildir (bunu ilk gördüğüm yerde emin değilim, magento2 geliştirme dalında bir yerde düşünüyorum) github.com/davidverholen/magento2-teaser /blob/1.0/etc/…
David Verholen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.