Magento 2: Perché un componente di elenco dell'interfaccia utente necessita di due raccolte?


16

Magento 2 ha una nuova uiComponentfunzione " ". Ciò consente di includere un semplice <uiComponent/>tag nel layout gestire i file XML per aggiungere elementi come griglie e moduli alla pagina dell'applicazione.

Essa appare che la configurazione di una griglia di dati (a listing) richiede due oggetti da collezione configurare.

Qual è il ruolo di ciascuna raccolta di configurazione di seguito? O fraintendo i ruoli di queste collezioni? O c'è un modo per creare un oggetto grid usando solo una singola collezione?

La seguente configurazione imposta un componente elenco UI denominato cms_page_listing

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

E la seguente DI Injection dice a Magento che a cms_page_listingdovrebbe usare una Magento\Cms\Model\ResourceModel\Page\Grid\Collectioncollezione.

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

Questa sembra essere la raccolta principale utilizzata per popolare la griglia.

Tuttavia , c'è anche questo PageGridDataProvidernella cms_page_listingconfigurazione.

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

Si PageGridDataProviderrisolve in un tipo virtuale

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

Questo tipo virtuale configura una seconda raccolta ( Magento\Cms\Model\ResourceModel\Page\Collection).

Non è chiaro perché sia ​​necessaria questa seconda configurazione o quale sia il suo ruolo nella creazione di una griglia. La domanda di livello superiore è probabilmente quale ruolo dataProvidergioca nella creazione di una griglia dell'interfaccia utente . La domanda più ampia è probabilmente quali oggetti PHP vengono creati per creare una griglia di quotazione dell'interfaccia utente e come viene controllata da una configurazione

Risposte:


10

Ecco una risposta rapida alla tua prima domanda:

La configurazione per il tipo virtuale non è richiesta. Se guardi dentro Magento\Framework\View\Element\UiComponent\DataProvider\DataProvidertroverai che nessuno di questi due argomenti viene usato ("collection" e "filterPool").

Rimuoveremo questa configurazione non utilizzata appena possibile. Pertanto, la dichiarazione dei risultati dei tipi virtuali di provider di dati dovrebbe essere semplice come questa:

per le pagine CMS:

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

e per blocchi CMS

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

E come ora puoi vedere, nei file di configurazione dei componenti dell'interfaccia utente non sei obbligato a utilizzare il tipo virtuale del fornitore di dati e puoi fare riferimento al fornitore di dati generico Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider. Abbiamo deciso di utilizzare il tipo virtuale, solo per fornire un ulteriore punto di estensione per gli sviluppatori.


bello sapere. Inoltre non è necessario creare una Grid Collection poiché può anche essere dichiarata come un tipo virtuale (non sono sicuro di dove l'ho vista prima, penso da qualche parte nel ramo di sviluppo di magento2) github.com/davidverholen/magento2-teaser /blob/1.0/etc/…
David Verholen
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.