Carregar texto de um campo em uma datagrid ao inves do ID do cam Bom dia, Não estou conseguindo fazer funcionar a Associação de Objetos em uma DATAGRID. Ao carregar a DATAGRID, é listado 'ID' ao invés do texto que é carregado na tela de cadastro na TDBCombo. Acredito que falte algo no método onReload para trazer o texto e não o ID. Em anexo imagem de como deveria listar na DATAGRID. Se alguém puder dar um help... agradeço! Utilizo o códi...
MB
Carregar texto de um campo em uma datagrid ao inves do ID do cam  
Bom dia,

Não estou conseguindo fazer funcionar a Associação de Objetos em uma DATAGRID.
Ao carregar a DATAGRID, é listado 'ID' ao invés do texto que é carregado na tela de cadastro na TDBCombo. Acredito que falte algo no método onReload para trazer o texto e não o ID.

Em anexo imagem de como deveria listar na DATAGRID.

Se alguém puder dar um help... agradeço!

Utilizo o código abaixo para listar os contatos cadastrados.

 
  1. <?php
  2. class ContatoList extends TPage
  3. {
  4. private $form; //registrando form
  5. private $datagrid; //listagem
  6. private $pageNavigation; //navegação pelas páginas
  7. private $loaded;
  8. public function __construct()
  9. {
  10. parent::__construct();
  11. //criando form
  12. $this->form = new TQuickForm('ContatoList');
  13. $this->form->setFormTitle('Listagem de Contatos');
  14. $this->form->class = 'tform';
  15. $nome = new TEntry('nome');
  16. $this->form->addQuickField( 'Nome:', $nome, '70%' );
  17. $this->form->addQuickAction('Buscar', new TAction(array($this, 'onSearch')), 'fa:search blue');
  18. $this->form->addQuickAction('Novo', new TAction(array('ContatoForm', 'onClear')), 'fa:plus-circle green');
  19. $nome->setValue( TSession::getValue( 'nome' ) );
  20. $this->datagrid = new TDataGrid;
  21. $this->datagrid->style = 'width: 100%';
  22. $id_contato = new TDataGridColumn('id_contato', 'Id', 'right', '3%');
  23. $celular = new TDataGridColumn('celular', 'Celular', 'left', '10%');
  24. $nome = new TDataGridColumn('nome', 'Nome', 'left', '20%');
  25. $datanascimento = new TDataGridColumn('datanascimento', 'Nascimento', 'left', '8%');
  26. $comprou = new TDataGridColumn('comprou', 'Comprou', 'left', '8%');
  27. $naocomprou = new TDataGridColumn('naocomprou', 'Motivo', 'left', '30%');
  28. $interesse = new TDataGridColumn('interesse', 'Interesse', 'left', '10%');
  29. $opcoes = new TDataGridColumn('opcoes', 'Opções', 'left', '10%');
  30. $opcao_sexual = new TDataGridColumn('opcao_sexual', 'Genero', 'left', '10%');
  31. $order1 = new TAction(array($this, 'onReload'));
  32. $order2 = new TAction(array($this, 'onReload'));
  33. $order1->setParameter('order', 'id_contato');
  34. $order2->setParameter('order', 'nome');
  35. $id_contato->setAction($order1);
  36. $nome->setAction($order2);
  37. $this->datagrid->addColumn($id_contato);
  38. $this->datagrid->addColumn($celular);
  39. $this->datagrid->addColumn($nome);
  40. $this->datagrid->addColumn($datanascimento);
  41. $this->datagrid->addColumn($comprou);
  42. $this->datagrid->addColumn($naocomprou);
  43. $this->datagrid->addColumn($interesse);
  44. $this->datagrid->addColumn($opcoes);
  45. $this->datagrid->addColumn($opcao_sexual);
  46. $action1 = new TDataGridAction(array('ContatoForm', 'onEdit'));
  47. $action1->setLabel('Editar');
  48. $action1->setImage('fa:edit blue');
  49. $action1->setField('id_contato');
  50. $action2 = new TDataGridAction(array($this, 'onDelete'));
  51. $action2->setLabel('Delete');
  52. $action2->setImage('fa:trash red');
  53. $action2->setField('id_contato');
  54. $this->form->addQuickAction( 'CSV', new TAction(array($this, 'onExportCSV')), 'fa:table' );
  55. $this->datagrid->addAction($action1);
  56. $this->datagrid->addAction($action2);
  57. $this->datagrid->createModel();
  58. $this->pageNavigation = new TPageNavigation;
  59. $this->pageNavigation->setAction(new TAction(array($this, 'onReload')));
  60. $this->pageNavigation->setWidth($this->datagrid->getWidth());
  61. $vbox = new TVBox;
  62. $vbox->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  63. $vbox->add($this->form); // add a row to the form
  64. $vbox->add($this->datagrid); // add a row to the datagrid
  65. $vbox->add($this->pageNavigation);
  66. parent::add($vbox);
  67. }
  68. function onSearch()
  69. {
  70. // get the search form data
  71. $data = $this->form->getData();
  72. // check if the user has filled the form
  73. if (isset($data->nome))
  74. {
  75. // creates a filter using what the user has typed
  76. $filter = new TFilter('nome', 'like', "%{$data->nome}%");
  77. // stores the filter in the session
  78. TSession::setValue('id_contato', $filter);
  79. TSession::setValue('nome', $data->nome);
  80. // fill the form with data again
  81. $this->form->setData($data);
  82. }
  83. $param = array();
  84. $param['offset'] =0;
  85. $param['first_page']=1;
  86. $this->onReload($param);
  87. }
  88. function onReload($param = NULL)
  89. {
  90. try
  91. {
  92. // open a transaction with database 'samples'
  93. TTransaction::open('dbmodaviva');
  94. // creates a repository for City
  95. $repository = new TRepository('Contato');
  96. $limit = 20;
  97. // creates a criteria
  98. $criteria = new TCriteria;
  99. // default order
  100. if (empty($param['order']))
  101. {
  102. $param['order'] = 'id_contato';
  103. $param['direction'] = 'asc';
  104. }
  105. $criteria->setProperties($param); // order, offset
  106. $criteria->setProperty('limit', $limit);
  107. if (TSession::getValue('Contato'))
  108. {
  109. // add the filter stored in the session to the criteria
  110. $criteria->add(TSession::getValue('Contato'));
  111. }
  112. // load the objects according to criteria
  113. $objects = $repository->load($criteria);
  114. $this->datagrid->clear();
  115. if ($objects)
  116. {
  117. // iterate the collection of active records
  118. foreach ($objects as $object)
  119. {
  120. // add the object inside the datagrid
  121. $this->datagrid->addItem($object);
  122. }
  123. }
  124. // reset the criteria for record count
  125. $criteria->resetProperties();
  126. $count= $repository->count($criteria);
  127. $this->pageNavigation->setCount($count); // count of records
  128. $this->pageNavigation->setProperties($param); // order, page
  129. $this->pageNavigation->setLimit($limit); // limit
  130. // close the transaction
  131. TTransaction::close();
  132. $this->loaded = true;
  133. }
  134. catch (Exception $e) // in case of exception
  135. {
  136. // shows the exception error message
  137. new TMessage('error', $e->getMessage());
  138. // undo all pending operations
  139. TTransaction::rollback();
  140. }
  141. }
  142. /**
  143. * method onDelete()
  144. * executed whenever the user clicks at the delete button
  145. * Ask if the user really wants to delete the record
  146. */
  147. function onDelete($param)
  148. {
  149. // define the delete action
  150. $action = new TAction(array($this, 'Delete'));
  151. $action->setParameters($param); // pass the key parameter ahead
  152. // shows a dialog to the user
  153. new TQuestion('Deseja realmente deletar esse registro?', $action);
  154. }
  155. function Delete($param)
  156. {
  157. try
  158. {
  159. // get the parameter $key
  160. $key = $param['id_contato'];
  161. TTransaction::open('dbmodaviva'); // open a transaction with database 'samples'
  162. $object = new Contato($key); // instantiates object City
  163. $object->delete(); // deletes the object from the database
  164. TTransaction::close(); // close the transaction
  165. // reload the listing
  166. $this->onReload( $param );
  167. // shows the success message
  168. new TMessage('info', "Registro Deletado");
  169. }
  170. catch (Exception $e) // in case of exception
  171. {
  172. // shows the exception error message
  173. new TMessage('error', $e->getMessage());
  174. // undo all pending operations
  175. TTransaction::rollback();
  176. }
  177. }
  178. function onExportCSV()
  179. {
  180. $this->onSearch();
  181. try
  182. {
  183. // open a transaction with database 'dbmodaviva'
  184. TTransaction::open('dbmodaviva');
  185. // creates a repository for Customer
  186. $repository = new TRepository('Contato');
  187. // creates a criteria
  188. $criteria = new TCriteria;
  189. if (TSession::getValue('customer_filter1'))
  190. {
  191. // add the filter stored in the session to the criteria
  192. $criteria->add(TSession::getValue('customer_filter1'));
  193. }
  194. if (TSession::getValue('customer_filter2'))
  195. {
  196. // add the filter stored in the session to the criteria
  197. $criteria->add(TSession::getValue('customer_filter2'));
  198. }
  199. $csv = '';
  200. // load the objects according to criteria
  201. $relacao = $repository->load($criteria);
  202. if ($relacao)
  203. {
  204. foreach ($relacao as $relacao)
  205. {
  206. $csv .= $relacao->id_contato.';'.
  207. $relacao->nome.';'.
  208. $relacao->celular.';'.
  209. $relacao->datanascimento.';'.
  210. $relacao->comprou.';'.
  211. $relacao->naocomprou.';'.
  212. $relacao->interesse.';'.
  213. $relacao->opcao.';'.
  214. $relacao->opcao_sexual."\n";
  215. }
  216. file_put_contents('app/output/relacao_de_contatos.csv', $csv);
  217. TPage::openFile('app/output/relacao_de_contatos.csv');
  218. }
  219. // close the transaction
  220. TTransaction::close();
  221. }
  222. catch (Exception $e) // in case of exception
  223. {
  224. // shows the exception error message
  225. new TMessage('error', $e->getMessage());
  226. // undo all pending operations
  227. TTransaction::rollback();
  228. }
  229. }
  230. /**
  231. * method show()
  232. * Shows the page
  233. */
  234. function show()
  235. {
  236. // check if the datagrid is already loaded
  237. if (!$this->loaded)
  238. {
  239. $this->onReload( func_get_arg(0) );
  240. }
  241. parent::show();
  242. }
  243. }
  244. ?>


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 (13)


