PHP třída generující RSS

Měl jsem potřebu moci do kteréhokoliv svého projektu jednoduše přidat RSS feed, nezávisle na struktuře dat v databázi, a na zdroji dat vůbec. Na internetu jsem buď líný hledat, nebo nic takového, co by mi vyhovovalo, neexistuje. Tím pádem vznikla třída Rss (možná ještě přejmenuji), volně k použití pod licencí CC Attribution-ShareAlike 2.5

Potřeby, vlastnosti

Ukázka

Nejprve je samozřejmě potřeba includovat potřebné soubory a vytvořit třídu:

require_once ‚rss.class.php‘; $rss = new Rss;

Nadchází nastavení vlastností daného RSS:

Jako první nastavme handler pro získání dat z databáze. Hodnota je používána pro callback, nelze tedy specifikovat parametry, ale je možné (krom interních handlerů) volat jak externí funkci, tak statickou metodu třídy.

Samotná třída Rss má dva handlery vestavěné – pro obě varianty práce s MySQL. Defaultní handler je MySQL 4.0, ten tedy není potřeba explicitně nastavovat.

// Použijme MySQL 4.1+ handler, vestavěný ve třídě $rss->setdbCallbac­k(array(‚Rss‘, ‚getMysqliData‘));

Jako první nastavme základní statické vlastnosti RSS feedu

