Após alguns meses de atraso devido a coisas mil (PHPDF Roadshow, BlogBlogs…) tive tempo de voltar ao meu script de autocomplete para a manutenção rotineira dele.
O primeiro passo que tomei foi re-organizar meu gerenciador de projetos pois ela havia sido “vandalizado” por robôs spammers que bagunçaram tudo, mas graças ao conceito de “history” consegui corrigir tudo.
O que mudou?
Esta versão é um marco muito legal para o projeto, IMHO, pois ele é quase que 100% composto de alterações, requisitadas e as vezes até realizadas por usuários do script de vários cantos do planeta. Embora no corte final o código submetido tenha sido em grande parte re-escrito, acredito que devo algo aos que contribuiram e vou mencionar seus nomes aqui neste post e listas as contribuições no script. Estas contribuições eu recebi por email e tinha em meu registro, então se eu esqueci de alguém, manifeste-se e darei o justo crédito.
Bug #1: Erro com acentos
Alguns usuários reportaram que ao fazer buscas com acentos nenhum resultado era retornado. Isto ocorria devido à problemas de codificação no lado PHP do script, e um simples utf8_decode resolveu este problema. O Marcus Ellend (www.uniqa.com.br) contribuiu com esta solução de forma muito similar usando o encode no texto comparado, mas preferi manter o decode no texto que é enviado.
Bug #2: DIV cobre SELECTs
Este erro ocorre apenas no IE, antes da versão 7. Quando o DIV é chamado com um SELECT logo abaixo, o SELECT fica sobre o DIV. Para isso o script executa uma rotina simples que esconde todos SELECTS da pagina. Para que isso não afete soluções que não sofrem deste problema, esta rotina só é executada se a propriedade hideSelects estiver setada para true. Mais uma vez neste bug recebi o apoio do Marcus, apenas adaptando o código submetido para usar a propriedade acima.
Melhoria #1: Tamanho mínimo
Esta sugestão venho do outro lado do Atlântico, enviada pelo Simon Franz (www.tanzmusik-online.de) sa Alemanha (aah, a globalização). Sua solução pedia que o script apenas começasse a “chutar” valores depois de 3 ou 4 letras digitadas, por isso adaptei uma propriedade, chamada minLength que define qual deve ser este número, sendo necessário apenas alterar seu valor padrão de “1” para o valor desejado.
Melhoria #2: Limpar (ou não) campo após escolha
Esta melhoria foi recomendada por várias pessoas e embora dependesse de apenas comentar-se uma linha, decidi implementar ela de uma forma mais limpa, usando a propriedade cleanField. se esta propriedade for setara para verdadeiro (valor padrão) o texto do campo será limpo após a seleção, caso não, o valor permanece no campo.
Melhoria #3: Compatibilidade com PHP4
Embora o exemplo seja apenas uma dica de utilização percebo que muitas pessoas se baseiam nele para seus scripts e muitos ainda usam PHP4, portanto ficavam sem rumo quando o script não retornava nada, devido ao uso de funções do PHP5. Recebi algumas sugestões para esta solução, do Marcus e do Jon Bernhardt (www.wobblymusic.com) que co seu ultimo contato me estimulou a fazer a atualização do script. Com estas soluções em mãos optei por usar um truque chamado class_exists para verificar se a classe de DOMDocument esta presente, e caso não esteja, utilizar a criação do XML “na mão”. Desta forma o script se adapta ao servidor e os problemas de versão doPHP desaparecem.
Bem, estas são as melhorias, espero que possam ajudar a todos que usam o script hoje em dia, e obrigado a todos que enviaram sugestões. Estou iniciando na página do meu gerênciador de projetos a documentação do script, para poder dar mais auxílio a todos.
Nice job incorporating the various improvements. I’ve found two bugs: One I have a fix for, the other confounds me.
1) On or near line 85 of dmsAC.php, you need to include a closing item tag. The line should be
$xmlDoc .= '';
2) My item list includes phrases with spaces. These work fine, but if the phrase has an ampersand (&), when I type the & into the input text box, the list does not reduce any further. I can send you my sample file if this is unclear.
Let’s try that code again:
$xmlDoc .= '<item id="'.$key.'" label="'.rawurldecode($label).'"></item>';
Jon, great catch, I’ll fix that.
Thanks again. I’ll translate this post later on today or tomorrow so you can read it further.
Abour the &, send me some feedback by e-mail.
Actually, you can also close the item tag like so:
$xmlDoc .= '<item id="'.$key.'" label="'.rawurldecode($label).'" />';
I will send you an email regarding the “&” shortly.
Actually (again), there’s another bug in that very same line — the rawurldecode should be rawurlencode!
And my email is sent.
Boa noite Rafael.
Gostaria se possivel de uma ajuda.
Estou tentando utilizar o seu Autocomplete e com PHP 4 ou inferior ele roda na boa, mas quando uso o PHP 5 ele nao roda.
Será que poderia me ajudar?????
Eu estou utilizando um ambiente de desenvolvimento em PHP cjhamado Easy PHP e no Easy PHP 1.8 que roda com PHP4 ele funciona normal, ja com o 2.0 que tem o PHP 5 ele nao funciona.
Tentei utilizar tambem o WAMP5 que roda com PHP 5 tambem mais de novo nao funcionou.
Ficaria muito agradecido se pudesse me ajudar.
Desde já agradeço.
Fernando Bela Ferracini
Fernando,
Verifique se o PHP5 esta com as configurações certas em relação ao XML, e faça o seguinte teste: execute o arquivo dmsAC.php diretamente para ver se o mesmo exibe algum retorno de erro.
Boa noite Rafael,
Este seu post é muito bom, consegui facilmente desenvolver o meu auto completar com PHP, porém eu descobri um novo bug, não sei se já foi comentado aqui antes mas a busca esta case sensitive, eu estava testando e não estava obtendo resultado até que eu percebi que não estava fucionando por este motivo, sera que você poderia me ajudar a resolver este problema?!!?
Muito Obrigado
Abraço
Valentim Araújo
Boa tarde Rafael, tudo bem?
Eu peguei um arquivo seu chamado ‘dmsAutoComplete.rar’ que contem uma pasta chamada ‘examples-plus’, lá em 3 arquivos um php, um htm e um sql. Peguei o .sql e importei no meu banco, deu certo, ai peguei o php e troquei as variaveis de conexão. Quando eu vou testar não dá nada, coloco alguma letra ou pedaço do nome retirado do banco de dados e não faz funcionar o auto complementar. Eu gostaria de saber se além de importar o banco e trocar as variavies de conexão é preciso fazer alguma coisa mais.
Desde já grato pela atenção
Francis
Boa tarde Rafael, tudo bem?
Eu peguei um arquivo seu chamado ‘dmsAutoComplete.zip’ que contem uma pasta chamada ‘examples-plus’. Lá tem 3 arquivos: um php, um htm e um sql. Peguei o .sql e importei no meu banco, deu certo, ai peguei o php e troquei as variaveis de conexão. Quando eu vou testar não dá nada, coloco alguma letra ou pedaço do nome retirado do banco de dados e não faz funcionar o auto complementar. Eu gostaria de saber se além de importar o banco e trocar as variavies de conexão é preciso fazer alguma coisa mais.
Obs.: Estou utilizando o ambiente PHPTriad 2.2 (Apache(1.3.23), MySQL(3.23.48) and PHP(4.1.1). )
Desde já grato pela atenção
Everaldo
Everaldo,
O exemplo utiliza o driver PDO disponível apenas no PHP 5, e é necessário habilitar o driver para PDO, pois não vem habilitado por padrão.
Mas caso deseje, pode substituir estas chamadas por chamadas normais de mysql do php e funcionará da mesma forma.
abraço
Olá Rafael,
Utilizei o seu codigo e funciona corretamente, a não ser pela parte que ele joga as “tags malucas” no campo!
Este problema foi resolvido ? alguma solução ?
Obrigado.
Paulo,
Não sei exatamente quais são as “tags malucas” se voce puder me envie mais detalhes, ou verifique o link “documentação e Bug Report” acima para ver se já foi resolvido o ticket.
Abraço
desculpe no exemplo de tag seria:
Paulo Itapirema
Olá Rafael,
pesso desculpas pelo atraso na resposta, estive ocupado por um tempo! mas…
as “tags malucas” a qual me refiro, sao aquelas que quando selecionamos um dado que se encontra no banco de dados, ele joga para o texfield ex:” Paulo Itapirema” ( a medida que a palavra vai se tornando identica vai ficando em negrito).
no arquivo ‘getcontacts.php’ existe linhas de codigo com o seguinte trecho:
….
$item->setAttribute(‘id’,$row[‘idcontatos’]);
$texto = $row[‘nome’].””;
$label = destacaTexto($_POST[‘nome’],$texto);
$item->setAttribute(‘label’,rawurlencode($label));
$item->setAttribute(‘flabel’,rawurlencode($texto));
//Problema: o texto que volta para o cmapo vai com tags doidas.. e deveria ir apenas o texto, precisamos de um label e um
// campo “show” opcional
….
Os comentario acredito serem seus, são originais do script que peguei!
Entende qual minha duvida amigo ?!
Se puder responder fico mais uma vez grato!
Obrigado…
Obs: No trecho de codigo, possue alguma alterações de acordo com minha necessidade!
Olá Rafael,
Espero que esteja tudo bem e que este não seja somente mais um post…rs, bom, estou com problemas para utilizar o seu exemplo de auto_complete. Não consegui que o mesmo nem me retornasse ao menos uma mensagem “Nenhum registro encontrado”.
Fizx alguns testes e a função JS pega o nome do campo e da div direitinho, se caso puder fazer contato, estamos tentando usar o pacote em um projeto nosso na empresa. Jã que seria para uso comercial, tínhamos que falar sobre.
Um abraço, DEUS abençõe!
Wagner,
Estou entrando em contato em PVT para discutirmos sobre.
abraço
cara vc se importaria de me passar o codigo desse seu “rating”???
achei muito bacana!!
fico no aguardo!
Sérgio,
Plugin WP-Ratings: http://www.lesterchan.net/portfolio/programming.php
Abraço
Caro Rafael Dohms,
Gostaria de saber como utilizar o dmsautocomplete, pois tentei colocar a pasta no diretorio do meu servidor e executar oi example.htm, porem nao recebo completamento as inserções de texto que faço. Gostaria de saber se tenho que configurar algo de diferente no meu navegador, apache ou php. Eu uso apache 2.26, php 5.2 e windows vista 32 bits.
Desde ja agradeço,
Arthur Fernandes.
Bom dia, estou tentando usar seu autocomplete, mas nao obtive sucesso em sua intalação, qual seria o seu procedimento?
teria que fazer alguma configuracao? o exemplo em html nao funciona, obrigado desde ja!
Arthur,
Desculpe a demora. O seu servidor aparenta estar compativel com o script, tente utilizar o firebug do firefox para verificar se existe algum erro sendo apresentado.
Abraço
Junior,
Procure utilizar o firebug do forefox para identificar o problema, qualquer coisa me encaminhe uma url de teste onde eu possa verificar o script.
Abraço
Rafael,
Voce poderia me dizer que extensoes devem ser habilitadas para o seu script funcionar? Eu sei que ele utiliza PDO, mas não sei qual extensao deve ser habilitada e se existem outras que precisam. Na minha configuracao do PHP eu so habilitei a extensao do php_mysqli.dll pois uso o mysqli para as conexoes.
Abraços,
Arthur Fernandes.
Arthur,
Ele usa o pdo_mysql, mas basta trocar a DSN de conexão e usar o mysqli se não me falha a memória, de qlqr forma nada impede de re-escrevr este trecho pois ele é apenas um exemplo.
Se tudo der certo semana que vem vou publicar um screencast com um tutorial sobre isso.
Abraço
Olá Rafael,
Tenho uma questão.
Quando coloco na input algo do genero “Taça” com o Ç , não retorna nada. Qual poderá ser a solução?
Ob!
Já corrigi.
Só precisei de converter a string para utf
$_POST[‘string’] = utf8_decode($_POST[‘string’]);
Primeiro parabens pelo otimo script e por liberar o uso.
Acho que sou um dos poucos que tem problema com o script em si e nao com o php ou servidor.
Não sei o que acontece, mas o é que o LI fica só do tamanho do texto retornado.
Já tentei colocar o css orginal , mas continua assim.Quando passo pro meu arquivo principal, acho que alguma coisa de css do resto do site atrapalha, mas nao consigo descobrir.
Veja a imagem:
[URL=http://img175.imageshack.us/my.php?image=accxz0.jpg][IMG]http://img175.imageshack.us/img175/9986/accxz0.th.jpg[/IMG][/URL]
Se alguem puder me dar um dica, pois isso atrapala pois na hora de selecionar com o mouse tem que passar em cima do texto, senao nao seleciona a opcao.
Obrigado e parabéns pelo ótimo script.
Mandei um comentário só que ainda nao entrou, o que aconteceu ?
Parabens pelo script.
Gostaria de saber como pegar mais valores na funcao de retorno…
Por exemplo no xml eu ja adicionei o atribulo “preco”, alemd e id e label, como posso pegar esse valor na funcao AC.chooseFunc ?
Porque estou tentando de varias forma e nao consigo.
Outra questao é que estou com um erro.. e nao mexi nada no codigo. só as cores do css…
http://img175.imageshack.us/my.php?image=accxz0.jpg
O li só vai ate o fim da palavra.. e nao ate o final do div…
Obrigado a atenção
Fabiano,
seu comentário tinha caido no filtro do Akismet, aprovei ele aqui.
Quanto a adicionar um elemento, você precisaria mecher no JS para que ele leia e use este elemento.
Quanto ao outro problema não tenho acesso a imagem neste momento, pois estou no escritório, durante o fim de semana eu verifico pra você e te passo mais informações nos dois problemas.
Abraço
Aqui esta a imagem do menu com bordas:
DIV: borda preta
UL: borda amarela
LI: borda rosa
Pode ajudar…Aguardo sua resposta e obrigado mais uma vez pela atênção.
http://img527.imageshack.us/my.php?image=imagemnv8.jpg
Ai está.
🙂
Gostaria de agradecer pois graças a este script consegui deixar meu comparador de preços http://www.comparefacil.com mais dinâmico.
Fabiano,
Não consigo ver as imagens, me mande os detalhes por e-mail para podermos verificar qual problema estamos tento.
Abraço
http://img85.imageshack.us/my.php?image=imagemqv0.jpg
o link estava com defeito….
mas já corrigi..
Pode ver agora
Obrigado
Fabiano,
É esse problema do LI é de browser pra browser e questão de CSS, você pode talvez usar um width no Li que arrume isso mas realmente não sei exatamente o que fazer.
Abraço
Ola amigo , estou tendo o problema com o php5. Veja:
Warning: domdocument::domdocument() expects parameter 2 to be long, string given in C:\xampp\htdocs\Autocomplete\dmsAC.php on line 30
Fatal error: Call to undefined method domdocument::createElement() in C:\xampp\htdocs\Autocomplete\dmsAC.php on line 35
Oque poderia ser !???
No aguardo
Anderson
Boa noite,
tambem estou com o mesmo problema do Anderson.
Desde já grato
Abraços
Adriano Nakamura
Parabenizando vossa excelencia pelo belissimo trabalho…
depois de testado e aprovado quero saber se posso usá-lo no nosso sistema com minha alterações.
E desde já menciono e sugiro o que foi feito.
– Criei atributos na “classe” dmsAutoComplete (JavaScript)
ajaxParam // o nome do parametro q será enviado via post para o servidor (Default: ‘string’)
xmlItem // nome da tag separadora de itens do xml (Default: ‘item’)
xmlId // nome do atributo que possue o ID (Default: ‘id’)
xmlLabel // nome do atributo que possue o texto a ser mostrado (Default: ‘label’)
xmlFLabel // não sei pra q serve mas já que tinha no código eu criei tb (Default: ‘flabel’)
além disso, por motivos de integração com meu CMS eu adaptei pra poder usar ou não o sistema de atributos que já é padrão do seu script. No meu caso eu uso da seguinte forma:
Exemplo pra pegar o item “Label” do primeiro “row” retornado pelo servidor
itens[0].getElementsByTagName(me.xmlLabel)[0].firstChild.nodeValue
considerando q o xml retornado seria:
0
Valor
Abrass
-root-
-item-
-id- 0 -/id-
-label- Valor -/label-
-/item-
-/root-
trocando o – por > e <
isso seria o xml retornado, não apareceu alí em cima pq rolou um striptags
asohiaushusa
\o
Rafael
Gostei das alterações definitivamente vou analisar e ver se integro na proxima versão.
Quanto ao script ele tem licença Creative Commons, portanto caso vá usar em algum sistema comercial, temos de negociar um acordo ou tarifa para que eu libere uma licença para voce.
Abraço
humn blz ^^
vou ter q fazer o meu então
vlw \o
eheheh
Porque programador é tão murrinha? Custa depositar uns trocados no meu paypal, me pagar um café?
Vale mais a pena perder horas desenvolvendo tudo denovo?
Por isso que o blog não vai pra frente eheheh… ninguem ajuda a pagar a hospedagem… vo começar a postar porn 😛
Rafael, boa tarde.
Estou iniciando em php, ajax e congêneres. Achei muito bom seu script (na verdade, fantástico), porém tenho algumas dúvidas:
qualdo altero o select de seu exemplo getcontacts.php (pasta examples-plus) modificando o WHEREsomente para “nome LIKE ‘%”.$_POST[‘string’].”%'”, sem os outros OR, não funciona.
Outra dúvuda: é possivel repassar outros dados encontrados pelo select para outros inputs do mesmo form, por exemplo, colocar o ’email’ encontrado na seleção em um ao invés do mesmo input dos outros dados?
Por favor, se já tiver respondido estas dúvidas anteriormente, me indique onde pois não encontrei nos posts anteriores.
Antecipadamente grato,
Omar
Rafael,
Descobri meus erros.
abraço,
omar
Rafael,
Instanciei dois objetos dmsautocomplete em meu site e necessito que cada um deles leia dados de tabelas diferentes, mas os dois estão lendo somente a tabela do primeiro objeto instanciado.
Vc tem algum exemplo de código para esta necessidade?
Grato,
Leandro
Como posso substituir as chamadas PDO por chamadas normais de mysql do php? Algum exemplo.
Olá Rafael,
É possível criar esse autocomplete para N inputs, ou seja, dinamicamente?
Abraços.
Rafael, tudo bem?
Teu script é show, funciona perfeitamente. Porém estou com problema com o caracter & na variavel de retorno xmlDoc.
Alguém já reportou isso ou é algo que estou fazendo errado?
Abraços.
otimo script porem gostaria de saber como fasso para aumentar o tempo de duração do balão de sugestão!
grato!