Desenvolvimento Magento 2

DataProvider Magento 2: form do admin abre com campos vazios ao editar

Cadastro novo entra na tabela sem reclamar. Clico em Editar na grid, o form abre e todos os campos estão em branco, sem uma linha no var/log/exception.log. Quando dá isso eu nem olho o template: vou direto no getData() do DataProvider, porque quase sempre ele devolve o array com o índice errado.

getData indexado pelo id da entidade

public function getData()
{
    if (isset($this->loadedData)) {
        return $this->loadedData;
    }

    foreach ($this->collection->getItems() as $item) {
        $this->loadedData[$item->getId()] = $item->getData();
    }

    $data = $this->dataPersistor->get('meumodulo_item');
    if (!empty($data)) {
        $item = $this->collection->getNewEmptyItem();
        $item->setData($data);
        $this->loadedData[$item->getId()] = $item->getData();
        $this->dataPersistor->clear('meumodulo_item');
    }

    return $this->loadedData;
}

O componente procura, dentro desse array, a chave igual ao id que veio na URL. Devolver [0 => $data] ou um array plano com os campos na raiz faz ele não achar nada e desenhar tudo vazio. O dataPersistor é a segunda metade: sem ele, um save reprovado na validação devolve o form limpo e o usuário perde o que digitou.

requestFieldName e dataScope precisam casar

<!-- view/adminhtml/ui_component/meumodulo_item_form.xml -->
<dataSource name="item_form_data_source">
    <settings>
        <submitUrl path="meumodulo/item/save"/>
    </settings>
    <dataProvider class="VendorModuloModelItemDataProvider" name="item_form_data_source">
        <settings>
            <requestFieldName>item_id</requestFieldName>
            <primaryFieldName>item_id</primaryFieldName>
        </settings>
    </dataProvider>
</dataSource>

<fieldset name="general">
    <field name="titulo" formElement="input">
        <settings>
            <dataType>text</dataType>
            <dataScope>titulo</dataScope>
        </settings>
    </field>
</fieldset>

O requestFieldName é o parâmetro da URL de edição, aquele /edit/item_id/7. Se ele não for a mesma coluna que o getId() devolve, o provider carrega a coleção e o form continua sem par. Já o dataScope do campo é relativo ao <dataScope>data</dataScope> declarado no settings do form: se você aninhou o array embaixo de outra chave e não declarou isso, o campo procura no lugar errado. Depois de mexer no XML, sudo -u www-data php bin/magento cache:flush, senão você fica corrigindo código que o Magento nem releu.

Se travou nisso e precisa de ajuda, me chama aqui.

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…

12 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