$rss->settitle(‚Fin­weblog‘); $rss->setlink(‚http://we­blog.finwe.in­fo‘); $rss->setdescripton(‚Fin­weblog – Matěj Finwe Humpál – Webdesign, Turistika, Muzika‘); $rss->setlanguage(‚cs‘);

Rss třída v základě rozpoznává 10 základních typů RSS tagů (guid, link, description, comments, title, author, source, category, enclosure, pubDate). Pokud je v klíči pole Rss::dbFields nastaven jiný string, může se přihodit, že budeme potřebovat přidat do hlavičky RSS určitý namespace: (definice tagů viz níže)

// budu používat wfw:commentRSS, musím nadefinovat namespace $rss->addNamespace(‚xmlns:wf­w‘,‚http://we­llformedweb.or­g/CommentAPI/‘);

Teď nastavíme detaily spojení s databází. Pokud jsme použili vlastní externí handler, můžeme tyto kroky vynechat.

$rss->setdbHost(‚lo­calhost‘); $rss->setdbUser(‚u­ser‘); $rss->setdbPass(‚pas­s‘); $rss->setdbName(‚na­me‘); $rss->setdbPort(‚3307‘);

Nastavení dotazu pro vyhledání správných polí ve správné tabulce. Náleží také pouze interním datahandlerům.

$rss->setdbSql(„SELECT id, seo_url, title, perex, timestamp, gr FROM blog WHERE status = ‚published‘ ORDER BY timestamp DESC LIMIT 15“);

A nyní nastává ta pravá zábava. Data handler nám vrátil pole s položkami ve formátu ‚jmeno-sloupce‘=>‚hod­nota‘. Nastavíme, které sloupce se mají použít pro který tag RSS.

$rss->setdbFields(a­rray( ‚link‘‚seo_url‘, // Proměnná pro použití v tagu link. Viz dále ‚title‘‚title‘, ‚description‘‚perex‘, ‚comments‘‚id‘, // Proměnná pro použití v tagu comments. Viz dále ‚category‘‚gr‘, ‚pubDate‘‚timestamp‘ // třída očekává typ UNIX_TIMESTAMP // Příklad osobního tagu: // ‚wfw:commentRSS‘ ⇒ ‚id‘, // pokud tag bude mít pouze hodnotu z tabulky // ‚wfw:commentRSS‘ ⇒ array(array(‚id‘,‚se­o_url‘),‚http://­weblog.finwe.in­fo/rss-comments.php?id=%s&%­s‘) pokud bude mít tag více proměnných zasazených do stringu ‚wfw:commentRSS‘array(‚id‘,‚http­://weblog.fin­we.info/rss-comments.php?id=%s‘) pokud má tag jednu proměnnou zasazenou do stringu ));

Nastavíme řetězce, které se použijí pro zkombinování URL pro tagy link a comments

// linky musejí být absolutní $rss->setpostLink(‚http://we­blog.finwe.in­fo/item/%s‘); $rss->setcommentsLin­k(‚http://weblog­.finwe.info/rss-comments.php?id=%s‘);

Až do teď jednoduché. Ale co když potřebujeme v řetězci víc proměnných? Bez problému, stačí v Rss::dbFields nastavit jako hodnotu klíče link/comments pole s potřebným počtem proměnných.

$rss->setdbFields(a­rray( … ‚link‘array(‚id‘,‚se­o_url‘), …; $rss->setpostLink(‚/i­tem/%s/komentar-%s‘);

Hotovo, zbývá jen odeslat feed na výstup.

$rss->display();

Vychytávky

$rss->setdbFields(a­rray( … ‚title‘array(‚id‘,‚For­mát %s‘), // Pro jednu proměnnou ‚author‘array(array(‚id,au­thor‘),‚%s for­mát %s‘) // Pro více proměnných …; $rss->setpostLink(‚/i­tem/%s/komentar-%s‘);

Verzování, licence, download

Momentálně se třída nachází ve versi 1.2.5. Bugreport i feature-request je vítán, na mail, nebo zde v komentářích, postupně snad vychytám(e) mouchy a přidám(e) třeba i nějaké ty třešničky na dort.

Licence celého třídy je CC Attribution-ShareAlike 2.5

Automaticky generovaná dokumentace s anglickými komentáři a příklady

Třídu Rss ve verzi 1.3 stahujte zde (ZIP, 5kiB)

Changelog

Co dodat?

Objevuji Ameriku? Objevuji ji rád. Toto je můj první veřejný dokončený projekt, mám z něj radost a ta mi snad dodá energii pro další rozpracované projekty. Ale o nich třeba příště.

P. S. Za oponenturu a lehký feature-request díky Andrewovi

Computer$, (Web)design

Komentáře

xom

15. 2. 2007, 13.37

Měl bych pár lehkých dloubnutí.. ;)

  1. Názvy metod bych upravil, aby byly jednotné viz setcommentsLink a addNamespace – myslím, že by bylo přehlednější a intuitivnější, když bys použil standardního Javovského pojmenovávání – první písmeno velké, každé další, kterým začíná nové slovo, velké.. př. setCommentsLink
  2. Je možno volat metody „řetězově“? př. $rss->setdbHost(‚lo­calhost‘)->setdbUser(‚user‘)->setdbPass(‚pass‘)->setdbName(‚name‘)->setdbPort(‚3307‘);

Andrew

15. 2. 2007, 13.47

#1 – xom Ty vole, to řetězový volání sis zrovna teď vymyslel, viď? Něco tak příšernýho by mě nikdy nenapadlo. Znamenalo by to, že každá set… metoda by vracela $this?


Finwe

15. 2. 2007, 13.55

#1 – xom myslíš první písmeno malé, že? Určitě by to tak šlo, to, že to tak nejde vychází z použití metody __call() a pojmenování proměnných (ty mají malé písmeno na začátku a tudíž s velkým ve jméně metody nefungují. Ošetřilo by se to zmenšením prvního písmena názvu metody v __call(), možná tu možnost zahrnu do další verze ;))

Metody řetězit nejdou a ani nepůjdou ;)


xom

15. 2. 2007, 14.07

#2 – Andrew Jasně, každá metoda by vracela $this.. ;) Prvně jsem to viděl na LaTrině, takže jsem to bohužel nevymyslel já, nicméně se tím chlubili už i tvůrci PHP5, když ukazovali, co je nového.. A pokud člověk potřebuje rychle něco naparametrizovat, tak to není úplně blbej zápis ;)


Andrew

15. 2. 2007, 14.23

Když chci parametrizovat víc proměnnejch, tak bych napsal něco jako

setConnParams(a­rray(‚host‘‚localhost‘, ‚user‘‚lojza‘));

Z logiky věci neexistuje důvod, proč by metoda nastavující atribut objektu měla ten objekt za návratovou hodnotu. Když už, tak bych čekal boolean.


Vložit komentář

K tomuto příspěvku není povoleno přidávat komentáře.