Magento 2: Warum benötigt eine UI-Listing-Komponente zwei Collections?

16

Magento 2 hat eine neue " uiComponent" Funktion. Auf diese Weise können Sie ein einfaches <uiComponent/>Tag in Ihre XML-Layout-Handle-Dateien einfügen, um Ihrer Anwendungsseite beispielsweise Raster und Formulare hinzuzufügen.

Es scheint, dass für die Konfiguration eines Datengrids (a listing) zwei Erfassungsobjekte konfiguriert werden müssen.

Welche Rolle spielen die einzelnen Konfigurationssammlungen unten? Oder verstehe ich die Rollen dieser Sammlungen falsch? Oder gibt es eine Möglichkeit, Rasterobjekte nur mit einer einzigen Sammlung zu erstellen?

Die folgende Konfiguration richtet eine UI-Auflistung Component named ein cms_page_listing

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

Die folgende DI-Injection teilt Magento mit, dass cms_page_listingeine Magento\Cms\Model\ResourceModel\Page\Grid\CollectionSammlung verwendet werden soll.

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

Dies scheint die Hauptsammlung zu sein, die zum Auffüllen des Rasters verwendet wird.

Dies ist jedoch auch PageGridDataProviderin der cms_page_listingKonfiguration enthalten.

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

Das wird PageGridDataProviderin einen virtualType aufgelöst

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

Dieser virtuelle Typ konfiguriert eine zweite Sammlung ( Magento\Cms\Model\ResourceModel\Page\Collection).

Es ist nicht klar, warum diese zweite Konfiguration benötigt wird oder welche Rolle sie beim Erstellen eines Rasters spielt. Die übergeordnete Frage ist wahrscheinlich, welche Rolle das dataProviderbeim Erstellen eines UI-Gitters spielt . Die größere Frage ist wahrscheinlich, welche PHP-Objekte erstellt werden, um ein UI-Listenraster zu erstellen, und wie eine Konfiguration sie steuert

Alan Storm
quelle

Antworten:

10

Hier ist eine schnelle Antwort auf Ihre erste Frage:

Die Konfiguration für den virtuellen Typ ist nicht erforderlich. Wenn Sie nachsehen, werden Magento\Framework\View\Element\UiComponent\DataProvider\DataProviderSie feststellen, dass keines dieser beiden Argumente verwendet wird ("collection" sowie "filterPool").

Wir werden diese nicht verwendete Konfiguration entfernen, sobald wir können. Die Ergebnisdeklaration der virtuellen Typen von Datenanbietern sollte also so einfach sein:

für CMS-Seiten:

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

und für CMS-Blöcke

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

Und wie Sie jetzt sehen können, müssen Sie in Konfigurationsdateien für UI-Komponenten nicht den virtuellen Typ des Datenanbieters verwenden, sondern können auf einen generischen Datenanbieter verweisen Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider. Wir haben uns für den virtuellen Typ entschieden, um Entwicklern einen weiteren Erweiterungspunkt zu bieten.

Vitalii K
quelle
gut zu wissen. Außerdem ist es nicht erforderlich, eine Grid-Sammlung zu erstellen, da sie auch als virtueller Typ deklariert werden kann (ich bin mir nicht sicher, wo ich das zuerst gesehen habe, glaube ich, irgendwo in der magento2-Entwicklungsbranche). Github.com/davidverholen/magento2-teaser /blob/1.0/etc/…
David Verholen