Conheça as melhorias da versão 8.0, 8.1, 8.2!
Clique aqui para saber mais
Problema ao Carregar Nome da Cidade da Tabela Cliente Boa tarde a todos, estou começando com Framework e não estou conseguindo coletar o nome da cidade para inserir no datagrid. Tenho a tabela chamada cliente, que por sua vez tem o id da cidade na coluna chamada cidade. model: ...
WS
Problema ao Carregar Nome da Cidade da Tabela Cliente  
Boa tarde a todos,

estou começando com Framework e não estou conseguindo coletar o nome da cidade para inserir no datagrid.
Tenho a tabela chamada cliente, que por sua vez tem o id da cidade na coluna chamada cidade.

model:

 
  1. <?php
  2. class Cliente extends TRecord
  3. {
  4. const TABLENAME = 'cliente';
  5. const PRIMARYKEY = 'id';
  6. const IDPOLICY = 'max'; // {max, serial}
  7. const CREATEDAT = 'created_at';
  8. const UPDATEDAT = 'updated_at';
  9. /**
  10. * Constructor method
  11. */
  12. public function __construct($id = NULL, $callObjectLoad = TRUE)
  13. {
  14. //aba cliente
  15. parent::__construct($id, $callObjectLoad);
  16. parent::addAttribute('razao');
  17. parent::addAttribute('fantasia');
  18. parent::addAttribute('tipo_pessoa');
  19. parent::addAttribute('cnpj_cpf');
  20. parent::addAttribute('ie_identidade');
  21. parent::addAttribute('inscricao_municipal');
  22. parent::addAttribute('contribuinte_icms');
  23. parent::addAttribute('data_nascimento');
  24. parent::addAttribute('ativo');
  25. parent::addAttribute('filial_id');
  26. parent::addAttribute('sexo');
  27. parent::addAttribute('grau_satisfacao');
  28. parent::addAttribute('data_cadastro');
  29. //aba endereço
  30. //parent::addAttribute('*condominio*');
  31. //parent::addAttribute('*CEP*');
  32. parent::addAttribute('endereco');
  33. parent::addAttribute('numero');
  34. parent::addAttribute('complemento');
  35. //parent::addAttribute('*pais*');
  36. parent::addAttribute('cidade');
  37. parent::addAttribute('uf');
  38. parent::addAttribute('cond_pagamento');
  39. parent::addAttribute('bairro');
  40. //aba contato
  41. //parent::addAttribute('*Telefone Residencial*');
  42. parent::addAttribute('telefone_comercial');
  43. parent::addAttribute('telefone_celular');
  44. //parent::addAttribute('*Telefone Celular 2*');
  45. parent::addAttribute('email');
  46. parent::addAttribute('contato');
  47. parent::addAttribute('hotsite_email');
  48. parent::addAttribute('hotsite_acesso');
  49. //aba CRM
  50. parent::addAttribute('crm');
  51. parent::addAttribute('id_canal_venda');
  52. parent::addAttribute('id_concorrente');
  53. parent::addAttribute('responsavel');
  54. parent::addAttribute('status_prospeccao');
  55. parent::addAttribute('participa_pre_cobranca');
  56. parent::addAttribute('cob_envia_email');
  57. parent::addAttribute('cob_envia_sms');
  58. //aba outros
  59. parent::addAttribute('id_conta');
  60. parent::addAttribute('id_vendedor');
  61. }
  62. public function get_cidade()
  63. {
  64. return Cidade::find($this->cidade);
  65. //$this->cidade = new Cidade( $this->cidade );
  66. //return $this->cidade;
  67. }
  68. public function get_uf()
  69. {
  70. return Estado::find($this->uf);
  71. }
  72. public function get_grupo()
  73. {
  74. return Grupo::find($this->grupo_id);
  75. }
  76. public function delete($id = null)
  77. {
  78. $id = isset($id) ? $id : $this->id;
  79. PessoaPapel::where('pessoa_id', '=', $this->id)->delete();
  80. parent::delete($id);
  81. }
  82. }
  83. ?>


