Conheça as melhorias da versão 8.0, 8.1, 8.2!
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 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 (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. function onEdit($param)
  3. {
  4. try
  5. {
  6. if (isset($param['key']))
  7. {
  8. $key=$param['key']; // get the parameter $key
  9. TTransaction::open('sqlserver'); // open a transaction
  10. $object = new Evento_aplicacao($key); // instantiates the Active Record
  11. $this->form->setData($object); // fill the form
  12. TTransaction::close(); // close the transaction
  13. }
  14. else
  15. {
  16. $this->form->clear();
  17. }
  18. }
  19. catch (Exception $e) // in case of exception
  20. {
  21. new TMessage('error', '<b>Error</b> ' . $e->getMessage()); // shows the exception error message
  22. TTransaction::rollback(); // undo all pending operations
  23. }
  24. }
  25. ?>
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(200, 40);
  30. $valor_entrada->setSize(200);
  31. $valor_saida->setSize(200);
  32. $observacoes->setSize(200, 40);
  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($criteria, FALSE);
  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($criteria, FALSE);
  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->setData( TSession::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->setData( TSession::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. TCombo::reload('form_search_Endereco', 'municipio_id', $options,TRUE);
  16. TTransaction::close();
  17. } catch (Exception $e) {
  18. new TMessage('error', $e->getMessage()); // shows the exception error message
  19. }
  20. }
  21. /**
  22. * Action to be executed when the user changes the Cidade combo_change field
  23. */
  24. public static function onChangeMunicipio($param)
  25. {
  26. try {
  27. TTransaction::open('banco');
  28. $options_bairro = [];
  29. $options_logradouro = [];
  30. if(!empty($param['municipio_id'])){
  31. // Add Bairros
  32. $bairros = Bairro::where('municipio_id', '=', $param['municipio_id'])->orderby('bairro_nome')->load();
  33. if($bairros){
  34. foreach ($bairros as $bairro) {
  35. $options_bairro[$bairro->bairro_id] = $bairro->bairro_nome;
  36. }
  37. }
  38. // Add Logradouros
  39. $logradouros = Logradouro::where('municipio_id', '=', $param['municipio_id'])->orderby('logradouro_nome')->load();
  40. if($logradouros){
  41. foreach ($logradouros as $logradouro) {
  42. $options_logradouro[$logradouro->logradouro_id] = $logradouro->logradouro_tipo->logradouro_tipo_nome.' '.$logradouro->logradouro_nome;
  43. }
  44. }
  45. }
  46. TCombo::reload('form_search_Endereco', 'bairro_id', $options_bairro,TRUE);
  47. TCombo::reload('form_search_Endereco', 'logradouro_id', $options_logradouro,TRUE);
  48. TTransaction::close();
  49. } catch (Exception $e) {
  50. new TMessage('error', $e->getMessage()); // shows the exception error message
  51. }
  52. }
  53. ?>

Alguém pode me ajudar?