TCombo erro TForm::sendData com enableSearch ativado Olá, estou realizando um cadastro de endereços com a alimentação dos estados por um TDBCombo e interações dinâmicas para cidades, bairros, logradouros... todos com TCombo que são alimentados dinamicamente. Tudo está funcionando normalmente, quando o enableSearch está desativado. Porém, gostaria de usá-lo. Depois de um dia de testes, não encontrei o problema, somente descobri que...
LF
TCombo erro TForm::sendData com enableSearch ativado  
Olá, estou realizando um cadastro de endereços com a alimentação dos estados por um TDBCombo e interações dinâmicas para cidades, bairros, logradouros... todos com TCombo que são alimentados dinamicamente.

Tudo está funcionando normalmente, quando o enableSearch está desativado. Porém, gostaria de usá-lo.

Depois de um dia de testes, não encontrei o problema, somente descobri que quando desativo o enableSearch, tudo funciona normalmente.

Acho que não esclareci o que está aconcendo bem. Vou tentar ser bem claro:

Em uma lista, quando realizo a pesquisa, eu envio os dados dos critérios para a sessão, assim eu preciso utilizar o TForm::sendData para recarregar os combos, pois o setData não seria capaz de carregar dinamicamente. Realizo este processo. Tudo funciona normalmente, desde que o enableSearch não esteja habilitado. Estando habilitado, ele até volta o valor como selecionado, mas aparece inicialmente com o placeholder.

Se alguém puder me ajudar a sair deste problema.

Fiz o teste com a classe demonstração do tutor. Ocorre o mesmo problema, basta ativar e desativar o enableSearch que verão que com ele ativo, o sendData não é capaz de setar o selected para o combo.

 
  1. <?php
  2. /**
  3. * FormInteractionsView
  4. *
  5. * @version 1.0
  6. * @package samples
  7. * @subpackage tutor
  8. * @author Pablo Dall'Oglio
  9. * @copyright Copyright (c) 2006 Adianti Solutions Ltd. (http://www.adianti.com.br)
  10. * @license http://www.adianti.com.br/framework-license
  11. */
  12. class FormInteractionsView extends TPage
  13. {
  14. private $form;
  15. /**
  16. * Class constructor
  17. * Creates the page
  18. */
  19. function __construct()
  20. {
  21. parent::__construct();
  22. // create the form using TQuickForm class
  23. $this->form = new TQuickForm('form_interaction');
  24. $this->form->setFormTitle('Dynamic interactions');
  25. $this->form->class = 'tform';
  26. // create the form fields
  27. $input_exit = new TEntry('input_exit');
  28. $response_a = new TEntry('response_a');
  29. $combo_change = new TCombo('combo_change');
  30. $response_b = new TCombo('response_b');
  31. $response_c = new TEntry('response_c');
  32. $combo_change->enableSearch();
  33. $response_b->enableSearch();
  34. $combo_items = array();
  35. $combo_items['a'] ='Item a';
  36. $combo_items['b'] ='Item b';
  37. $combo_items['c'] ='Item c';
  38. $response_a->setEditable(FALSE);
  39. $response_c->setEditable(FALSE);
  40. $combo_change->addItems($combo_items);
  41. $response_b->addItems($combo_items);
  42. // add the fields inside the form
  43. $this->form->addQuickField('Input with exit action', $input_exit, 200);
  44. $this->form->addQuickField('Response A', $response_a, 200);
  45. $this->form->addQuickField('Combo with change action', $combo_change, 200);
  46. $this->form->addQuickField('Response B', $response_b, 200);
  47. $this->form->addQuickField('Response C', $response_c, 200);
  48. $this->form->addQuickAction('View', new TAction(array($this, 'onView')), 'fa:search');
  49. // set exit action for input_exit
  50. $exit_action = new TAction(array($this, 'onExitAction'));
  51. $input_exit->setExitAction($exit_action);
  52. // set exit action for input_exit
  53. $change_action = new TAction(array($this, 'onChangeAction'));
  54. $combo_change->setChangeAction($change_action);
  55. // wrap the page content using vertical box
  56. $vbox = new TVBox;
  57. //$vbox->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  58. $vbox->add($this->form);
  59. parent::add($vbox);
  60. }
  61. /**
  62. * Show data
  63. */
  64. public function onView()
  65. {
  66. // get form data
  67. $data = $this->form->getData();
  68. // send some data after post
  69. $obj = new StdClass;
  70. $obj->combo_change = $data->combo_change; // will fire change action
  71. $obj->response_b = $data->response_b; // will update the value after the change action
  72. // send some data to form dynamically
  73. TForm::sendData('form_interaction', $obj);
  74. // keep the form filled
  75. $this->form->setData($data);
  76. new TMessage('info', str_replace(',', ',<br> ', json_encode($data)));
  77. }
  78. /**
  79. * Action to be executed when the user leaves the input_exit field
  80. */
  81. public static function onExitAction($param)
  82. {
  83. $obj = new StdClass;
  84. $obj->response_a = 'Resp. for '.$param['input_exit'].' at ' . date('H:m:s');
  85. $obj->combo_change = 'a';
  86. TForm::sendData('form_interaction', $obj);
  87. new TMessage('info', 'Message on field exit. <br>You have typed: ' . $param['input_exit']);
  88. }
  89. /**
  90. * Action to be executed when the user changes the combo_change field
  91. */
  92. public static function onChangeAction($param)
  93. {
  94. $obj = new StdClass;
  95. $obj->response_c = 'Resp. for opt "'.$param['combo_change'] . '" ' .date('H:m:s');
  96. TForm::sendData('form_interaction', $obj);
  97. $options = array();
  98. $options[1] = $param['combo_change'] . ' - one';
  99. $options[2] = $param['combo_change'] . ' - two';
  100. $options[3] = $param['combo_change'] . ' - three';
  101. TCombo::reload('form_interaction', 'response_b', $options);
  102. }
  103. }
  104. ?>

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)


NR

Teste o seguinte javascript:
 
  1. <?php
  2. $('[name=response_b]').val(1).trigger('change');
  3. ?>
LF

Nataniel Rabaioli, obrigado pelo feedback.
Devo inserir no onChangeAction?
NR

Isso, após o TCombo::reload. Lembrando que o valor passado para "val", 1 nesse caso, é o valor que você quer selecionar.
LF

Nataniel, perdão a ignorância, fiz conforme, chequei por var_dump, mas sem resultado. Creio que o problema esteja no ID. Tentei com getId(), mas ele retorna o nome do campo de criação, o ajudou. Se puder me ajudar com mais essa aí. Como pegar o Id em tempo de execução no caso do TCombo enableSearch.
LF

 
  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. $script = "$('#municipio_id').val(".$param['municipio_id'].").trigger(('change');";
  17. TScript::create($script);
  18. TTransaction::close();
  19. } catch (Exception $e) {
  20. new TMessage('error', $e->getMessage()); // shows the exception error message
  21. }
  22. }
  23. ?>
LF

Nataniel Rabaioli, não consegui sanar o problema... fiz conforme tu me indicou mas ainda assim não atualizou com o javascript... tentei identificar o id do campo, mas não consegui sanar também...
NR

Leondas, o problema está em selecionar o campo via javascript pelo id? Tentou selecionar pelo nome como no exemplo que passei?
IV

Comigo está acontecendo isso (eu acho), não entendi muito bem o que acontece com o Leondas, mas comigo quando eu dou um onChange, eu faço uma verificação, se essa verificação muda o valor via senddata de um TDBCombo com enable search ativado, o valor interno é alterado, porém o valor visual não! Ou seja, o valor visivel da span do tdbcombo continua o antigo e o valor interno é alterado... Pode ser que isso tenha sido resolvido na versão nova, mas encontrei uma solução própria, eu apenas mudo o valor do span do tdbcombo com javascript para que mude o texto visível do tdbcombo... Segue abaixo o código caso alguém visite esse tópico algum dia hehe

TScript::create('$(".select2-chosen").text("Selecione um item");'); //o select2-chosen eu peguei inspecionando o elemento da span do tdbcombo