Lançado Adianti Framework 7.6!
Clique aqui para saber mais
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 completo Meu Negócio Pronto
Use para si, ou transforme em um negócio: Inclui aulas e códigos-fontes
Gestor de conteúdo (SITE) + Loja Virtual (E-Commerce) + Emissor de Notas para infoprodutos


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



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.