Magento 2: Por que um componente de listagem de interface do usuário precisa de duas coleções?

16

Magento 2 possui um novo " uiComponent" recurso. Isso permite que você inclua uma <uiComponent/>tag simples no seu arquivo XML de manipulação de layout para adicionar itens como grades e formulários à sua página de aplicativo.

Ele parece que a configuração de uma grelha de dados (a listing) exige dois objectos de recolha ser configurado.

Qual é o papel de cada coleção de configuração abaixo? Ou entendo mal os papéis dessas coleções? Ou existe uma maneira de criar um objeto de grade usando apenas uma única coleção?

A configuração a seguir define um componente de listagem da interface do usuário denominado cms_page_listing

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

E a seguinte injeção DI diz ao Magento que a cms_page_listingdeve usar uma Magento\Cms\Model\ResourceModel\Page\Grid\Collectioncoleção.

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

Essa parece ser a coleção principal usada para preencher a grade.

No entanto , também há isso PageGridDataProviderna cms_page_listingconfiguração.

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

Os PageGridDataProviderresolve para um 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>

Esse tipo virtual configura uma segunda coleção ( Magento\Cms\Model\ResourceModel\Page\Collection).

Não está claro por que essa segunda configuração é necessária ou qual é o seu papel na criação de uma grade. A questão de nível superior é provavelmente qual o papel dataProviderdesempenhado na criação de uma grade de interface do usuário . A questão maior é provavelmente: Quais objetos PHP são criados para criar uma Grade de Lista de UI e como a configuração os controla

Alan Storm
fonte

Respostas:

10

Aqui está uma resposta rápida para sua primeira pergunta:

A configuração para o tipo virtual não é necessária. Se você analisar, Magento\Framework\View\Element\UiComponent\DataProvider\DataProviderverá que nenhum desses dois argumentos é usado ("coleção" e "filterPool").

Removeremos essa configuração não utilizada o mais rápido possível. Portanto, a declaração de resultado dos tipos virtuais de provedores de dados deve ser tão simples quanto isto:

para páginas do CMS:

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

e para blocos CMS

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

E como agora você pode ver, nos arquivos de configuração dos Componentes da UI, você não é obrigado a usar o tipo virtual do provedor de dados e pode consultar o provedor de dados genérico Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider. Decidimos usar o tipo virtual, apenas para fornecer outro ponto de extensão aos desenvolvedores.

Vitalii K
fonte
bom saber. Também não é necessário criar uma coleção de grade, pois ela também pode ser declarada como um tipo virtual (não sei onde vi isso primeiro, acho que em algum lugar do ramo de desenvolvimento do magento2
David Verholen