rezolvare Florin |
rezolvare Florin

Pentru aceasta tema a trebuit sa implementez solutia de autocomplete si sa o integrez in site.

In dezvoltarea solutiei pentru aceasta tema m-am ghidat dupa principiul enuntat de Steve Jobs : good artists copy; great artists steal! Astfel, dupa ce am rasfoit laboratorul si tutorialele de pe w3schools legate de JavaScript si AJAX, m-am gandit sa nu incep implementarea de la zero, ci sa caut o componenta pe net pe care sa o reutilizez; avand in vedere notorietatea componentei de autocomplete, era aproape imposibil sa nu gasesc ceva; in final, m-am oprit asupra componentei de autocomplete din pachetul YUI oferit de cei de la Yahoo. Motivul - foarte bine documentata, configurabila si usor de folosit.

Pentru a utiliza componenta, a trebuit sa iau decizia daca sa hostez eu componentele celor de la Yahoo, sau sa le incarc in pagina de pe serverele lor. Am ales versiunea a doua, pentru ca overheadul de download a scripturilor .js cu clasele necesare nu mi se pare ca are un efect semnificativ asupra performantelor.

Pentru utilizarea componentei, trebuie ca:

  • sa se instantieze un DataSource folosit pentru a oferi cuvintele prin care autocomplete sa caute
  • sa se instantieze clasa AutoComplete, dand ca parametri numele componentei - care trebuie sa fie obligatoriu un text input sau un textarea - numele containerului ce contine componenta pe care se face autocomplete, si DataSource-ul creat anterior.

In cazul punctului 1) al temei, este suficient sa creem un DataSource de tip Array, pe baza unui array initializat static - asa cum se spune si in tema - si pe baza acestui DataSource sa instantiem componenta de autocomplete. Pretty straightforward ;)

In cazul punctului 2) , un mare avantaj pe care l-am avut il reprezinta modul in care wordpress-ul retine post-urile / paginile. Practic, el nu le retine ca pagini/fisiere pe server, ci le baga in baza de date, si doar partea de prezentare este stocata pe serverul web. Pentru aceasta, wordpress-ul isi creeaza o gramada de tabele in care retine toate informatiile despre content-ul paginilor. Dintre aceste tabele, de interes pentru problema mea este numai tabela wp_posts. In aceasta tabela se retin informatiile despre continutul posturilor/paginilor. Fiecare rand din tabela wp_post corespunde unui document, iar din multitudinea de coloane atrag atentia post_content - care contine textul efectiv prezent in post/page - post_title, care retine titlul exact asa cum l-a introdus utilizatorul cand a creat contentul, si ID care contine ID-ul paginii sau postului. Desi url-ul catre document se poate reconstitui folosind ID-ul, am observat ca in tabela se retine totusi si link-ul complet catre pagina, intr-un alt camp: guid.

Astfel, am creat un script PHP. Acesta primeste la intrare un string care reprezinta textul introdus de utilizator in campul de autocomplete. Stringul se transmite prin url, cu query string-ul “input” ex tema3.php?input=La. Scriptul se conecteaza la baza de date si executa un query asupra tabelei wp_posts, selectand coloanele post_title si guid pentru toate intrarile din tabela. Apoi se cauta intrarile care incep cu stringul dat ca input, si se creeaza un xml care contine aceste intrari.

Avand acest script, pot acum crea un Data Source server-side pe care sa il folosesc pentru a instantia control-ul de AutoComplete. DataSource-ul este de tipul DS_XHR; i-am setat ca raspunsul de la server sa fie XML, pentru ca asta genereaza scriptul meu PHP. Schema DataType-ului este:
["rs" , "value" , "info" ]
asta pentru ca XML-urile oferite de PHP sunt de genul:

Am instantiat obiectul de AutoComplete, pasandu-i Data Source-ul creat, si gata treaba!

Leave a Comment

Your comment

You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.

Posted by florin, filed under Uncategorized. Date: December 7, 2007, 7:12 pm |