Lançado Adianti Framework 7.6!
Clique aqui para saber mais
TCombo + onChangeAction Boa tarde! Estou encontrando dificuldades para utilizar a função TCombo::reload('form_Enderecos', 'cidade', $item); ele recarrega a combo quando quer, é um form de cadastro de endereço e a combo de cidades é feito um reload de com a UF selecionada, porém não está carregando. Utilizei como base o exemplo: http://www.adianti.com.br/framework_files/tutor/index.php?class=FormInteractionsV...
MF
TCombo + onChangeAction  
Fechado
Boa tarde!

Estou encontrando dificuldades para utilizar a função TCombo::reload('form_Enderecos', 'cidade', $item);
ele recarrega a combo quando quer, é um form de cadastro de endereço e a combo de cidades é feito um reload de com a UF selecionada, porém não está carregando.
Utilizei como base o exemplo: www.adianti.com.br/framework_files/tutor/index.php?class=FormInterac

Grato.

  1. <?php
  2. /**
  3.  * EnderecosForm Registration
  4.  * @author  <your name here>
  5.  */
  6. class EnderecosForm extends TWindow
  7. {
  8.     protected $form// form
  9.     
  10.     /**
  11.      * Class constructor
  12.      * Creates the page and the registration form
  13.      */
  14.     function __construct()
  15.     {
  16.         parent::__construct();
  17.         parent::setSize(750520); 
  18.         
  19.         // creates the form
  20.         $this->form = new TForm('form_Enderecos');
  21.         $this->form->class 'tform'// CSS class
  22.         $this->form->style 'width: 500px';
  23.         
  24.         // add a table inside form
  25.         $table = new TTable;
  26.         $table-> width '100%';
  27.         $this->form->add($table);
  28.         
  29.         // add a row for the form title
  30.         $row $table->addRow();
  31.         $row->class 'tformtitle'// CSS class
  32.         $row->addCell( new TLabel('Endereços') )->colspan 2;
  33.         
  34.         // create the form fields
  35.         $logradouro                     = new TEntry('logradouro');
  36.         $bairro                         = new TEntry('bairro');
  37.         $uf                             = new TCombo('uf');
  38.         $cidade                         = new TCombo('cidade');        
  39.         $cep                            = new TEntry('cep');
  40.         $complemento                    = new TEntry('complemento');
  41.         $numero                         = new TEntry('numero');
  42.         $apto                           = new TEntry('apto');
  43.         1149tipo                         = new TCombo('idtipo');
  44.         
  45.         //Preenche combo
  46.         
  47.         $_uf = new Ufs();
  48.         $itens_uf = array();
  49.         $collection_uf $_uf->get_ufs();
  50.         foreach($collection_uf as $object)
  51.         {
  52.             $itens_uf[$object->iduf] = $object->estado;
  53.         }
  54.         $uf->addItems($itens_uf);
  55.         
  56.         $classe = new Classe();
  57.         $itens_tipo = array();
  58.         $collection_tipo $classe->get_enderecos_tipo();
  59.         foreach($collection_tipo as $object)
  60.         {
  61.             $itens_tipo[] = $object['descricao'];
  62.         }
  63.         1149tipo->addItems($itens_tipo);
  64.         // define the sizes
  65.         $logradouro->setSize(300);
  66.         $bairro->setSize(200);
  67.         $uf->setSize(60);
  68.         $cidade->setSize(200);        
  69.         $cep->setSize(200);
  70.         $complemento->setSize(200);
  71.         $numero->setSize(200);
  72.         $apto->setSize(200);
  73.         1149tipo->setSize(100);
  74.         // add one row for each form field
  75.         $table->addRowSet( new TLabel('Tipo:'), 1149tipo );
  76.         $table->addRowSet( new TLabel('Logradouro:'), $logradouro );
  77.         $table->addRowSet( new TLabel('Número:'), $numero );
  78.         $table->addRowSet( new TLabel('Complemento:'), $complemento );
  79.         $table->addRowSet( new TLabel('Apto:'), $apto );
  80.         $table->addRowSet( new TLabel('Bairro:'), $bairro );      
  81.         $table->addRowSet( new TLabel('UF:'), $uf );
  82.         $table->addRowSet( new TLabel('Cidade:'), $cidade );                
  83.         $table->addRowSet( new TLabel('CEP:'), $cep );
  84.         
  85.         $uf_action = new TAction(array($this'onChangeAction'));
  86.         $uf->setChangeAction($uf_action);
  87.         $this->form->setFields(array($logradouro,$bairro,$cidade,$uf,$cep,$complemento,$numero,$apto,1149tipo));
  88.         // create the form actions
  89.         $save_button TButton::create('save', array($this'onSave'), _t('Save'), 'ico_save.png');
  90.         
  91.         $this->form->addField($save_button);
  92.         
  93.         $buttons_box = new THBox;
  94.         $buttons_box->add($save_button);
  95.         
  96.         // add a row for the form action
  97.         $row $table->addRow();
  98.         $row->class 'tformaction'// CSS class
  99.         $row->addCell($buttons_box)->colspan 2;
  100.         
  101.         parent::add($this->form);
  102.     }   
  103.     
  104.     function onLoad(){}
  105.     
  106.     public static function onChangeAction($param)
  107.     {
  108.         try
  109.         {           
  110.             $object = new StdClass;           
  111.             $object->iduf $param['uf'];
  112.             $ufs = new Ufs;
  113.             $rs $ufs->get_cidades_uf($object->iduf);
  114.               
  115.             $item = array();
  116.             foreach($rs as $r)
  117.             {
  118.                 $item[] = $r['cidade'];
  119.             }
  120.                            
  121.             TCombo::reload('form_Enderecos''cidade'$item);
  122.         }
  123.         catch (Exception $e)
  124.         {
  125.             new TMessage('error',$e->getMessage());
  126.         }
  127.         
  128.     }
  129. }

