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
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->setdbCallback(array('Rss', 'getMysqliData'));
Jako první nastavme základní statické vlastnosti RSS feedu
$rss->settitle('Finweblog');
$rss->setlink('http://weblog.finwe.info');
$rss->setdescripton('Finweblog - 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:wfw','http://wellformedweb.org/CommentAPI/');
Teď nastavíme detaily spojení s databází. Pokud jsme použili vlastní externí handler, můžeme tyto kroky vynechat.
$rss->setdbHost('localhost');
$rss->setdbUser('user');
$rss->setdbPass('pass');
$rss->setdbName('name');
$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'=>'hodnota'.
Nastavíme, které sloupce se mají použít pro který tag RSS.
$rss->setdbFields(array(
'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','seo_url'),'http://weblog.finwe.info/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.finwe.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://weblog.finwe.info/item/%s');
$rss->setcommentsLink('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(array(
...
'link' => array('id','seo_url'),
...;
$rss->setpostLink('/item/%s/komentar-%s');
Hotovo, zbývá jen odeslat feed na výstup.
$rss->display();
description tak, aby končil okolo
450. znaku, nikdy uprostřed slova, a pokud ano, na konec přidá tři
tečkytitle vložit statický
řetězec, hodnota klíče title bude pole s položkami
sloupec-tabulky,řetězec$rss->setdbFields(array(
...
'title' => array('id','Formát %s'), // Pro jednu proměnnou
'author' => array(array('id,author'),'%s formát %s') // Pro více proměnných
...;
$rss->setpostLink('/item/%s/komentar-%s');
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)
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
RSS feed komentářů k tomuto článku
#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?
#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 ;)
#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 ;)
Když chci parametrizovat víc proměnnejch, tak bych napsal něco jako
setConnParams(array('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.
Měl bych pár lehkých dloubnutí.. ;)