PHP&Ajax: RSS Reader
Jednoduchý RSS Feed, který umožňuje načítat zdroje pomocí Ajaxu. Zpracování zdrojů probíhá na straně serveru s podporou DOMDocument.
V předchozím článku o Ajaxu jsem ukazoval jednoduché odesílání proměnných pomocí metody GET a zobrazení výstupu volaného PHP souboru.
V tomto příkladu bude použit pro javascript podobný kód, takže jej nebudu vysvětlovat, protože si jej můžete, včetně vysvětlení prohlédnout v minulém článku.
Hotový Rss reader si můžete vyzkoušet zde:
RSS Reader
Vytvoříme si jednoduchý RSS Feed, který bude umožňovat načítat a zobrazovat zprávy z externích zdrojů.
Zpracování zdroje provedeme pomocí DOMDocument, se kterým je to velmi jednoduché.
Budeme tedy potřebovat jeden PHP soubor, ve kterém se bude zdroj zpracovávat.
Do tohoto souboru si předáme URL adresu pro RSS pomocí GETu a vytvoříme novou instanci DOMDocument:
1 2 3 4 5 6 7 |
//nacteme zdroj z url adresy predane prez ajax $feed = $_GET['value']; //vytvorime novou instanci DOMDocument $xml = new DOMDocument(); //nacteme zdroj $xml->load($feed); |
Nyní máme celý zdroj načtený a můžeme jej zpracovat a vypsat.
Jako hlavičku vypíšeme předanou z CHANNEL v podobě TITLE a odkazu LINK.
1 2 3 4 5 |
//ziskame elementy z <chanel> $channel=$xml->getElementsByTagName('channel')->item(0); //Vypiseme hlavicku print '<a href="' . $channel->getElementsByTagName('link')->item(0)->childNodes->item(0)->nodeValue . '">' . $channel->getElementsByTagName('title')->item(0)->childNodes->item(0)->nodeValue . '</a>'; |
Nakonec budeme načítat jednotlivé ITEM, ze kterých postupně zobrazíme informace:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//elementy z <item> $item=$xml->getElementsByTagName('item'); //v cyklu vypisujeme jednotlive nactene clanky for($i=0; $i < 5; $i++ ){ //zjisteni title $title = $item->item($i)->getElementsByTagName('title') ->item(0)->childNodes->item(0)->nodeValue; //zjisteni odkazu $link = $item->item($i)->getElementsByTagName('link') ->item(0)->childNodes->item(0)->nodeValue; //zjisteni descriptions $descriptions = $item->item($i)->getElementsByTagName('description')->item(0)->childNodes->item(0)->nodeValue; //javascriptem bude mozne si rozkliknout descriptions print '<a href="#" onclick="show_rss('id_d_' . $i . ''); return false;">+</a>&nbsp;'; //odkaz na clanek s jeno nazvem print '<a href="' . $link. '" title="' . $title . '">' . $title . '</a><br />'; //vypis descriptions print '<p id="id_d_' . $i . '" style="display:none; padding: 10px">' . $descriptions . '<br /><br /></p>'; } ?> |
Celý zdrojový kód si můžete prohlédnout zde:
load.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?php //nacteme zdroj z url adresy predane prez ajax $feed = $_GET['value']; //vytvorime novou instanci DOMDocument $xml = new DOMDocument(); //nacteme zdroj $xml->load($feed); //ziskame elementy z <chanel> $channel=$xml->getElementsByTagName('channel')->item(0); //Vypiseme hlavicku print '<a href="' . $channel->getElementsByTagName('link')->item(0)->childNodes->item(0)->nodeValue . '">' . $channel->getElementsByTagName('title')->item(0)->childNodes->item(0)->nodeValue . '</a>'; print '<p>Posledních 5 článků: </p>'; //elementy z <item> $item=$xml->getElementsByTagName('item'); //v cyklu vypisujeme jednotlive nactene clanky for($i=0; $i < 5; $i++ ){ //zjisteni title $title = $item->item($i)->getElementsByTagName('title') ->item(0)->childNodes->item(0)->nodeValue; //zjisteni odkazu $link = $item->item($i)->getElementsByTagName('link') ->item(0)->childNodes->item(0)->nodeValue; //zjisteni descriptions $descriptions = $item->item($i)->getElementsByTagName('description')->item(0)->childNodes->item(0)->nodeValue; //javascriptem bude mozne si rozkliknout descriptions print '<a href="#" onclick="show_rss('id_d_' . $i . ''); return false;">+</a>&nbsp;'; //odkaz na clanek s jeno nazvem print '<a href="' . $link. '" title="' . $title . '">' . $title . '</a><br />'; //vypis descriptions print '<p id="id_d_' . $i . '" style="display:none; padding: 10px">' . $descriptions . '<br /><br /></p>'; } ?> |
rss_feed.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
<?php $feeds = array( 'Zaachi.com' => 'http://www.zaachi.com/cs/rss', 'Novinky.cz' => 'http://novinky.cz/rss2/', 'Zive.cz' => 'http://www.zive.cz/RSS/sc-47/default.aspx?rss=1' ); print '<div style="width: 400px">'; print '<div style="width: 100px;margin:10px; float: right; border: 1px solid gray; padding: 3px">'; foreach( $feeds as $id=>$value ){ print '<a href="#" onclick="request('' . $value . ''); return false;">' . $id . '</a><br />'; } print '</div>'; print '<div style=" padding: 10px" id="rssfeed">'; print 'Vyberte zdroj'; print '</div>'; print '</div>'; ?> <script type="text/javascript"> function request( value ){ //vytvoreni nove promenne var request = null; //gecko if( window.XMLHttpRequest ){ request = new XMLHttpRequest() } else if ( window.ActiveXObject ){ //IE request = new ActiveXObject("Microsoft.XMLHTTP"); } //pokud se neporadilo vytvorit if (!request) { alert('nejede a nepojede'); return false; } request.onreadystatechange = function () {go(request); } ; request.open("GET", "load.php?value=" + value, true); request.send( null ); } function go( request ){ var txt; if (request.readyState == 4){ if(request.status == 200 || request.status == 0){ txt=request.responseText; document.getElementById('rssfeed').innerHTML = txt; } } } //moznost rozkliknuti descriptions function show_rss(idecko){ el=document.getElementById(idecko).style; el.display=(el.display == 'inline')?'none':'inline'; } </script> |
Ahoj, mne to trocha nefunguje. Odstránil som chybu na 11 riadku v rss_feed.php a riadok 30 v load.php no nechce mi to rozbaliť články 🙁
Problem je v editoru, ktery pouzivam na webu.
Priklady funguji spravne, jenom editor mi oseka lomitka a nejake dalsi znaky.
Ach tak, tak potom, že mi to nefunguje 🙂 asi to niečo odstránilo z JavaScriptu keď mi to nerozbaľuje tie položky. Môžeš mi to prosím ťa poslať mailom?
Ahoj, mam rovnaky proble, nerozbaluje polozky, mozem poprosit poslat to tiez poslat na mail? Dakujem.