Multe site-uri web oferă formate de sindicalizare, cum ar fi servicii RSS, JSON sau XML, pentru a permite livrarea ușoară a conținutului. Dar ce se întâmplă atunci când un site web nu oferă unul dintre aceste servicii? Cum puteți sindica conținut de pe un site care nu oferă un flux de știri? Aceasta este ceea ce am hotărât să rezolve.
Am primit recent un proiect de la un client cu o schiță și o scurtă prezentare a site-ului și obiectivele pe care doresc să le îndeplinească. Împreună cu această scurtă au fost note care indicau faptul că au fost o companie imobiliară și au plasat în mod regulat proprietăți pe un site de bunuri imobiliare bine-cunoscute și au dorit să își poată sindica conținutul pe acest site extern pe site-ul lor propriu, fără a fi nevoie să actualizeze ambele site-uri. Captura: acest site imobiliar bine cunoscut nu a oferit un serviciu de sindicalizare sau un API pentru dezvoltatori care să le acceseze listele.
După ce am spălat internetul, am descoperit că majoritatea soluțiilor la această problemă au fost inelegante și, de cele mai multe ori, acestea erau specifice browserului sau ineficiente. Am decis să cod codul propriei mele soluții utilizând jQuery, cea mai populară bibliotecă javascript.
Pentru a accesa informații de pe un alt site am avut nevoie să utilizez funcțiile AJAX ale bibliotecii JQuery.
Dacă sunteți familiarizat cu JQuery, cele de mai sus nu ar trebui să fie prea greu de înțeles. Folosim funcția de încărcare AJAX pentru a încărca conținutul unei pagini Web într-un element cu id #content. Soluția părea prea ușoară, dar, din nefericire, vă va da seama că codul va funcționa numai în Internet Explorer 6 sau 7. Motivul pentru acest lucru a devenit rapid evident - toate celelalte browsere blochează încărcarea site-urilor din domenii alternative din cauza setărilor locale de securitate. Aceasta a însemnat că putem încărca numai pagini relative, nu adrese URL absolute.
M-am uitat în jur pentru o soluție la această problemă și spre dezamăgirea mea, majoritatea oamenilor au fost fie sub impresia că nu a fost posibil să ocolească setările locale de securitate ale majorității browserelor, fie că era prea complicat o sarcină, deci nu merita să faci. Atunci am descoperit biblioteca cURL.
cURL este destul de utilă, deoarece vă permite să comunicați cu alte servere utilizând URL-uri și protocoale web standard, cum ar fi HTTP, HTTPS sau SSL. Folosind cURL am reușit să construiesc un bypass pentru problema noastră de securitate locală prin utilizarea încărcării pe întregul site web la o adresă URL locală a serverului.
Acest cod inițiază un obiect cURL dintr-o adresă URL externă - avantajul fiind că adresa URL este încărcată mai degrabă pe server decât pe client. Setările de securitate ale serverului în mediul PHP sunt mult mai flexibile decât setările de securitate locale ale celor mai moderne browsere. După inițierea obiectului cURL, vom imprima pur și simplu întregul conținut al URL-ului. Dacă acum salvăm acest document ca "curl.php" pe serverul nostru web, avem acum un fișier local care se va încărca în întregul conținut al site-ului adresei noastre externe.
Să ne întoarcem la codul nostru original și să punem în modificările noastre:
Scenariul nostru acceptă acum toate browserele și nu este realizat cu ajutorul unor hack-uri de securitate locale neortodoxe.
Acum s-ar putea întreba care sunt avantajele de a lucra cu acest document în JQuery în comparație cu manipularea doar documentul nostru folosind PHP? Principalul motiv al alegerii mele în utilizarea JQuery este abilitatea de a utiliza selectorii ei în stil CSS pentru a alege ce conținut de pe pagina noastră dorim de fapt să facem sindicat, cum ar fi:
Mai degrabă decât încărcarea în întreg documentul, acum încărcăm doar conținutul unui element cu id #content. Vom profita de acest lucru mai târziu în articol.
După ce ați jucat puțin pentru asta, puteți observa următoarea problemă mare. Deși am reușit să sindicam un conținut de site-uri externe, toate legăturile relative și imaginile nu mai funcționează. Un alt motiv pentru care lucrezi în JQuery. Folosind funcția JQuery every (), putem crea o buclă care trece prin toate și elemente care capturează atributul curent HREF sau SRC și prefixează domeniul extern pe acesta.
Acum, problema de la care ne confruntăm este locul în care integrăm noul nostru cod în codul nostru existent? Problema pe care am întâlnit-o inițial a fost că indiferent unde ați pus-o, marcajul extern nu sa încărcat suficient de repede pentru ca codul nostru să schimbe domeniul după ce a intrat în vigoare. Soluția implică combinarea celor două într-o soluție destul de elegantă JQuery.
$ ("document") gata (functie () $ ("# content"). ) Var href = $ (acest) .attr ('href'); var nou_href = domeniu + href; $ (acest) .attr ('href';
$ (acest lucru) .attr ('src', new_src); fiecare (funcția (i) var src = $ (this) .attr ('src'); ); ); );
Funcția de încărcare are încă două proprietăți pe care le puteți lua, una fiind variabilele pe care doriți să le trimiteți la adresa URL externă. De exemplu, ați putea încerca să preluați date din rezultatele unui formular POST. Cealaltă proprietate este o funcție de apel invers sau ce trebuie făcut de îndată ce funcția load () a terminat. În cazul nostru, acest lucru este perfect - plasăm codul nostru în funcția de apel invers care îl împiedică să ruleze până când încărcăm complet pagina noastră externă.
După cum puteți vedea acum, acum suntem capabili să tragem pur și simplu în orice element din conținutul paginii noastre dintr-un alt site web. Acest lucru este foarte practic
nu doar pentru sindicalizarea conținutului, cum ar fi fluxurile de știri, ci și pentru orice conținut actualizat dinamic.
Acum că am reușit să ne tragem conținutul, următorul pas arată superioritatea utilizării acestui cod peste un cuvânt
$ ("document") gata (functie () $ ("# content").
În acest caz, alegem doar a
Acum vom adăuga câteva stiluri la pagina noastră folosind CSS.
corp, un font-family: 'Tahoma'; culoare: #fff; fundal-culoare: # 000; font-size: 12px; #content width: 600px; #content mici, #content span, #content .more-link display: none; #content img float: left; margin-dreapta: 5px; #content h1
font-size: 14px;
Acest CSS este mai mult despre a demonstra câteva caracteristici importante decât a fi atrăgătoare din punct de vedere estetic. Câteva lucruri importante pe care trebuie să le menționăm în acest moment sunt faptul că trebuie să ne amintim să alocăm stiluri exact etichetelor pe care le urmărim pentru styling - I.E. nu stilul tuturor tag-uri - nu vrem decât să stilizăm cele din #content Un alt lucru pe care îl putem face pentru a face ca sindicatorul nostru de știri să preia mai puțin spațiu pe ecranul nostru este să modificăm imaginile. Acest lucru se poate face folosind CSS, dar în schimb vreau să demonstrez folosind JQuery pentru a modifica sursa imaginii. Vom modifica JQuery pentru a folosi funcția attr () pentru a modifica sursa imaginii noastre pe una pe serverul propriu - un buton de legătură frumos, puțin. Acum permiteți modificarea ușoară a CSS-ului pentru a face ca imaginea noastră să plutească bine în stânga. Acum, folosind doar conținut sindicalizat din pagina de pornire Net Tuts +, am reușit să construim un syndicator de știri cu stil complet diferit de site-ul original. Ceea ce ați putea observa când utilizați acest cod este că este nevoie de o perioadă de timp pentru ca JQuery să proceseze și să încarce site-ul extern. O caracteristică bună de adăugat este o bară de încărcare pentru #content Cea mai ușoară cale de a face bara de încărcare este plasarea unei imagini de bare de încărcare în interiorul #contentului nostru Acum avem o mică aplicație care va afișa o imagine de preîncărcare până când conținutul nostru este gata să apară. În timp ce preloader-ul este o caracteristică frumoasă, nu este un înlocuitor pentru codul optimizat. În acest tutorial folosim JQuery pentru a alege ce elemente ar trebui să selectăm sau nu, când în realitate cea mai rapidă soluție optimă ar fi aceea de a face acest lucru în codul nostru PHP. Aceasta, însă, este în afara scopului acestui tutorial. Acolo o avem - o soluție simplă folosind funcțiile AJAX ale JQuery și biblioteca cURL a PHP care ne permite să sindicam conținut extern. Aceasta este o soluție simplă dacă aveți nevoie de conținut de pe un site web extern. După cum am precizat deja, deși sintaxa ușoară a JQuery și selectorii CSS ne dau confortul de a alege stilul și de a alege ceea ce vrem de la client, acest lucru nu este optimizat în funcție de viteză. Cel mai bun lucru ar fi pentru noi să eliminăm tag-urile pe care nu le dorim folosind Expresii regulate în PHP. Aș remarca, de asemenea, că una dintre cele mai frecvente greșeli este prea specifică în ceea ce privește stilul; amintiți-vă că nu aveți niciun control asupra faptului dacă creatorul de conținut modifică ce etichete și clase utilizează sau nu, este întotdeauna cel mai bine să modeleze elementele generale care vor fi utilizate în mod obișnuit. Un alt lucru care merită luat în considerare este că acest tutorial are rolul de a genera un sindicator de conținut - nu este destinat utilizării ca "conținut răzuit" al unui site. Dacă intenționați să implementați acest lucru într-un proiect comercial, asigurați-vă că aveți permisiunea deținătorului drepturilor de autor pentru a utiliza conținutul din pagina dvs.. Modificați imaginile utilizând JQuery
... $ (# content img) fiecare (funcția (i) var src = $ (aceasta) .attr ('src'); var new_src = new_src);); $ ("# content img"). atr ('src', 'link.png'); ); );
#content img float: left; margin-dreapta: 5px;
preîncărcare
...
Serviciul meu de sindicare a conținutului
... Concluzie