Como salvar composição vinda do Form Designer Olá Pessoal! Bom, nos exemplos que temos no tutor e também nas aplicações de exemplo, percebo que quanto se trata de composições ou agragações, em todos os exemplos é sempre utilizado um TMultifield. Em minha aplicação não utilizo TMultifield mas sim um formulário criado no Form Designer. Quando se trata de TMultifield o código no onSave para registrar alguma composição é: ...
AF
Como salvar composição vinda do Form Designer  
Fechado
Olá Pessoal! Bom, nos exemplos que temos no tutor e também nas aplicações de exemplo, percebo que quanto se trata de composições ou agragações, em todos os exemplos é sempre utilizado um TMultifield. Em minha aplicação não utilizo TMultifield mas sim um formulário criado no Form Designer. Quando se trata de TMultifield o código no onSave para registrar alguma composição é:

 
  1. <?php
  2. if ($object->autorizado_list)
  3. {
  4. foreach ($object->autorizado_list as $autorizados)
  5. {
  6. // add the autorizado to the customer
  7. $object->addautorizado($autorizados);
  8. }
  9. }
  10. ?>

Mas como posso salvar o registro vindo de um formulário criado no Form Designer? Estou tentando de variadas maneiras mas sempre ocorre algum probleminha..
Alguma solução nestes casos?

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (9)


FC

Oi Aurelio

A ideia é a mesma desse artigo www.adianti.com.br/forum/pt/view_499?adicionando-validadores-ao-desi

vc precisa recuperar os dados pelo $ui->getWidget('campo');

abraços
AF

Bom dia Felipe!
Utilizo esta maneira para pegar os dados do formulario também.O problema são nos IDs que sempre são alterados ao chamar a função addEndereco. No onSave eu utilizo um $object = $this->form->getData('cliente') e um $object3 = $this->form->getData('endereco').
Após, crio uma instancia de Endereco, e atribuo todos os dados do formulário de endereço para esta instancia (chamada de $enderecoSalvar).

Posteriormente eu faço um simples condicional:

 
  1. <?php
  2. if($object->LOGRADOURO){
  3. // $enderecoSalvar->store();
  4. // $cliente->addendereco($enderecoSalvar);
  5. // $custumer->addendereco($object3);
  6. // $object->addendereco($enderecoSalvar);
  7. // new TMessage('error', '<b>Logradouro</b> ' . $object->LOGRADOURO '<b>BAIRRO</b>'. $object->LOGRADOURO);
  8. if(empty($object->id)){
  9. $cliente->addendereco($enderecoSalvar);
  10. $cliente->store();
  11. new TMessage('error','Não está com ID');
  12. }else{
  13. $cliente2 = new Cliente($object->id);
  14. $cliente2->addendereco($enderecoSalvar);
  15. $cliente2->store();
  16. new TMessage('error','Está com ID');
  17. }
  18. }
  19. ?>



Isso está no meu onSave.
Não sei se esta é a maneira correta de se fazer.. O que eu percebo, vendo o banco de dados, é que o ID de cada endereço adicionado é alterado toda vez que eu adiciono um novo endereço para um determinado cliente.
Vou exemplificar melhor: tenho 2 clientes, x e y. Adiciono um endereço para x com id 1 no banco de dados. Posteriormente adiciono um outro endereço(id 2) para o cliente y. Posteriormente adiciono outro endereço para o cliente x. Agora no banco de dados eu tenho 3 registros com os ids: 2,3 e 4. O banco de dados excluiu o id 1, porem o registro do id 1 foi para o id 3 e o novo endereço para o id 4. Ou seja, os registros não são perdidos, mas os ids dos endereços ficam em constantes alterações..Conseguiu compreender este caso?
Obrigado!
FC

Na composição (olhe o model) é feito o seguinte se existe o cliente_id ele apaga todos os ids associados e depois acrescenta novamente. acredito que algo dentro dessa rotina está se perdendo é preciso dar uma olhada na sua base de dados se existe alguma restrição ou se alguma rotina no model não está correto.

Normalmente quando é criada a associação no model pelo wizard do studio fica tudo correto, faz o seguinte crie um outro form pelo wizard com menos campos é claro pode usar o Multifield (mais facil) somente associando o seu cadastro de endereço com o do cliente para testar os models do endereço e do cliente.
AF

Bom, se as composições apagam todos os ids associados e depois acrescenta tudo novamente ele está fazendo corretamente, pois é exatamente isso que ele está fazendo. Neste caso, os IDS dos endereços são alterados sempre que acrescendo um novo endereço. Esta composição eu fiz tudo pelo wizard mesmo. Como poderia adicionar variados endereços sem que os IDS fossem alterados? Testei utilizando um TMultifield e percebi que os IDS não são alterados, o endereço é apenas acrescentado no banco de dados, sem alteração dos IDS dos endereços adicionados anteriormente. Acha então que minha algo na minha model da composição está com alguma restrição?
FC

Se descartamos o erro no model com certeza é no onSave do seu control. verifique se esta passando todos os campos no setField, normalmente o erro está ai.
AF

Ok. Irei verificar na parte da tarde e postarei os resultados aqui novamente. Obrigado pela ajuda Felipe!
AF

Olá Felipe Cortez! Realmente vi que no model as composições apagam todos os ids associados e depois acrescenta novamente. Ou seja, o sistema está funcionando normalmente. Porém, como preciso que os IDs não sejam alterados, teria alguma solução que eu poderia fazer neste caso? Eu poderia modificar a função store que é responsável por fazer isso neste caso?
FC

O ideal e VC alterar apenas o onSave fazendo conforme sua necessidade. Ou seja VC pode recuperar todos os campos na funcao getdata depois tratar os objetos separadamentes e salvar conforme VC desejar.
AF

Olá Felipe Cortez. Não sei porque não pensei nisso antes! kkkkkk
Fiz exatamente como sugeriu.. Chamei apenas um endereco->store() e pronto.
Obrigado mesmo pela ajuda!