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?