Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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ť.


 

Predchádzajúci článok
Práca s MySQL v PHP - použitie základného ovládača
Všetky články v sekcii
Ostatné tutoriály v PHP
Článok pre vás napísal Kit
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Jsem spokojeným uživatelem operačních systémů založených na linuxovém jádře. Zejména openSUSE a Ubuntu. Pro psaní veškerých textů a programů používám vynikající textový editor Vim. Aplikace se snažím psát vždy v tom nejvhodnějším programovacím jazyk...
Aktivity