Magento 2: ¿Por qué un componente de listado de IU necesita dos colecciones?

16

Magento 2 tiene una nueva " uiComponent" característica. Esto le permite incluir una <uiComponent/>etiqueta simple en su diseño para manejar archivos XML para agregar elementos como Cuadrículas y formularios a su página de aplicación.

Se parece que la configuración para una cuadrícula de datos (a listing) requiere dos configurarse objetos de colección.

¿Cuál es el papel de cada colección de configuración a continuación? ¿O no entiendo los roles de estas colecciones? ¿O hay una manera de crear un objeto de cuadrícula usando solo una colección?

La siguiente configuración configura un componente de listado de UI denominado cms_page_listing

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

Y la siguiente inyección DI le dice a Magento que cms_page_listingdebería usar una Magento\Cms\Model\ResourceModel\Page\Grid\Collectioncolección.

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

Esta parece ser la colección principal utilizada para poblar la cuadrícula.

Sin embargo , también hay presente PageGridDataProvideren la cms_page_listingconfiguración.

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

El PageGridDataProviderresuelve a un 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>

Este tipo virtual configura una segunda colección ( Magento\Cms\Model\ResourceModel\Page\Collection).

No está claro por qué se necesita esta segunda configuración, o cuál es su papel en la creación de una cuadrícula. La pregunta de nivel superior es probablemente qué papel dataProviderdesempeña el papel en la creación de una cuadrícula de interfaz de usuario . La pregunta más grande es probablemente ¿Qué objetos PHP se crean para crear una cuadrícula de listado de UI y cómo los controla una configuración

Alan Storm
fuente

Respuestas:

10

Aquí hay una respuesta rápida a su primera pregunta:

La configuración para el tipo virtual no es necesaria. Si observa Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider, encontrará que ninguno de esos dos argumentos se utiliza ("colección", así como "filterPool").

Eliminaremos esta configuración no utilizada tan pronto como podamos. Por lo tanto, la declaración de resultados de los tipos virtuales de proveedores de datos debe ser tan simple como esto:

para páginas CMS:

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

y para bloques CMS

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

Y como puede ver ahora, en los archivos de configuración de Componentes de la interfaz de usuario no se le exige usar el tipo virtual del proveedor de datos y puede consultar el proveedor de datos genérico Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider. Decidimos usar el tipo virtual, solo para proporcionar otro punto de extensión para los desarrolladores.

Vitalii K
fuente
bueno saber. Tampoco es necesario crear una colección de cuadrículas, ya que también se puede declarar como un tipo virtual (no estoy seguro de dónde he visto esto primero, creo que en algún lugar de la rama de desarrollo de magento2
David Verholen