Cliente List:
 
  1. <?php
  2. /**
  3. * ClienteList
  4. class ClienteList extends TPage
  5. {
  6. protected $form; // registration form
  7. protected $datagrid; // listing
  8. protected $pageNavigation;
  9. protected $formgrid;
  10. protected $deleteButton;
  11. use Adianti\base\AdiantiStandardListTrait;
  12. /**
  13. * Page constructor
  14. */
  15. public function __construct()
  16. {
  17. parent::__construct();
  18. $this->setDatabase('IXC_teste'); // defines the database
  19. $this->setActiveRecord('Cliente'); // defines the active record
  20. $this->setDefaultOrder('id', 'asc'); // defines the default order
  21. $this->setLimit(10);
  22. // $this->setCriteria($criteria) // define a standard filter
  23. $this->addFilterField('id', '=', 'id'); // filterField, operator, formField
  24. $this->addFilterField('razao', 'like', 'cliente'); // filterField, operator, formField
  25. $this->addFilterField('fantasia', 'like', 'cliente'); // filterField, operator, formField
  26. $this->addFilterField('fone', 'like', 'fone'); // filterField, operator, formField
  27. $this->addFilterField('endereco', 'like', 'logradouro'); // filterField, operator, formField
  28. $this->addFilterField('numero', '=', 'numero'); // filterField, operator, formField
  29. $this->addFilterField('bairro', '=', 'bairro'); // filterField, operator, formField
  30. $this->addFilterField('cidade', '=', 'cidade'); // filterField, operator, formField
  31. $this->addFilterField('uf', '=', 'estado'); // filterField, operator, formField
  32. $this->addFilterField('status_acesso', '=', 'status'); // filterField, operator, formField
  33. // creates the form
  34. $this->form = new BootstrapFormBuilder('form_search_Cliente');
  35. $this->form->setFormTitle('Cliente');
  36. // create the form fields
  37. $id = new TEntry('id');
  38. $cliente = new TEntry('razao_social');
  39. $fone = new TEntry('fone');
  40. $logradouro = new TEntry('endereco');
  41. $numero = new TEntry('numero');
  42. $bairro = new TEntry('bairro');
  43. $cidade = new TEntry('cidade');
  44. $uf = new TEntry('uf');
  45. $status = new TEntry('status_internet');
  46. //$grupo_id = new TDBUniqueSearch('grupo_id', 'IXC_teste', 'Grupo', 'id', 'nome');
  47. //$grupo_id->setMinLength(0);
  48. // add the fields
  49. $this->form->addFields( [ new TLabel('Id') ], [ $id ] );
  50. $this->form->addFields( [ new TLabel('Cliente') ], [ $cliente ] );
  51. $this->form->addFields( [ new TLabel('Fone') ], [ $fone ] );
  52. $this->form->addFields( [ new TLabel('Logradouro') ], [ $logradouro ] );
  53. $this->form->addFields( [ new TLabel('Número') ], [ $numero ] );
  54. $this->form->addFields( [ new TLabel('Bairro') ], [ $bairro ] );
  55. $this->form->addFields( [ new TLabel('Cidade') ], [ $cidade ] );
  56. $this->form->addFields( [ new TLabel('Estado') ], [ $uf ] );
  57. $this->form->addFields( [ new TLabel('Status Internet') ], [ $status ] );
  58. // set sizes
  59. $id->setSize('100%');
  60. $cliente->setSize('100%');
  61. $fone->setSize('100%');
  62. $logradouro->setSize('100%');
  63. $numero->setSize('100%');
  64. $bairro->setSize('100%');
  65. $cidade->setSize('100%');
  66. $uf->setSize('100%');
  67. $status->setSize('100%');
  68. // keep the form filled during navigation with session data
  69. $this->form->setData( TSession::getValue(__CLASS__.'_filter_data') );
  70. // add the search form actions
  71. $btn = $this->form->addAction(_t('Find'), new TAction([$this, 'onSearch']), 'fa:search');
  72. $btn->class = 'btn btn-sm btn-primary';
  73. $this->form->addActionLink(_t('New'), new TAction(['ClienteForm', 'onEdit']), 'fa:plus green');
  74. // creates a Datagrid
  75. $this->datagrid = new BootstrapDatagridWrapper(new TDataGrid);
  76. $this->datagrid->style = 'width: 100%';
  77. //$this->datagrid->datatable = 'true';
  78. // $this->datagrid->enablePopover('Popover', 'Hi <b> {name} </b>');
  79. // creates the datagrid columns
  80. $column_id = new TDataGridColumn('id', 'Id', 'left');
  81. $column_cliente = new TDataGridColumn('razao', 'Cliente', 'left');
  82. $column_fone = new TDataGridColumn('fone', 'Fone', 'left');
  83. $column_logradouro = new TDataGridColumn('endereco', 'Logradouro', 'left');
  84. $column_numero = new TDataGridColumn('numero', 'Número', 'left');
  85. $column_bairro = new TDataGridColumn('bairro', 'Bairro', 'left');
  86. $column_cidade = new TDataGridColumn('cidade->nome', 'Cidade', 'left');
  87. $column_uf = new TDataGridColumn('uf->nome', 'Estado', 'left');
  88. $column_status = new TDataGridColumn('status', 'Status', 'left');
  89. //$column_grupo_id = new TDataGridColumn('status_internet->nome', 'Status', 'left');
  90. //$column_grupo_id = new TDataGridColumn('grupo->nome', 'Grupo', 'left');
  91. $column_fone->enableAutoHide(500);
  92. // $column_email->enableAutoHide(500);
  93. // $column_grupo_id->enableAutoHide(500);
  94. // add the columns to the DataGrid
  95. $this->datagrid->addColumn($column_id);
  96. $this->datagrid->addColumn($column_cliente);
  97. $this->datagrid->addColumn($column_fone);
  98. $this->datagrid->addColumn($column_logradouro);
  99. $this->datagrid->addColumn($column_numero);
  100. $this->datagrid->addColumn($column_bairro);
  101. $this->datagrid->addColumn($column_cidade);
  102. $this->datagrid->addColumn($column_uf);
  103. $this->datagrid->addColumn($column_status);
  104. $column_id->setAction(new TAction([$this, 'onReload']), ['order' => 'id']);
  105. $column_cliente->setAction(new TAction([$this, 'onReload']), ['order' => 'cliente']);
  106. $action1 = new TDataGridAction(['ClienteFormView', 'onEdit'], ['id'=>'{id}', 'register_state' => 'false']);
  107. $action2 = new TDataGridAction(['ClienteForm', 'onEdit'], ['id'=>'{id}']);
  108. $action3 = new TDataGridAction([$this, 'onDelete'], ['id'=>'{id}', 'register_state' => 'false']);
  109. $this->datagrid->addAction($action1, _t('View'), 'fa:search gray');
  110. $this->datagrid->addAction($action2, _t('Edit'), 'far:edit blue');
  111. $this->datagrid->addAction($action3 ,_t('Delete'), 'far:trash-alt red');
  112. // create the datagrid model
  113. $this->datagrid->createModel();
  114. // creates the page navigation
  115. $this->pageNavigation = new TPageNavigation;
  116. $this->pageNavigation->setAction(new TAction([$this, 'onReload']));
  117. $panel = new TPanelGroup('', 'white');
  118. $panel->add($this->datagrid);
  119. $panel->addFooter($this->pageNavigation);
  120. // header actions
  121. $dropdown = new TDropDown(_t('Export'), 'fa:list');
  122. $dropdown->setPullSide('right');
  123. $dropdown->setButtonClass('btn btn-default waves-effect dropdown-toggle');
  124. $dropdown->addAction( _t('Save as CSV'), new TAction([$this, 'onExportCSV'], ['register_state' => 'false', 'static'=>'1']), 'fa:table blue' );
  125. $dropdown->addAction( _t('Save as PDF'), new TAction([$this, 'onExportPDF'], ['register_state' => 'false', 'static'=>'1']), 'far:file-pdf red' );
  126. $panel->addHeaderWidget( $dropdown );
  127. // vertical box container
  128. $container = new TVBox;
  129. $container->style = 'width: 100%';
  130. // $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  131. $container->add($this->form);
  132. $container->add($panel);
  133. parent::add($container);
  134. }
  135. }
  136. ?>


