PHP: Generování RSS z databáze pomocí DOMDocument

PHP Ostatní 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: devbook - 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','devbook'));
$channel->appendChild($dom->createElement('link','http://www.itnetwork.cz/'));
$channel->appendChild($dom->createElement('description','devbook - 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','devbook'));
$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 devbook.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.


 

  Aktivity (1)

Článek pro vás napsal Kit
Avatar
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...

Jak se ti líbí článek?
Celkem (3 hlasů) :
55555


 


Miniatura
Všechny články v sekci
Ostatní tutoriály v PHP
Miniatura
Následující článek
Jednoduchý chat v PHP

 

 

Komentáře

Avatar
Kit
Redaktor
Avatar
Kit:

Pro labužníky jsem napsal ještě RSS generátor s použitím třídy XMLwriter.
http://www.itnetwork.cz/dev-lighter/173
Třída je univerzální, všechna data se dodávají přes parametry. Snažil jsem se o jednoduchost, přehlednost, eleganci a dependency injection. Je možné generovat RSS i pro více kanálů současně. Je to velmi rychlé.

Odpovědět 14.8.2013 15:30
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 1 zpráv z 1.