Desenvolvimento Magento 2

UI component listing do Magento 2: grid do admin abre vazia

A grid do meu módulo abria bonitinha: cabeçalho das colunas montado, rodapé dizendo 0 registros e nada no meio. O erro de verdade estava escondido na aba Network do navegador — a chamada para mui/index/render voltava com Not registered handle roger_item_listing_data_source. Falta ligar o dataSource do listing.xml a uma collection, e esse vínculo mora no di.xml.

Registre a collection no di.xml

A classe MagentoFrameworkViewElementUiComponentDataProviderDataProvider não sabe ler tabela nenhuma sozinha. Ela pergunta ao CollectionFactory qual collection responde pelo nome do dataSource. Se o nome não estiver no array collections, sai a exceção acima e a grid fica vazia.

<virtualType name="RogerCatalogoModelResourceModelItemGridCollection"
    type="MagentoFrameworkViewElementUiComponentDataProviderSearchResult">
    <arguments>
        <argument name="mainTable" xsi:type="string">roger_catalogo_item</argument>
        <argument name="resourceModel" xsi:type="string">RogerCatalogoModelResourceModelItem</argument>
        <argument name="identifierName" xsi:type="string">entity_id</argument>
    </arguments>
</virtualType>

<type name="MagentoFrameworkViewElementUiComponentDataProviderCollectionFactory">
    <arguments>
        <argument name="collections" xsi:type="array">
            <item name="roger_item_listing_data_source" xsi:type="string">RogerCatalogoModelResourceModelItemGridCollection</item>
        </argument>
    </arguments>
</type>

Repare que não criei classe nenhuma: o virtualType em cima do SearchResult já entrega paginação, ordenação e filtro da grid prontos. O identifierName não é enfeite: sem ele o SearchResult assume que a chave primária se chama id, e aí o filtro por ID e a edição inline param de casar. Classe própria só quando você precisa de join ou de filtro fixo, e mesmo aí o pai continua sendo o SearchResult.

Um nome só, em três lugares

Essa é a pegadinha que me custou uma tarde. O name do item acima tem que ser idêntico, caractere por caractere, ao name do dataSource e ao name do dataProvider dentro dele, em view/adminhtml/ui_component/roger_item_listing.xml.

<dataSource name="roger_item_listing_data_source" component="Magento_Ui/js/grid/provider">
    <dataProvider name="roger_item_listing_data_source"
        class="MagentoFrameworkViewElementUiComponentDataProviderDataProvider">
        <settings>
            <requestFieldName>entity_id</requestFieldName>
            <primaryFieldName>entity_id</primaryFieldName>
        </settings>
    </dataProvider>
</dataSource>

Depois de mexer no di.xml, limpe o cache de configuração. Em developer mode isso basta; em produção, recompile o DI antes de testar:

bin/magento cache:clean config

# só em modo produção
bin/magento setup:di:compile

Se a exceção sumir e a grid continuar sem linhas, o problema mudou de endereço: aí é mainTable errada ou filtro sobrando no resource model. Ligue o bin/magento dev:query-log:enable, recarregue a grid e leia o SELECT que saiu de verdade.

Post Recentes

Criar swapfile no Ubuntu: parar o OOM killer de matar o MySQL

VPS de 2 GB onde o mysqld morre de madrugada e o site volta com erro de conexão. Como confirmar…

8 horas atrás

Grupos nomeados no preg_match: pare de contar índice de $matches

Regex com cinco parênteses e ninguém lembra se a data é $matches[2] ou $matches[3]. Nomeie os grupos e leia o…

22 horas atrás

Token de integração da API do Magento 2: gerar e usar no header Bearer

Erro The consumer isn't authorized to access resources ao chamar a REST do Magento 2.4.8? Ative a integração, libere os…

1 dia atrás

Rate limit no wp-login.php com nginx: barrar força bruta antes do PHP

Bots batendo centenas de POST por minuto no login derrubam a CPU. Configure limit_req_zone no nginx e devolva 429 antes…

2 dias atrás

Anonimizar IP no nginx: mascarar o último octeto do log para a LGPD

Seu access.log guarda o IP inteiro dos visitantes há meses sem necessidade. Mascare o último octeto com map e log_format…

3 dias atrás

Prompt injection em campo de usuário: isole a observação do pedido

A observação do pedido chegou com ordem embutida para gerar cupom. Delimite o texto do cliente e trate a resposta…

3 dias atrás