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.