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.

Dúvidas? Faça um comentário logo abaixo ou envie uma mensagem clicando aqui.

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *