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.
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.
- <?php
- /**
- * FormInteractionsView
- *
- * @version 1.0
- * @package samples
- * @subpackage tutor
- * @author Pablo Dall'Oglio
- * @copyright Copyright (c) 2006 Adianti Solutions Ltd. (http://www.adianti.com.br)
- * @license http://www.adianti.com.br/framework-license
- */
- class FormInteractionsView extends TPage
- {
- private $form;
- /**
- * Class constructor
- * Creates the page
- */
- function __construct()
- {
- parent::__construct();
- // create the form using TQuickForm class
- $this->form = new TQuickForm('form_interaction');
- $this->form->setFormTitle('Dynamic interactions');
- $this->form->class = 'tform';
- // create the form fields
- $input_exit = new TEntry('input_exit');
- $response_a = new TEntry('response_a');
- $combo_change = new TCombo('combo_change');
- $response_b = new TCombo('response_b');
- $response_c = new TEntry('response_c');
- $combo_change->enableSearch();
- $response_b->enableSearch();
- $combo_items = array();
- $combo_items['a'] ='Item a';
- $combo_items['b'] ='Item b';
- $combo_items['c'] ='Item c';
- $response_a->setEditable(FALSE);
- $response_c->setEditable(FALSE);
- $combo_change->addItems($combo_items);
- $response_b->addItems($combo_items);
- // add the fields inside the form
- $this->form->addQuickField('Input with exit action', $input_exit, 200);
- $this->form->addQuickField('Response A', $response_a, 200);
- $this->form->addQuickField('Combo with change action', $combo_change, 200);
- $this->form->addQuickField('Response B', $response_b, 200);
- $this->form->addQuickField('Response C', $response_c, 200);
- $this->form->addQuickAction('View', new TAction(array($this, 'onView')), 'fa:search');
- // set exit action for input_exit
- $exit_action = new TAction(array($this, 'onExitAction'));
- $input_exit->setExitAction($exit_action);
- // set exit action for input_exit
- $change_action = new TAction(array($this, 'onChangeAction'));
- $combo_change->setChangeAction($change_action);
- // wrap the page content using vertical box
- $vbox = new TVBox;
- //$vbox->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
- $vbox->add($this->form);
- parent::add($vbox);
- }
- /**
- * Show data
- */
- public function onView()
- {
- // get form data
- $data = $this->form->getData();
- // send some data after post
- $obj = new StdClass;
- $obj->combo_change = $data->combo_change; // will fire change action
- $obj->response_b = $data->response_b; // will update the value after the change action
- // send some data to form dynamically
- TForm::sendData('form_interaction', $obj);
- // keep the form filled
- $this->form->setData($data);
- new TMessage('info', str_replace(',', ',<br> ', json_encode($data)));
- }
- /**
- * Action to be executed when the user leaves the input_exit field
- */
- public static function onExitAction($param)
- {
- $obj = new StdClass;
- $obj->response_a = 'Resp. for '.$param['input_exit'].' at ' . date('H:m:s');
- $obj->combo_change = 'a';
- TForm::sendData('form_interaction', $obj);
- new TMessage('info', 'Message on field exit. <br>You have typed: ' . $param['input_exit']);
- }
- /**
- * Action to be executed when the user changes the combo_change field
- */
- public static function onChangeAction($param)
- {
- $obj = new StdClass;
- $obj->response_c = 'Resp. for opt "'.$param['combo_change'] . '" ' .date('H:m:s');
- TForm::sendData('form_interaction', $obj);
- $options = array();
- $options[1] = $param['combo_change'] . ' - one';
- $options[2] = $param['combo_change'] . ' - two';
- $options[3] = $param['combo_change'] . ' - three';
- TCombo::reload('form_interaction', 'response_b', $options);
- }
- }
- ?>
Teste o seguinte javascript:
Nataniel Rabaioli, obrigado pelo feedback.
Devo inserir no onChangeAction?
Isso, após o TCombo::reload. Lembrando que o valor passado para "val", 1 nesse caso, é o valor que você quer selecionar.
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.
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...
Leondas, o problema está em selecionar o campo via javascript pelo id? Tentou selecionar pelo nome como no exemplo que passei?
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