Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Manter combos dependentes preenchidas Bom dia! estou com problemas nas TDBCombos que dependem de outra TDBCombo para exibir os valores. Ex: tem uma TDBCombo para 'locais' a partir dela carrega outra TDBCombo 'itens' que também carrega outra TDBCombo 'atividades'. No momento de inserir um novo registro tudo bem, as funções no 'onChange' estão funcionando perfeitamente, o problema é na hora de editar que somente a primeira TDBC...
BI
Manter combos dependentes preenchidas  
Fechado
Bom dia!

estou com problemas nas TDBCombos que dependem de outra TDBCombo para exibir os valores.
Ex: tem uma TDBCombo para 'locais' a partir dela carrega outra TDBCombo 'itens' que também carrega outra TDBCombo 'atividades'. No momento de inserir um novo registro tudo bem, as funções no 'onChange' estão funcionando perfeitamente, o problema é na hora de editar que somente a primeira TDBCombo é carregada, dependendo do usuario para carregar as outras duas novamente,

alguem já passou por isso? pode me ajudar?

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


RC

Para ajustar este comportamento, você deve ajustar a função onEdit do TForm para que carregue os dados de todas as combos novamente.
Lembrando que pode usar as funções abaixo para carregar as combos:
  1. <?php
  2. TCombo::reload'form_Fatura''curso_id', array($object) );
  3. TSelect::reload'form_Fatura''data_vencimento', array($object) );            
  4. ?>
BI