O problema está quando chamo o grid e o nome da cidade nao vem. a mensagem: "Tentativa de uma propriedade não existente(cidade->nome)".
Creio que ao tentar coletar o id da cidade com o comando parent::addAttribute('cidade'), ele não está sendo coletado.

Alguem poderia me dar uma ajuda quanto a isso?

desde já agradeço.

William

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


TB

Você fez a referência com associação na Model?
precisa ter um set e get para cidade, que está em outra tabela.

um exemplo que tenho aqui..

na model
private $turmas; // propriedade de classe


métodos get e set
public function set_turmas(Turmas $object)
{
$this->turmas = $object;
$this->turmas_id = $object->id;
}

public function get_turmas()
{
// loads the associated object
if (empty($this->turmas))
$this->turmas = new Turmas($this->turmas_id);

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

tb sou novato, espero que ajude.


WS

Tales Bogoni, um bom dia!

isso já fiz... o que está estranho é que se no metodo get que está abaixo eu coloco o id da cidade tipo 4375, será exibido normalmente. Mas se eu faço como está abaixo, mesmo fazendo o ( parent::addAttribute('cidade'); ) não funciona.
Se tivesse jeito de visualizar o que está sendo recebido no constructor, de repente seria legal...

 
  1. <?php
  2. public function get_cidade()
  3. {
  4. return Cidade::find($this->cidade);
  5. }
  6. ?>


ainda não resolvi.. caso alguem saiba o que possa ser, me ajudaria bastante!

Obrigado.
LG

vamos lá, veja só.. você tem uma propriedade no model chamada 'cidade' adicionada por meio de
 
  1. <?php
  2. parent::addAttribute('cidade');
  3. ?>

e criou um relacionamento para obter o objeto cidade por meio dessa propriedade:
 
  1. <?php
  2. public function get_cidade()
  3. {
  4. return Cidade::find($this->cidade);
  5. }
  6. ?>

o problema é que está com o mesmo nome, pois dessa gera uma grande confusão, o ideal é quando trabalhar com chaves enstrangeiras, no proprio banco já seguir o modelo nome_propriedade_id, assim na tabela cliente deveria ser "cidade_id",

se não for possível mudar no banco, mude o nome do metodo get_cidade para ficar diferente. e ajuste na data grid
WS

Leandro Gama, eu pensei nisso tambem.. o problema é que estou fazendo uma pequena integração entre sistemas e não consigo mudar no banco mesmo...
vou tentar fazer o que me sujeriu e retorno com resultado...
obrigado!
WS

Bom dia Leandro Gama,
fiquei de dar retorno sobre o resultado. Era isso mesmo, muito obrigado!