PHP: Generovanie RSS z databázy pomocou DOMDocument
Okrem šablón sa k vytváraniu RSS používa aj priamy zápis do výstupu. To prináša niekoľko problémov v podobe potreby ošetrenia vstupu, najmä pokiaľ príspevky pochádza od rôznych autorov. PHP však obsahuje triedu DOMDocument, ktorá všetko potrebné vybaví za nás.
Najprv si pripravím dáta do databázy. K tomuto účelu som si z miestneho RSS vytiahol dva príspevky, ktoré som uložil do jednoduchej tabuľky 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ámerne som vytvoril tabuľku prispôsobenú RSS, aby príklad nevyzeral príliš zložito. Takisto dátum som ponechal v textovom tvare, aj keď pre interné uloženie by sa iste hodil iný dátový typ.
Príklad som nerobil modulárne, snáď mi to puristi 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ý príklad je veľmi jednoduchý a napriek tomu vytvoria podobné RSS, ako generátor na ITnetwork.cz. Úplne tu chýba ošetrenie chýb, ktoré je určite nevyhnutné, ale ukážka by sa ľahko mohla stať neprehľadnou.
Pozorný čitateľ si iste všimol, že tu nie je žiadna sekcie CDATA, ktorá je u originálneho RSS. Trieda DOMDocument vykonávania potrebných ošetrenie vstupného textu, preto takáto sekcia nie je nutná. V prípade potreby však je možné ju vytvoriť.