PHP: Generování RSS z databáze pomocí DOMDocument
Kromě šablon se k vytváření RSS používá i přímý zápis do výstupu. To přináší několik problémů v podobě potřeby ošetření vstupu, zejména pokud příspěvky pochází od různých autorů. PHP však obsahuje třídu DOMDocument, která vše potřebné vyřídí za nás.
Nejprve si připravím data do databáze. K tomuto účelu jsem si z místního RSS vytáhl dva příspěvky, které jsem uložil do jednoduché tabulky SQLite
BEGIN TRANSACTION; CREATE TABLE clanek(id integer primary key autoincrement, title text, link text, pubDate text, description text, creator text); INSERT INTO "clanek" VALUES(1,'Diskuze: ITnetwork - RSS', '/diskuzni-forum-islandsoft-pochvaly-napady-nazory/rss-508aec4a06fd1#goto16342', 'Fri, 26 Oct 2012 22:02:18 +0200', 'Všiml jsem si, že se dnes změnilo RSS. Udivilo mě, jak se má vlastní čtečka n..', 'Kit'); INSERT INTO "clanek" VALUES(2,'Inkubátor - BattleZombies', '/diskuzni-forum-inkubator-ohlaste-nove-a-rozpracovane-projekty/battlezombies-504a4a2831a1a#goto16341', 'Fri, 26 Oct 2012 21:18:28 +0200', 'Myslím, že demu přikládáš moc velkou obsahovou hodnotu. O moc víc, n...', 'Kuny'); COMMIT;
Záměrně jsem vytvořil tabulku přizpůsobenou RSS, aby příklad nevypadal příliš složitě. Rovněž datum jsem ponechal v textovém tvaru, i když pro interní uložení by se jistě hodil jiný datový typ.
Příklad jsem nedělal modulárně, snad mi to puristé odpustí.
<?php // Nejprve otevřu databázi. $db=new PDO('sqlite:rss.sqlite'); // vytvořím objekt $dom, od kterého budu vytvářet všechny jeho potomky $dom=new DOMDocument("1.0","UTF-8"); // zde je vytvoření kořenového elementu s potřebnými atributy $rss=$dom->createElement('rss'); $rss->setAttribute('version','2.0'); $rss->setAttribute('xmlns:content', "http://purl.org/rss/1.0/modules/content/"); $rss->setAttribute('xmlns:wfw', "http://wellformedweb.org/CommentAPI/"); $rss->setAttribute('xmlns:dc', "http://purl.org/dc/elements/1.1/"); // kořenový element obsahuje element "channel", ve kterém se nachází záhlaví RSS $channel=$dom->createElement('channel'); $channel->appendChild($dom->createElement('title','itnetwork')); $channel->appendChild($dom->createElement('link','http://www.itnetwork.cz/')); $channel->appendChild($dom->createElement('description','ITnetwork - Programátorská sociální síť a materiálová základna')); // součástí záhlaví je i logo $image=$dom->createElement('image'); $image->appendChild($dom->createElement('title','itnetwork')); $image->appendChild($dom->createElement('link','http://www.itnetwork.cz/')); $image->appendChild($dom->createElement('url','http://www.itnetwork.cz/logo.png')); $channel->appendChild($image); // nyní vyberu články. Dotaz je nutné přizpůsobik konkrétní struktuře databáze $result=$db->query("SELECT * FROM clanek"); foreach($result->fetchAll(PDO::FETCH_CLASS) as $row) { $item=$dom->createElement('item'); $item->appendChild($dom->createElement('title',htmlspecialchars($row->title))); $item->appendChild($dom->createElement('link',htmlspecialchars($row->link))); $item->appendChild($dom->createElement('pubDate',$row->pubDate)); $item->appendChild($dom->createElement('description',htmlspecialchars($row->description))); $item->appendChild($dom->createElement('dc:creator',htmlspecialchars($row->creator))); $channel->appendChild($item); } // a nakonec to vše spojím do jednoho stromu a vypíšu na výstup $rss->appendChild($channel); $dom->appendChild($rss); header('Content-Type: text/xml'); echo $dom->saveXML();
Uvedený příklad je velmi jednoduchý a přesto vytvoří podobné RSS, jako generátor na ITnetwork.cz. Úplně zde chybí ošetření chyb, které je jistě nezbytné, ale ukázka by se snadno mohla stát nepřehlednou.
Pozorný čtenář si jistě všiml, že zde není žádná sekce CDATA, která je u originálního RSS. Třída DOMDocument provádí potřebná ošetření vstupního textu, proto taková sekce není nutná. V případě potřeby však je možné ji vytvořit.
Galerie