AL
Como implementar busca de cidades
Fechado
Como posso fazer com que o campo de estado (TDBCombo) preencha os campos cidades (TDBMultiSearch), como faço no AJAX, preenchimento automático, quando escolho o Estado?
$estado = new TDBCombo('estado', 'smart', 'Uf', 'id', 'ds_uf_sigla');
$criteria = new TCriteria;
$criteria->add(new TFilter('id_uf', '=', 'Null'));
$cidades = new TDBMultiSearch('cidades', 'smart', 'Cidade', 'id', 'ds_cidade_nome', '', $criteria);
$cidades->setMinLength(2);
$cidades->setSize(280,30);
Obrigado!
$estado = new TDBCombo('estado', 'smart', 'Uf', 'id', 'ds_uf_sigla');
$criteria = new TCriteria;
$criteria->add(new TFilter('id_uf', '=', 'Null'));
$cidades = new TDBMultiSearch('cidades', 'smart', 'Cidade', 'id', 'ds_cidade_nome', '', $criteria);
$cidades->setMinLength(2);
$cidades->setSize(280,30);
Obrigado!
Encontrei a solução, vou adicionar a function onExitAction no TCOMBO, e fazer a busca ao sair da seleção da combo!
Só seguir esse exemplo
www.adianti.com.br/framework_files/tutor/index.php?class=FormInterac
Felipe, tentei seguir este exemplo, percebi que o que estou usando é uma combo que após selecionar o estado, coloca as cidades que pertencem a ele em ou MultiSearch, para ficarem em um tipo texto, e depois salvo na base de dados como texto e não os IDs das cidades.
E no sistema não tem uma ExitAction para Combo, por isso implementei esta function na classe TBCombo, que é o que utilizo normalmente em meus sistemas com SELECT e AJAX, muito simples de usar.
Ainda não montei, mais vou ver se dá certo, certo?
Obrigado
Então após vc selecionar o estado na combo use o evento onComboChange para carregar o TMultiSearch veja que o exemplo que te mostrei faz exatamente isso carrega a combo baseado numa escolha. No seu caso é só troca a Tcombo pelo TMultiSearch.
Meu código inteiro do formulário é este!
Não estou entendendo aonde colocar o onComboChange?
Obrigado.
é preciso dar um var_dump dentro do onComboChange leia esse tópico www.adianti.com.br/forum/pt/view_1149?tcombo-onchangeaction esse param['key'] está trazendo o id da tabela uf ? não esqueça de indexar o vetor ok. tem esse outro post que pode ajudar www.adianti.com.br/forum/pt/view_1243?tratar-dados-do-tmultisearch
Bom vou te explicar o que quero.
Quero trazer os Estados de uma tabela "Uf" no BD, de acordo com o estado, quero popular o TMultSearch com as cidades da tabela "Cidade" e dentro do MultSearch escolher as cidades do estado que vão pertencer a Região de Vendas.
Não estou conseguindo popular o TMultisearch com o resultado da lista com o Options, fiz esta osnChangeAction e não funciona, mais o $option está carregado com as cidades que quero colocar na TMultiSearch.
public static function onChangeAction($param)
{
$key = $param['key'];
TTransaction::open('smart');
$criteria = new TCriteria;
$criteria->add(new TFilter('id_uf', '=', $key ));
$repository = new TRepository('Cidade');
$cidades = $repository->load($criteria);
foreach ($cidades as $cidade)
{
$options[] = $cidade->ds_cidade_nome;
}
TTransaction::close();
//envia os dados ao formulário
TCombo::reload('form_regiaogrid', 'cidades', $options);
}
Eu entendi desde o começo porém olha seu código está dando o reload numa combo e não está indexando seu vetor.
O TMultiSearch não possui a função onReload nativa como a Tcombo vai ter que usar o TForm::sendData mas acredito que para funcionar vai precisar indexar o vetor.
Felipe, me desculpe, o que é indexar vetor?
$options[$cidade->id] = $cidade->ds_cidade_nome;
É criar um índice deve funcionar assim.
Felipe, fiz desta forma:
{
$key = $param['key'];
TTransaction::open('smart');
$criteria = new TCriteria;
$criteria->add(new TFilter('id_uf', '=', $key ));
$repository = new TRepository('Cidade');
$cidades = $repository->load($criteria);
foreach ($cidades as $cidade)
{
$options[$cidade->id] = $cidade->ds_cidade_nome;
}
TTransaction::close();
//envia os dados ao formulário
TForm::sendData('form_regiaogrid', $options);
}
Mais não mandou os campos para a TMultiSearch.
Tem como substituir o TMultiSearch, no formulário, por um TDBMultiSearch, com um $criteria do id do estado?
O problema é que não atualiza a pagina ou seja o criterio viria como nulo e não teria retorno, se fosse trocado o multisearch por uma combo resolveria esse problema com o tcombo::reload , mas acredito que falta um detalhe para funcionar ou é a variavel $options que não está declarada como objeto ou no foreach precisa passar o $key tem como me enviar seu projeto para eu analisar ? está em qual banco de dados?
Felipe, bom dia, nunca utilizei um Framework, comprei o livro do adianti e já li ele todo para poder criar dúvidas, já desenvolvi sistemas com algumas classes que criei e que fui desenvolvendo desde 2012, e utilizo um Ajax muito simples que altera com um innerHtml o objeto na página e preenche os campos!
Com o adianti, verifiquei este campo muito interessante(MultiSearch), que fica mais fácil utilizar ao gravar os dados do banco dentro de um campo TEXT, evitando operações de associação com a base de Cidades, que a cada abertura de tela ou chamada de edição fazer buscas em outra tabela.
Então este campo ficaria com acesso a outra base, somente em caso de Edição e Alteração, e somente no estado que necessite, sem ter que carregar a base toda de cidades, na hora de escolher as cidades.
Se tivesse uma function reload na Classe TMultiSearch não resolveria?
Exatamente !!! é isso que estamos fazendo de uma forma manual(sem mexer na classe), agora ja abriu a classe MultiSearch para ver como ela carrega os dados? confesso que eu não olhei. faz o seguinte olha esse exemplo www.adianti.com.br/framework_files/tutor/index.php?class=SearchBox ele parece que faz exatamente o que vc quer basta ajustar em vez de carregar do xml carregar do banco de dados com o filtro.
Olha o Adianti é uma ferramenta que facilita a vida de criações de aplicação de negocio que se resumem muito a listagens e formulários o foco é evitar o retrabalho de ficar reescrevendo códigos, claro cada projeto é diferente e o framework é bem flexivel podendo mudar suas classes facilmente.
Cabe vc analisar o seu projeto ajustar o MultiSearch a sua necessidade ou até mesmo criar o seu, esta liberdade que é bacana pois não existe nenhum projeto igual ao outro.
Boa sorte senão conseguir avisa que tento montar um exemplo.
Montei esse exemplo só salvar no control do tutor
Felipe, não consegui colocar os dados dentro do retorno, montei desta forma a Classe:
Felipe, tem como transformar o TDBMultiSearch em TText, para salvar os dados como TEXT?
Felipe, já resolvi com o implode e salvou corretamente no sistema, a única coisa que falta é selecionar o estado e preencher os MultiSsearch com as cidades somente do estado.
Felipe, boa tarde, agradeço imensamente sua paciência e ajuda, ainda não consegui fazer com que a TDBCombo separe as cidades por estado na TDBMultiSearch, sem problemas, vou seguir no sistema para não perder mais tempo.
Mais está fazendo tudo que preciso, pois não guardo o ID das Cidades e sim os Nomes, então a Classe abaixo funciona bem, muito obrigado pelas dicas.
É pq VC precisa usar a TMultisearch e não TDB testa aí o exemplo que passei fazia o filtro.
Carrega uma Cidade, mais não carrega todas as cidades do Estado!
Antonio,
Não é possível fazer a TDBCombo pré-filtrar a TDBMultiSearch, pois a TDBMultiSearch trabalha com filtros pré-definidos, não dinâmicos.
Eu respondi à isso de maneira mais completa neste outro post:
www.adianti.com.br/forum/pt/view_2041?filtragem-de-municipios-usando
A recomendação é usar somente TDBMultiSearch, apresentando o estado junto ao nome da cidade na busca, e usar apenas o ID da cidade.
Também sugiro usar um seek button para selecionar as cidades a partir de uma janela, como no cadastro de clientes:
www.adianti.com.br/framework_files/tutor/index.php?class=CustomerFor
Atenciosamente,
Pablo
Muito obrigado pela informação, como o nome da cidade que é importante salvar no campo, não me importei com o id dela em acordo com o Estado, e funcionou bem, pois salvo no Banco de dados como campo TEXT.
Obrigado e até mais.