dmsAutoComplete versão 1.3

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.

52 comentários sobre “dmsAutoComplete versão 1.3

  1. 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.

  2. Let’s try that code again:

    $xmlDoc .= '<item id="'.$key.'" label="'.rawurldecode($label).'"></item>';

  3. 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.

  4. 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.

  5. Actually (again), there’s another bug in that very same line — the rawurldecode should be rawurlencode!

    And my email is sent.

  6. 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

  7. 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.

  8. 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

  9. 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

  10. 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

  11. 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

  12. 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.

  13. 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

  14. 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!

  15. 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!

  16. 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.

  17. 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!

  18. 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

  19. 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

  20. 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.

  21. 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

  22. 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!

  23. Já corrigi.

    Só precisei de converter a string para utf

    $_POST[‘string’] = utf8_decode($_POST[‘string’]);

  24. 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.

  25. 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

  26. 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

  27. 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

  28. 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

  29. Boa noite,
    tambem estou com o mesmo problema do Anderson.

    Desde já grato

    Abraços

    Adriano Nakamura

  30. 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

  31. -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

  32. 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

  33. 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 😛

  34. 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

  35. 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

  36. Olá Rafael,

    É possível criar esse autocomplete para N inputs, ou seja, dinamicamente?

    Abraços.

  37. 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.

  38. otimo script porem gostaria de saber como fasso para aumentar o tempo de duração do balão de sugestão!

    grato!

Os comentários estão desativados.