Pacotão Dominando o Adianti Framework 7
O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado! Versão 7.4


Dominando o Adianti 7 Quero me inscrever agora!

Comentários (13)


FC

Olhei rápido e percebo que a forma como carrega os dados na combo está "diferente" vc usa os dados de uma tabela? tente seguir esse exemplo www.adianti.com.br/framework_files/tutor/index.php?class=FormDBManua na hora de carregar os dados.

Parece que o metodo tcombo::onreload não consegue interpretar pois ela não tem nada para recarregar.
MF

Sim, estou carregando os dados de uma tabela.
Esse exemplo eu já utilizo para carregar as UFs, ao selecionar a UF a consulta funciona corretamente, tanto que se colocar um var_dump vai mostrar a resposta certo a cada seleção de UF, não estou entendo o pq não preenche a combo da cidade.
FC

da um var_dump no $item dentro da função.
MF

Isso aí.
PD

Outra coisa,

O vetor $item não está indexado:
  1. <?php
  2. $item$colocar_indice_aqui_neste_lugar ] = $r['cidade']; 
  3. ?>


Att,
MF

Feito!! Funcionou.
TL

Olá,

Estou com este mesmo problema, mas mesmo indexando não consigo fazer funcionar.
Percebi que se eu limitar o número de municípios para 100 funciona normalmente.
Segue o código.

foreach ($municipios as $municipio){
$items[$municipio->id] = $municipio->nome;
}

Grato.
PD

Para muitos dados use TDBMultiSearch.
TL

Olá,

Resolvi o problema.
O TCombo funciona corretamente. O problema é que algumas cidades brasileiras tem aspas simples no nome e isto quebra o script de atualização da página.
Usei um caractere de escape e funcionou.
EB

Oi Matheus Freitas, como você solucionou seu problema? Estou fazendo algo parecido, só que meus campos são categoria (TDBCombo) e subcategoria (TCombo). Quando seleciono uma categoria ele deve trazer as subcategorias relacionadas.

Está salvando normalmente, só que não está carregando de volta no formulário a subcategoria.

Alguém pode me ajudar por favor.

