Combo hierárquica UF - CIDADE - CLIENTE Olá Pessoal! Seguinte: Tenho uma Tabela de Estado, Cidade e outra de Pessoa devidamente associadas com chaves estrangeiras e com suas Classes também criadas. Fiz uma classe ClienteList que por sua vez traz todos os dados da Classe Cliente além de 'nome_cidade' e 'nome_estado' ( via get_nome_estado e get_nome_cidade implementado na Classe Cliente) Até aí tudo perfeito. O problem...
JD
Combo hierárquica UF - CIDADE - CLIENTE  
Fechado
Olá Pessoal!

Seguinte:

Tenho uma Tabela de Estado, Cidade e outra de Pessoa devidamente associadas com chaves estrangeiras e com suas Classes também criadas.

Fiz uma classe ClienteList que por sua vez traz todos os dados da Classe Cliente além de 'nome_cidade' e 'nome_estado' ( via get_nome_estado e get_nome_cidade implementado na Classe Cliente)

Até aí tudo perfeito. O problema é que quando eu clico em um cliente e vai para o modo edição, aparece somente a combo cidade preenchida, já a combo estado fica em branco.

Alguma luz?
Obrigado.

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


AC

Acredito que teria que postar o código para que possamos ajudar. Vale lembrar que se está bem normalizado, na tabela de cliente haverá somente o código da cidade (o do estado não), e na tabela de cidade tem o código do estado. Está modelado assim?

Não cheguei a implementar algo assim nesse framework, fiquei curioso de qual a forma mais recomendada nesse caso.
JD

Sim,
na tabela de CLIENTE tem o id_cidade
na tabela CIDADE tem o id_estado
E a tabela estado é composta por id, nome e sigla

Como recuperar o Estado (UF) no edit do form abaixo que é aberto apos um clique na lista de clientes?

 
  1. <?php
  2. /**
  3. * ClienteForm Registration
  4. * @author <your name here>
  5. */
  6. class ClienteForm extends TPage
  7. {
  8. protected $form; // form
  9. use Adianti\Base\AdiantiStandardFormTrait; // Standard form methods
  10. /**
  11. * Class constructor
  12. * Creates the page and the registration form
  13. */
  14. function __construct()
  15. {
  16. parent::__construct();
  17. $this->setDatabase('estoque'); // defines the database
  18. $this->setActiveRecord('Cliente'); // defines the active record
  19. // creates the form
  20. $this->form = new TQuickForm('form_Cliente');
  21. $this->form->class = 'tform'; // change CSS class
  22. $this->form->style = 'display: table;width:100%'; // change style
  23. // define the form title
  24. $this->form->setFormTitle('Cliente');
  25. // create the form fields
  26. $id = new TEntry('id');
  27. $nome = new TEntry('nome');
  28. //...
  29. $id_estado = new TDBCombo('estado','estoque','Estado','id','nome');
  30. $id_cidade = new TCombo('id_cidade');
  31. $nova_cidade = new TButton('Nova Cidade');
  32. // add the fields
  33. $this->form->addQuickField('Id', $id, 100 );
  34. $this->form->addQuickField('Nome', $nome, 200 , new TRequiredValidator);
  35. $this->form->addQuickField('Estado', $id_estado, 200 );
  36. $this->form->addQuickFields('Cidade', array($id_cidade, $nova_cidade ));
  37. $nova_cidade_act = new TAction(array('CidadeForm', 'onEdit'));
  38. $nova_cidade->setAction($nova_cidade_act, 'Nova Cidade');
  39. $change_action = new TAction(array($this, 'onChangeAction'));
  40. $id_estado->setChangeAction($change_action);
  41. if (!empty($id))
  42. {
  43. $id->setEditable(FALSE);
  44. }
  45. // open database transaction
  46. TTransaction::open('estoque');
  47. // items repository
  48. $repository = new TRepository('Cidade');
  49. // load all objects
  50. $collection = $repository->load(new TCriteria);
  51. // add the combo items
  52. $items = array();
  53. foreach ($collection as $object)
  54. {
  55. $items[$object->id] = $object->nome;
  56. }
  57. $id_cidade->addItems($items);
  58. TTransaction::close();
  59. /** samples
  60. $this->form->addQuickFields('Date', array($date1, new TLabel('to'), $date2)); // side by side fields
  61. $fieldX->addValidation( 'Field X', new TRequiredValidator ); // add validation
  62. $fieldX->setSize( 100, 40 ); // set size
  63. **/
  64. // create the form actions
  65. $this->form->addQuickAction(_t('Save'), new TAction(array($this, 'onSave')), 'fa:floppy-o');
  66. $this->form->addQuickAction(_t('New'), new TAction(array($this, 'onEdit')), 'bs:plus-sign green');
  67. // vertical box container
  68. $container = new TVBox;
  69. $container->style = 'width: 90%';
  70. // $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  71. $container->add($this->form);
  72. parent::add($container);
  73. }
  74. public static function onChangeAction($param)
  75. {
  76. $obj = new StdClass;
  77. TForm::sendData('form_Cliente', $obj);
  78. // open database transaction
  79. TTransaction::open('estoque');
  80. $criteria = new TCriteria;
  81. print_r($param);
  82. $criteria->add(new TFilter('id_estado', '=', $param['estado']));
  83. $criteria->setProperty('order', 'nome');
  84. // items repository
  85. $repository = new TRepository('Cidade');
  86. // load all objects
  87. $collection = $repository->load($criteria);
  88. // add the combo items
  89. $items = array();
  90. foreach ($collection as $object)
  91. {
  92. $items[$object->id] = $object->nome;
  93. }
  94. TTransaction::close();
  95. TCombo::reload( 'form_Cliente', 'id_cidade', $items );
  96. }
  97. }
  98. ?>



Uma outra dúvida é a seguinte:

Se percebeu, coloquei um botao que abre uma Twindow com o cadastro de Cidades. Como faço para que os dados desse form sejam atualizados para conter a cidade cadastrada no TWindow?



Obrigado.
</your>
PD

No onEdit, é preciso enviar o valor para o campo via Javascript:

$obj = new stdClass;
$obj->state_id = $object->state_id;
$obj->city_id = $object->city_id;
TForm::sendData('form_taltal', $obj);

Na próxima versão teremos um exemplo pronto disto.