TB

Não sei se é isso que você quer, mas, uma solução seria mudar o valor antes de atribuí-lo ao datagrid
 
  1. <?php
  2. if($object->comprou==2)
  3. {
  4. $object->comprou = 'SIM';
  5. }
  6. else
  7. {
  8. $object->comprou = 'NÃO';
  9. }
  10. ?>

Esse código deveria ser colocado na linha 154 e a propriedade 'comprou' deve ser substituída pelo campo que você usa para identificar a compra.
MB

Seria interessante que trouxesse a informação em uma tabela do banco de dados, pois terei casos onde serão vários valores (Ex: coluna interesse vai ter valores como: CAMISA, CALÇA, JAQUETA, BERMUDA, TENIS, SAPATO....
Ele está me retornando o ID desses itens na tabela, quando na verdade teria que exibir a descrição do item.

Vou utilizar isso em pelo menos 04 colunas da DATAGRID.
TB

Entendi, nesse caso você precisa ter configurado em seu modelo os métodos 'get_interesse' e 'set_interesse', que serão métodos que responsáveis por armazenar referencias para os registros com de acordo com seus respectivos ID's. Após definido estes métodos, você faria o seguinte no seu código:

 
  1. <?php
  2. //supondo que o campo 'descricao' seria onde estaria armazenado o nome do produto
  3. $interesse = new TDataGridColumn('interesse->descricao', 'Interesse', 'left', '10%');
  4. ?>
TB

Um exemplo de um modelo com o get e set configurados:

 
  1. <?php
  2. class Exemplo extends TRecord
  3. {
  4. private $servicos;
  5. public function __construct()
  6. {
  7. parent::addAtribute('id_servicos');
  8. }
  9. public function set_servicos(Servicos $object)
  10. {
  11. $this->servicos = $object;
  12. $this->id_sistema = $object->id;
  13. }
  14. public function get_servicos()
  15. {
  16. // loads the associated object
  17. if (empty($this->servicos))
  18. $this->servicos = new Servicos($this->id_servicos);
  19. // returns the associated object
  20. return $this->servicos;
  21. }
  22. }
  23. ?>
MB

Thiago,

Nao funcionou.
O Model ficou dessa forma:

 
  1. <?php
  2. /**
  3. * Objeto Active Record
  4. * @author <Marcelo Bandeira>
  5. */
  6. class Objeto extends TRecord
  7. {
  8. const TABLENAME = 'objeto';
  9. const PRIMARYKEY = 'id_objeto';
  10. const IDPOLICY = 'max'; // {max, serial}
  11. private $obj_interesse;
  12. /**
  13. * Método Construtor
  14. */
  15. public function __construct($id_objeto = NULL, $callObjectLoad = TRUE)
  16. {
  17. parent::__construct($id_objeto, $callObjectLoad);
  18. parent::addAttribute('objeto');
  19. }
  20. /**
  21. * Method set_obj_interesse
  22. * Sample of usage: $Objeto->obj_interesse = $object;
  23. * @param $object Instance of obj_interesse
  24. */
  25. public function set_obj_interesse(Contato $object)
  26. {
  27. $this->obj_interesse = $object;
  28. $this->id_objeto = $object->id;
  29. }
  30. /**
  31. * Method get_obj_interesse
  32. * Sample of usage: $Objeto->obj_interesse = $object;
  33. * @returns Obj_interesse instance
  34. */
  35. public function get_obj_interesse()
  36. {
  37. // loads the associated object
  38. if (empty($this->obj_interesse))
  39. $this->obj_interesse = new Contato($this->id_objeto);
  40. // returns the associated object
  41. return $this->obj_interesse;
  42. }
  43. }
  44. ?>



Na Datagrid ficou dessa forma:

 
  1. <?php
  2. $interesse = new TDataGridColumn('interesse->objeto', 'Interesse', 'left', '10%');
  3. ?>


Porém ao acessar a DATAGRID, retorna a msg "trying to access a non existent property adianti", nos campos campos onde era pra aparecer o valor do campo.

Dei uma lida nesse tópico:
https://www.adianti.com.br/forum/pt/view_2144?mostrar-descricao-ao-inves-do-id
.

Deve ser algum detalhe que não percebi.</Marcelo>
MB

mensagem correta: ""trying to access a non existent property (interesse->objeto)"
TB

Você colocou na função get "get_obj_interesse" e na hora de chamar a propriedade, passou "objeto". Creio que esse seja o problema, tente fazer da seguinte maneira:
 
  1. <?php
  2. $interesse = new TDataGridColumn('interesse->obj_interesse', 'Interesse', 'left', '10%');
  3. ?>
MB

Mudou só o final da mensagem: trying to access a non existent property (interesse->obj_interesse)...
TB

Agora que reparei uma coisa: Você aparentemente não está usando o modelo "objeto" neste datagrid, correto? o método get_obj_interesse deveria estar dentro do modelo "interesse"; assim sendo, dentro do modelo interesse você teria uma propriedade "obj_interesse" e iria acessá-lo da seguinte forma:

 
  1. <?php
  2. $interesse = new TDataGridColumn('obj_interesse->descricao', 'Interesse', 'left', '10%');
  3. ?>

MB

Não estou! Ela carrega do modelo "contato".

 
  1. <?php
  2. class Contato extends TRecord
  3. {
  4. const TABLENAME = 'contato';
  5. const PRIMARYKEY = 'id_contato';
  6. const IDPOLICY = 'max';
  7. public function __construct($id_contato = NULL)
  8. {
  9. parent::__construct($id_contato);
  10. parent::addAttribute('celular');
  11. parent::addAttribute('nome');
  12. parent::addAttribute('comprou');
  13. parent::addAttribute('naocomprou');
  14. parent::addAttribute('interesse');
  15. parent::addAttribute('opcoes');
  16. parent::addAttribute('opcao_sexual');
  17. parent::addAttribute('datanascimento');
  18. }
  19. }
  20. ?>


No control ContatoForm.class.php esta dessa forma:
 
  1. <?php
  2. class ContatoForm extends TPage
  3. {
  4. private $form;
  5. public function __construct()
  6. {
  7. parent::__construct();
  8. $this->form = new TQuickForm('form_contato');
  9. $this->form->setFormTitle('Contato');
  10. $this->form->class = 'tform';
  11. $this->form->style = 'width: 650px';
  12. $id_contato = new TEntry('id_contato');
  13. $celular = new TEntry('celular');
  14. $nome = new TEntry('nome');
  15. $datanascimento = new TDate('datanascimento');
  16. $comprou = new TDBCombo('comprou', 'dbmodaviva', 'Comprou', 'id_comprou', 'descricao');
  17. $naocomprou = new TEntry('naocomprou');
  18. $interesse = new TDBCombo('interesse', 'dbmodaviva', 'Objeto', 'id_objeto', 'objeto');
  19. $opcoes = new TDBCombo('opcoes', 'dbmodaviva', 'Objetotipo', 'id_objetotipo', 'tipo');
  20. $opcao_sexual = new TDBCombo('opcao_sexual', 'dbmodaviva', 'Genero', 'id_genero', 'descricao_genero');
  21. $id_contato->setEditable(FALSE);
  22. $id_contato->setMask('0000');
  23. $datanascimento->setMask('dd/mm/yyyy');
  24. $celular->setMask('(99)99999-9999');
  25. $this->form->addQuickField('Identificador', $id_contato, 40);
  26. $this->form->addQuickField('Celular', $celular, 125);
  27. $this->form->addQuickField('Nome', $nome, 400);
  28. $this->form->addQuickField('Data de Nascimento', $datanascimento, 90);
  29. $this->form->addQuickField('Comprou', $comprou, 60);
  30. $this->form->addQuickField('Não Comprou', $naocomprou, 400);
  31. $this->form->addQuickField('Interesse', $interesse, 130);
  32. $this->form->addQuickField('Opções', $opcoes, 130);
  33. $this->form->addQuickField('Gênero', $opcao_sexual, 100);
  34. //adicionando ação salvar dentro do form
  35. $save = new TAction (array($this, 'onSave') );
  36. $this->form->addQuickAction('Salvar', $save, 'ico_save.png');
  37. //adicionando ação listar dentro do form
  38. $list = new TAction( array('ContatoList', 'onReload') );
  39. $this->form->addQuickAction('Listar', $list, 'ico_datagrid.png');
  40. parent::add($this->form);
  41. }
  42. public function onSave()
  43. {
  44. try
  45. {
  46. TTransaction::open('dbmodaviva');
  47. $object = $this->form->getData('Contato');
  48. //$data = $this->form->getData(); // obtém os dados do form
  49. //$object->fromArray( (array) $data); // carrega o objeto com os dados
  50. // AQUI CONVERSÃO PARA SALVAR OS DADOS
  51. //$object->datanascimento = DateTime::createFromFormat('d/m/Y', $object->dt_compra)->format( 'Y-m-d' );
  52. $object->store();
  53. $this->form->setData( $object );
  54. new TMessage('info', 'Registro salvo com sucesso');
  55. TTransaction::close();
  56. }
  57. catch (Exception $e)
  58. {
  59. new TMessage('error', $e->getMessage());
  60. TTransaction::rollback();
  61. }
  62. }
  63. public function onClear()
  64. {
  65. $this->form->clear();
  66. }
  67. public function onEdit( $param )
  68. {
  69. try
  70. {
  71. TTransaction::open('dbmodaviva');
  72. $key = $param [ 'key' ];
  73. $object = new Contato( $key );
  74. $this->form->setData ($object);
  75. TTransaction::close();
  76. }
  77. catch (Exception $e)
  78. {
  79. new TMessage('error', $e->getMessage());
  80. }
  81. }
  82. }
  83. ?>


Coloquei para listar a datagrid (ContatoList) a partir do ContatoForm. Fiz errado dessa forma?
MB

Corrigindo: a partir do model Contato.class.php... fiz errado?
GS

Boa noite senhores, estou como o mesmo problema. Na classe AgdPadroesatendimentos tenho o get definido como:

public function get_sis_empresas()
{
// loads the associated object
if (empty($this->sis_empresas))
$this->sis_empresas = new SisEmpresas($this->sis_empresas_id);

// returns the associated object
return $this->sis_empresas;
}

Já la na classe de controle (AgdPadroesatendimentosFormList) tenho a chamada do get:

$column_id_empresa = new TDataGridColumn('{sis_empresas->emp_razaosocial}', 'Empresa', 'left');

O campo emp_razaosocial existe na tabela sis_empresas. O que posso estar fazendo de errado?



GS

Boa noite achei o problema.

Errado: $this->sis_empresas = new SisEmpresas($this->sis_empresas_id); Correto: $this->sis_empresas = new SisEmpresas($this->id_empresa);


Obrigado e abraço.