Desenvolvimento Magento 2

Massaction Magento 2: ação em massa na grid da sua UI listing

Sua grid customizada no admin do Magento Open Source 2.4.7 renderiza os registros, mas não tem a coluna de checkbox e o botão Ações abre vazio. São duas peças faltando no view/adminhtml/ui_component/seu_listing.xml: a selectionsColumn dentro de columns e o nó massaction dentro do listingToolbar.

O XML da grid

<listingToolbar name="listing_top">
    <massaction name="listing_massaction">
        <action name="delete">
            <settings>
                <url path="seumodulo/item/massdelete"/>
                <type>delete</type>
                <label translate="true">Excluir</label>
                <confirm>
                    <title translate="true">Excluir</title>
                    <message translate="true">Confirma a exclusão?</message>
                </confirm>
            </settings>
        </action>
    </massaction>
</listingToolbar>

<columns name="seu_listing_columns">
    <selectionsColumn name="ids">
        <settings><indexField>entity_id</indexField></settings>
    </selectionsColumn>
</columns>

O indexField tem que ser a chave primária que o data provider entrega. Se ali estiver um campo que não vem na listagem, o checkbox aparece mas a seleção chega vazia no controller — e o admin cospe a mensagem de que um item precisa ser selecionado mesmo com a grid inteira marcada. Foi assim que perdi uma tarde: o meu data provider entregava item_id e eu tinha copiado entity_id de outro módulo.

O controller que recebe a seleção

O path do url aponta pra Controller/Adminhtml/Item/MassDelete.php. Quem traduz “selecionei tudo, menos três” em collection é o MagentoUiComponentMassActionFilter; sem ele você lidaria na mão com os parâmetros de filtro da grid:

public function execute()
{
    $collection = $this->filter->getCollection(
        $this->collectionFactory->create()
    );

    $total = 0;
    foreach ($collection as $item) {
        $item->delete();
        $total++;
    }

    $this->messageManager->addSuccessMessage(
        __('%1 registro(s) excluído(s).', $total)
    );

    return $this->resultRedirectFactory->create()->setPath('*/*/index');
}

Declare a classe implementando HttpPostActionInterface e defina a constante ADMIN_RESOURCE com o mesmo recurso do ACL, senão a rota volta 403 pra quem não é admin raiz. Esse delete não passa por lixeira nenhuma, então teste em staging com backup do banco antes de soltar no admin do cliente. Depois de mexer no XML, rode bin/magento cache:clean config layout block_html full_page; se a grid teimar, apague generated/code e, em modo produção, rode bin/magento setup:di:compile em seguida.

Post Recentes

register_post_meta com show_in_rest: campo personalizado no /wp-json

O meta está no banco mas some do /wp-json/wp/v2/posts. Veja o register_post_meta certo, com single, type, schema de array e…

6 horas atrás

IntlDateFormatter: data por extenso em pt-BR sem array de meses

Escreva 31 de agosto de 2026 em PHP 8.3 sem aquele array com os doze meses, usando IntlDateFormatter com pattern…

1 dia atrás

wp_postmeta lento: índice em meta_key e meta_value para meta_query

Listagem de CPT com meta_query que demora segundos: veja o EXPLAIN da query do WP_Query e o índice composto em…

3 dias atrás

WP-Cron travado: eventos agendados que não rodam no WordPress 6.9

Post com Perdeu o agendamento e backup que não roda há dias: inspecione a fila do WP-Cron, apague a trava…

3 dias atrás

Desligar o AMP no WordPress 6.9: redirect do /amp/ sem perder tráfego

Como aposentar o plugin AMP sem transformar centenas de URLs /amp/ indexadas em 404: o rewrite 301 no nginx, a…

4 dias atrás

Redis OOM Magento 2: ajustar a maxmemory-policy e separar os bancos

A loja cai com OOM command not allowed when used memory > maxmemory: ajuste a maxmemory-policy do Redis e separe…

4 dias atrás