Magento 2: Pourquoi un composant de liste d'interface utilisateur a-t-il besoin de deux collections?

16

Magento 2 a une nouvelle fonctionnalité " uiComponent". Cela vous permet d'inclure une simple <uiComponent/>balise dans vos fichiers XML de gestion de mise en page pour ajouter des éléments tels que des grilles et des formulaires à votre page d'application.

Il semble que la configuration d'une grille de données (a listing) nécessite la configuration de deux objets de collecte.

Quel est le rôle de chaque collection de configurations ci-dessous? Ou est-ce que je comprends mal les rôles de ces collections? Ou existe-t-il un moyen de créer un objet de grille en utilisant une seule collection?

La configuration suivante configure un composant de liste d'interface utilisateur nommé cms_page_listing

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

Et l'injection DI suivante indique à Magento que cms_page_listingdoit utiliser une Magento\Cms\Model\ResourceModel\Page\Grid\Collectioncollection.

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

Cela semble être la principale collection utilisée pour remplir la grille.

Cependant , il y a aussi cela PageGridDataProviderdans la cms_page_listingconfiguration.

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

Le PageGridDataProviderrésout en 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>

Ce type virtuel configure une deuxième collection ( Magento\Cms\Model\ResourceModel\Page\Collection).

On ne sait pas pourquoi cette deuxième configuration est nécessaire, ni quel est son rôle dans la création d'une grille. La question de niveau supérieur est probablement quel rôle joue le dataProviderjeu dans la création d'une grille d'interface utilisateur . La plus grande question plus large est probablement quels objets PHP sont créés pour créer une grille de liste d'interface utilisateur, et comment une configuration les contrôle-t-elle

Alan Storm
la source

Réponses:

10

Voici une réponse rapide à votre première question:

La configuration pour le type virtuel n'est pas requise. Si vous examinez, Magento\Framework\View\Element\UiComponent\DataProvider\DataProvidervous constaterez qu'aucun de ces deux arguments n'est utilisé ("collection" ainsi que "filterPool").

Nous supprimerons cette configuration inutilisée dès que possible. Ainsi, la déclaration de résultat des types virtuels de fournisseurs de données devrait être aussi simple que ceci:

pour les pages CMS:

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

et pour les blocs CMS

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

Et comme vous pouvez le voir maintenant, dans les fichiers de configuration des composants UI, vous n'êtes pas obligé d'utiliser le type virtuel du fournisseur de données et vous pouvez vous référer au fournisseur de données générique Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider. Nous avons décidé d'utiliser le type virtuel, juste pour fournir un autre point d'extension aux développeurs.

Vitalii K
la source
bon à savoir. De plus, il n'est pas nécessaire de créer une collection de grilles car elle peut également être déclarée comme un type virtuel (je ne sais pas où j'ai vu cela en premier, je pense quelque part dans la branche de développement de magento2
David Verholen