Segue minha classe:
  1. <?php
  2. class ProdutoFormView extends TStandardForm {
  3.     protected $form;
  4.     function __construct() {
  5.         parent::__construct();
  6.         $this->form = new TQuickForm('form_Produto');
  7.         $this->form->setFormTitle('Produtos e Serviços');
  8.         $this->form->class 'tform';
  9.         // defines the database
  10.         parent::setDatabase('permission');
  11.         // defines the active record
  12.         parent::setActiveRecord('Produto');
  13.         $id = new TEntry('id');
  14.         $id->setEditable(false);
  15.         $categoria = new \Adianti\Widget\Wrapper\TDBCombo('categoria_id','permission','Categoria','id','categoria','categoria');        
  16.         $categoria->setChangeAction(new TAction(array($this'onChangeCombo')));
  17.         $sub_categoria = new \Adianti\Widget\Form\TCombo('subcategoria_id');
  18.         $unidade = new \Adianti\Widget\Wrapper\TDBCombo('unidade_id','permission','UnidadeProduto','id','descricao','descricao');
  19.         $descricao = new \Adianti\Widget\Form\TEntry('descricao');
  20.         $especificacoes = new \Adianti\Widget\Form\TText('especificacoes');
  21.         $valor_entrada = new \Adianti\Widget\Form\TEntry('valor_entrada');
  22.         $valor_saida = new \Adianti\Widget\Form\TEntry('valor_saida');
  23.         $observacoes = new Adianti\Widget\Form\TText('observacoes');
  24.         // add the fields
  25.         $this->form->addQuickField('ID'$id50);
  26.         $this->form->addQuickField('Categoria' ': '$categoria200);
  27.         $this->form->addQuickField('Subcategoria' ': '$sub_categoria200);
  28.         $this->form->addQuickField('Unidade' ': '$unidade200);
  29.         $this->form->addQuickField('Descricao' ': '$descricao400);
  30.         $this->form->addQuickField('Especificações' ': '$especificacoes200);
  31.         $this->form->addQuickField('Valor entrada' ': '$valor_entrada200);
  32.         $this->form->addQuickField('Valor saída' ': '$valor_saida200);        
  33.         $this->form->addQuickField('Observações' ': '$observacoes200);
  34.         
  35.         $especificacoes->setSize(40070);
  36.         $valor_entrada->setNumericMask(2',''.');
  37.         $valor_saida->setNumericMask(2',''.');                      
  38.         $observacoes->setSize(40070);
  39.         // validations
  40.         $categoria->addValidation(('Categoria'), new TRequiredValidator);        
  41.         $sub_categoria->addValidation(('Subcategoria'), new TRequiredValidator);
  42.         $unidade->addValidation(('Unidade'), new TRequiredValidator);
  43.         $descricao->addValidation(('Descrição'), new TRequiredValidator);                               
  44.         // add form actions
  45.         $this->form->addQuickAction(_t('Save'), new TAction(array($this'onSave')), 'ico_save.png');
  46.         $this->form->addQuickAction(_t('New'), new TAction(array($this'onEdit')), 'ico_new.png');
  47.         $this->form->addQuickAction(_t('Back to the listing'), new TAction(array('CentroCustoDataGrid''onReload')), 'ico_datagrid.png');
  48.         $container = new TTable;
  49.         $container->style 'width: 80%';
  50.         $container->addRow()->addCell(new TXMLBreadCrumb('menu.xml''CentroCustoDataGrid'));
  51.         $container->addRow()->addCell($this->form);
  52.         // add the form to the page
  53.         parent::add($container);
  54.     }
  55.     
  56.     static function onChangeCombo($param)
  57.     {
  58.         $categoria $param['categoria_id'];
  59.         TTransaction::open('permission');
  60.         $repository = new TRepository('Subcategoria');
  61.         $criteria = new TCriteria;
  62.         $criteria->add( new TFilter('categoria_id','=',$categoria));
  63.         $criteria->setProperty('order''name');
  64.         $object $repository->load($criteria,FALSE);
  65.         $itens = array();       
  66.         foreach ($object as $obj)
  67.         {
  68.             $itens[$obj->id] = $obj->name;
  69.         }
  70.         TCombo::reload('form_Produto','subcategoria_id'$itens);
  71.     }
  72.     function onSave() {
  73.         try {
  74.             TTransaction::open('permission');
  75.             $object $this->form->getData('Produto');              
  76.             $this->form->validate();    
  77.             
  78.             $object->store();            
  79.             $this->form->setData($object);
  80.             TTransaction::close();
  81.             new TMessage('info'TAdiantiCoreTranslator::translate('Record saved'));
  82.         } catch (Exception $e) {
  83.             new TMessage('error''<b>Error</b> ' $e->getMessage());
  84.             TTransaction::rollback();
  85.         }
  86.     }
  87.     
  88.         function onEdit($param) {
  89.         try {
  90.             if (isset($param['key'])) {
  91.                 $key $param['key'];
  92.                 TTransaction::open('permission');
  93.                 $object = new Produto($key);
  94.                 $this->form->setData($object);
  95.                 TTransaction::close();
  96.             } else {
  97.                 $this->form->clear();
  98.             }
  99.         } catch (Exception $e) {
  100.             new TMessage('error''<b>Error</b> ' $e->getMessage());
  101.             TTransaction::rollback();
  102.         }
  103.     }
  104. }
  105. ?>




PD

Edilaine,

Habilite os erros do PHP, observe o console do browser.
E use uns var_dump(), para ver se está executando.

Use try/catch e lembre de fechar a transação no onChangeCombo().
Por que você está conectando à base "permission" ?
Não deveria conectar à base de seu projeto?

Att,
EB

Olá Pablo.

Eu criei minhas tabelas nessa mesma base 'permission'!

Coisa de iniciante. Nem me atentei a isso :-)
IG

Estou com um problema no tcombo do theme4, pois ele preenche o combo normalmente, mas na edição não seleciona o valor que vem do banco, alguém sabe o motivo???