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

Creation of dynamic property: deprecated no PHP 8.3 com WordPress 6.9

debug.log crescendo em gigabytes com avisos de propriedade dinâmica. Veja como isolar o plugin culpado, corrigir a classe e silenciar…

5 horas atrás

Plugin do Magento 2 não executa: método final, private ou objeto novo

O before ou around declarado no di.xml nunca dispara. Confira o Interceptor em generated e descarte as três causas que…

11 horas atrás

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…

2 dias 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…

3 dias 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…

3 dias 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…

4 dias atrás