Boa tarde!
Obrigado pela solução, porem ainda não sei como utilizar o código, pode me dar um exemplo mais claro?
eu implemento a sua solução no onEdit, como?

  1. <?php 
  2.     
  3.     function onEdit($param)
  4.     {
  5.         try
  6.         {
  7.             if (isset($param['key']))
  8.             {
  9.                 $key=$param['key'];  // get the parameter $key
  10.                 TTransaction::open('sqlserver'); // open a transaction
  11.                 $object = new Evento_aplicacao($key); // instantiates the Active Record
  12.                 $this->form->setData($object); // fill the form
  13.                 TTransaction::close(); // close the transaction
  14.             }
  15.             else
  16.             {
  17.                 $this->form->clear();
  18.             }
  19.         }
  20.         catch (Exception $e// in case of exception
  21.         {
  22.             new TMessage('error''<b>Error</b> ' $e->getMessage()); // shows the exception error message
  23.             TTransaction::rollback(); // undo all pending operations
  24.         }
  25.     }
  26. ?>
PD

Betuel,

No tutor tem um exemplo, veja:
www.adianti.com.br/framework_files/tutor/index.php?class=FormInterac

Veja que ela mantem os valores da combo dependente.
Para atingir tal comportamento, você deve usar o método TForm::sendData(),
passando um objeto em que os atributos serão os campos que "disparam"
ações. Esse método irá mandar os campos ao formulário via javascript,
e irá aguardar um campo ser carregado, para então carregar o próximo.

Att,
BI

Muito obrigado, funcionou!!!
PA

Betuel, boa noite!
Eu ainda estou tendo problemas para reposicionar TDBCombos após inclusões.
Vou passar meu contato e agradeço se puder me responder para trocarmos ajuda.
Abraços,
Paulo Arcanjo
p.arcanjo@gmail.com
EB

Olá Betuel

Estou passando por um problema muito parecido com esse seu! Onde trabalho com duas TCombos uma para categorias e a outra para subcategorias, sendo que essa segunda funciona de forma dinâmica a depender da seleção da primeira.

No meu caso está salvando normalmente no banco o valor da segunda TCombo. A questão é que quando salva e devolve pro formulário os dados, ou quando vou editar o registro, o valor que vem selecionado é o primeiro e não o que está salvo no banco

Agradeço imensamente quem puder me ajudar, pois já bati de todos os lados e não consigo colocar essas benditas TCombos pra funcionarem dinamicamente.

Segue o código da minha classe ProdutoFormView.class.php
  1. <?php
  2. class ProdutoFormView extends TPage {
  3.     protected $form;
  4.     function __construct() {
  5.         parent::__construct();
  6.         $this->form = new TForm('form_Produto');
  7.         $this->form->class 'tform'// CSS class
  8.         $this->form->style 'width: 500px';
  9.         $table = new TTable;
  10.         $table->width '100%';
  11.         $this->form->add($table);
  12.         $row $table->addRow();
  13.         $row->class 'tformtitle';
  14.         $row->addCell(new TLabel('Produto'))->colspan 2;
  15.         $id = new TEntry('id');
  16.         $categoria_id = new TDBCombo('categoria_id''permission''Categoria''id''categoria''categoria');
  17.         $subcategoria_id = new TCombo('subcategoria_id');
  18.         $unidade_id = new TDBCombo('unidade_id''permission''UnidadeProduto''id''descricao''descricao');
  19.         $descricao = new TEntry('descricao');
  20.         $especificacoes = new TText('especificacoes');
  21.         $valor_entrada = new TEntry('valor_entrada');
  22.         $valor_saida = new TEntry('valor_saida');
  23.         $observacoes = new TText('observacoes');
  24.         $id->setSize(60);
  25.         $categoria_id->setSize(200);
  26.         $subcategoria_id->setSize(200);
  27.         $unidade_id->setSize(200);
  28.         $descricao->setSize(200);
  29.         $especificacoes->setSize(20040);
  30.         $valor_entrada->setSize(200);
  31.         $valor_saida->setSize(200);
  32.         $observacoes->setSize(20040);
  33.         $id->setEditable(FALSE);
  34.         $valor_entrada->setNumericMask(2',''.');
  35.         $valor_saida->setNumericMask(2',''.');
  36.         $categoria_id->setChangeAction(new TAction(array($this'onChangeCombo')));
  37.         // validations
  38.         $categoria_id->addValidation('Categoria', new TRequiredValidator);
  39.         $subcategoria_id->addValidation('Subcategoria', new TRequiredValidator);
  40.         $unidade_id->addValidation('Unidade', new TRequiredValidator);
  41.         // add one row for each form field
  42.         $table->addRowSet(new TLabel('ID:'), $id);
  43.         $table->addRowSet($label_categoria_id = new TLabel('Categoria:'), $categoria_id);
  44.         $label_categoria_id->setFontColor('#FF0000');
  45.         $table->addRowSet($label_subcategoria_id = new TLabel('Subcategoria:'), $subcategoria_id);
  46.         $label_subcategoria_id->setFontColor('#FF0000');
  47.         $table->addRowSet($label_unidade_id = new TLabel('Unidade:'), $unidade_id);
  48.         $label_unidade_id->setFontColor('#FF0000');
  49.         $table->addRowSet(new TLabel('Descrição:'), $descricao);
  50.         $table->addRowSet(new TLabel('Especificações:'), $especificacoes);
  51.         $table->addRowSet(new TLabel('Valor entrada:'), $valor_entrada);
  52.         $table->addRowSet(new TLabel('Valor saída:'), $valor_saida);
  53.         $table->addRowSet(new TLabel('Observações:'), $observacoes);
  54.         $this->form->setFields(array($id$categoria_id$subcategoria_id$unidade_id$descricao$especificacoes$valor_entrada$valor_saida$observacoes));
  55.         $save_button TButton::create('save', array($this'onSave'), _t('Save'), 'ico_save.png');
  56.         $new_button TButton::create('new', array($this'onEdit'), _t('New'), 'ico_new.png');
  57.         $this->form->addField($save_button);
  58.         $this->form->addField($new_button);
  59.         $buttons_box = new THBox;
  60.         $buttons_box->add($save_button);
  61.         $buttons_box->add($new_button);
  62.         $row $table->addRow();
  63.         $row->class 'tformaction';
  64.         $row->addCell($buttons_box)->colspan 2;
  65.         parent::add($this->form);
  66.     }
  67.     function onSave($param) {
  68.         try {
  69.             TTransaction::open('permission');
  70.             $object $this->form->getData('Produto');
  71.             $this->form->validate();
  72.             $object->store();
  73.             $repository = new TRepository('Subcategoria');
  74.             $criteria = new TCriteria;
  75.             $criteria->add(new TFilter('categoria_id''='$object->categoria_id));
  76.             $criteria->setProperty('order''name');
  77.             $object1 $repository->load($criteriaFALSE);
  78.             $itens = array();
  79.             foreach ($object1 as $obj) {
  80.                 $itens[$obj->id] = $obj->name;
  81.             }
  82.             TCombo::reload('form_Produto''subcategoria_id'$itens);
  83.             /* Já tentei assim também e nada de funcionar */
  84.             //TForm::sendData('form_Produto', $object);
  85.             $this->form->setData($object);
  86.             TTransaction::close();
  87.             new TMessage('info'TAdiantiCoreTranslator::translate('Record saved'));
  88.         } catch (Exception $e) {
  89.             new TMessage('error''<b>Error</b> ' $e->getMessage()); // shows the exception error message
  90.             $this->form->setData($this->form->getData());
  91.             TTransaction::rollback();
  92.         }
  93.     }
  94.     function onEdit($param) {
  95.         try {
  96.             if (isset($param['key'])) {
  97.                 $key $param['key'];
  98.                 TTransaction::open('permission');
  99.                 $object = new Produto($key);
  100.                 $this->form->setData($object);
  101.                 TTransaction::close();
  102.             } else {
  103.                 $this->form->clear();
  104.             }
  105.         } catch (Exception $e) {
  106.             new TMessage('error''<b>Error</b> ' $e->getMessage());
  107.             TTransaction::rollback();
  108.         }
  109.     }
  110.     static function onChangeCombo($param) {
  111.         $categoria $param['categoria_id'];
  112.         TTransaction::open('permission');
  113.         $repository = new TRepository('Subcategoria');
  114.         $criteria = new TCriteria;
  115.         $criteria->add(new TFilter('categoria_id''='$categoria));
  116.         $criteria->setProperty('order''name');
  117.         $object $repository->load($criteriaFALSE);
  118.         $itens = array();
  119.         foreach ($object as $obj) {
  120.             $itens[$obj->id] = $obj->name;
  121.         }
  122.         TCombo::reload('form_Produto''subcategoria_id'$itens);
  123.     }
  124. }
  125. ?>


Vou deixar meu email para quem puder me ajudar e quiser entrar em contato: edilanebzrra@gmail.com

BI

Olá, boa tarde!

No onEdit(), antes de fechar a conexão tem isso: <$this->form->setData($object);>
porem o setdata não carrega as combos, então vc tem que usar o sendData...

<TForm::sendData('nome_formulario', $object);>

espero ter ajudado.
LF

Olá pessoal, estou tendo o mesmo problema, mas não no Cadastro, na listagem.
Quando realizo uma pesquisa, armazeno os dados do filtro na sessão, então retorno pelo TSession::getValue.
  1. <?php
  2. $this->form->setDataTSession::getValue('Endereco_filter_data') );
  3. ?>

