www.www.zaachi.com » Blog/JavaScript » 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:
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:
//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.
//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:
//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> ';
//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:
<?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> ';
//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>';
}
?>
<?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>
