Magento 2 has a new "uiComponent
" feature. This allows to you to include a simple <uiComponent/>
tag in your layout handle XML files to add things like Grids and forms to your application page.
It appears that the configuration for a data grid (a listing
) requires two collection objects be configured.
What's the role of each configuration collection below? Or do I misunderstand the roles of these collections? Or is there a way to create grid object using only a single collection?
The following configuration sets up a UI listing Component named cms_page_listing
vendor/magento/module-cms/view/adminhtml/ui_component/cms_page_listing.xml
And the the following DI Injection tells Magento that a cms_page_listing
should use a Magento\Cms\Model\ResourceModel\Page\Grid\Collection
collection.
<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>
This seems to be the main collection used to populate the grid.
However, there's also this PageGridDataProvider
in the cms_page_listing
configuration.
<!-- 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 PageGridDataProvider
resolves to a 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>
This virtual type configures a second collection (Magento\Cms\Model\ResourceModel\Page\Collection
).
It's not clear why this second configuration is needed, or what its role is in creating a grid. The higher level question is probably what role does the dataProvider
play in creating a UI Grid. The larger larger question is probably What PHP objects are created to create a UI Listing Grid, and how does a configuration control them