Sei que o setData não atualiza os combos, a questão é que por se tratar do campo de filtragem, tenho setData no Construct e no onSearch.
Implementei uma forma de atualizar com os onChange, e passei pelo TForm::sendData, mas não está rolando.

  1. <?php
  2.         $data TSession::getValue('Endereco_filter_data');
  3.         $obj = new stdClass;
  4.         $obj->estado_id $data->estado_id;
  5.         $obj->municipio_id $data->municipio_id;
  6.         $obj->bairro_id $data->bairro_id;
  7.         $obj->logradouro_id $data->logradouro_id;
  8.         TForm::sendData('form_search_Endereco'$obj);
  9.         $this->form->setDataTSession::getValue('Endereco_filter_data') );
  10. ?>


Basicamente, isto se trata de um cadastro de endereços. Então, alimentei a como Estado com um TDBCombo e as demais usei TCombo que alimento dinamicamente com os métodos

  1. <?php 
  2. /**
  3.      * Action to be executed when the user changes the Estado combo_change field
  4.      */
  5.     public static function onChangeEstado($param)
  6.     {
  7.         try {
  8.             TTransaction::open('jubaro');
  9.             $options = [""=>""];
  10.             if($param['estado_id']){
  11.                 $criteria = new TCriteria;
  12.                 $criteria->add( new TFilter'estado_id''='$param['estado_id'] ));
  13.                 $options Municipio::getIndexedArray('municipio_id','municipio_nome',$criteria);
  14.             }
  15.             
  16.             TCombo::reload('form_search_Endereco''municipio_id'$options,TRUE);
  17.             TTransaction::close();
  18.             
  19.         } catch (Exception $e) {
  20.             new TMessage('error'$e->getMessage()); // shows the exception error message
  21.         }
  22.     }
  23.     /**
  24.      * Action to be executed when the user changes the Cidade combo_change field
  25.      */
  26.     public static function onChangeMunicipio($param)
  27.     {
  28.         try {
  29.             TTransaction::open('banco');
  30.             
  31.             $options_bairro = [];
  32.             $options_logradouro = [];
  33.             if(!empty($param['municipio_id'])){
  34.                 // Add Bairros
  35.                 $bairros Bairro::where('municipio_id''='$param['municipio_id'])->orderby('bairro_nome')->load();
  36.                 if($bairros){
  37.                     foreach ($bairros as $bairro) {
  38.                         $options_bairro[$bairro->bairro_id] = $bairro->bairro_nome;
  39.                     }    
  40.                 }
  41.                 // Add Logradouros
  42.                 $logradouros Logradouro::where('municipio_id''='$param['municipio_id'])->orderby('logradouro_nome')->load();
  43.                 if($logradouros){
  44.                     foreach ($logradouros as $logradouro) {
  45.                         $options_logradouro[$logradouro->logradouro_id] = $logradouro->logradouro_tipo->logradouro_tipo_nome.' '.$logradouro->logradouro_nome;
  46.                     }    
  47.                 }    
  48.             }
  49.             
  50.             TCombo::reload('form_search_Endereco''bairro_id'$options_bairro,TRUE);
  51.             TCombo::reload('form_search_Endereco''logradouro_id'$options_logradouro,TRUE);
  52.             TTransaction::close();
  53.             
  54.             
  55.         } catch (Exception $e) {
  56.             new TMessage('error'$e->getMessage()); // shows the exception error message
  57.         }
  58.     }
  59. ?>

Alguém pode me ajudar?