|
[php5] Tworzenie kanału RSS 2.0 w PHP5 Zobacz pojedynczy post
Bardzo modne stało się ostatnio dodawanie kanałów RSS (Really Simple Syndication) do stron WWW. Pozwala to na przeglądanie nagłówków i szybkie przechodzenie do najnowszych wiadomości, bez potrzeby uruchamiania samej strony.
Oto jak może wyglądać przykładowy plik xml zawierający informacje:
PHP: |
<?xml version="1.0" encoding="ISO-8859-2"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>Tytuł strony</title>
<link>adres strony</link>
<description>opis strony</description>
<language>pl</language>
<lastBuildDate>25.12.2007</lastBuildDate>
<generator>generator</generator>
<ttl>czas przechowywania</ttl>
<image>
<url>adres obrazka</url>
<title>tytuł obrazka</title>
<link>link</link>
</image>
<item>
<title>tytuł wiadomości</title>
<link>link do pełnej wersji</link>
<description><![CDATA[Tu możesz wstawić wszystko, łącznie z formatowaniem w XHTML]]></description>
</item>
</channel>
</rss>
|
na tej podstawie możemy utworzyć dwa szablony
plik: rss_main.xml
PHP: |
<?xml version="1.0" encoding="ISO-8859-2"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>{rss_title}</title>
<link>{rss_link}</link>
<description>{rss_desc}</description>
<language>{rss_lng}</language>
<lastBuildDate>{rss_build}</lastBuildDate>
<generator>{rss_gen}</generator>
<ttl>{rss_ttl}</ttl>
<image>
<url>{img_src}</url>
<title>{img_title}</title>
<link>{img_link}</link>
</image>
{items}
</channel>
</rss>
|
oraz
plik: rss_item.xml:
PHP: |
<item>
<title>{item_title}</title>
<link>{item_link}</link>
<description><![CDATA[{item_data}]]></description>
</item>
|
Pozostaje sprawa samego kodu, który przekształci powyższe szablony w kanał RSS 2.0. Pierwszym zadaniem będzie stworzenie danych zawierających konfigurację kanału:
PHP: |
$rss['rss_title']="turniej.unreal.pl";
$rss['rss_link']="http://turniej.unreal.pl";
$rss['rss_desc']="Kanał RSS serwisu turniej.unreal.pl";
$rss['rss_lng']="pl";
$rss['rss_gen']="turniej.unreal.pl";
$rss['rss_ttl']=60;
$rss['img_src']="http://turniej.unreal.pl/system/gfx/rss.jpg";
$rss['img_title']="turniej.unreal.pl";
$rss['img_link']="http://turniej.unreal.pl";
|
Kolejnym krokiem będzie określenie niezbędnych funkcji. Potrzebna nam będzie funkcja, która pobierze dane, przekształci zmienne z konfiguracji i połączy je z plikiem XML, zamieni wartości pomiędzy '{' i '}' na odpowiednie dane, i w końcu zwróci wynik działania. Można to wszystko zrobić jako jedną funkcję, ale od czego mamy nowe możliwości PHP5?
Zróbmy zatem interfejs i klasę:
PHP: |
<?php
/**
* @author Raven
* @copyright 2007
*
* rss interface
*/
interface rss
{
/* renders feed */
static function RenderFeed($config);
/* parases XML file */
static function ParaseXML($xml, $values);
/* gets main feed */
static function GetFeed($config);
/* returns items */
static function getItems($optional=false);
}
class rssfeed implements rss
{
/*
Tu będą funkcje
*/
}
?>
|
i przejdźmy do funkcji ParaseXML. Do przetworzenia pliku XML będą na potrzebne tylko i wyłącznie wyrażenia regularne:
PHP: |
static function ParaseXML($xml, $content)
{
if(!file_exists($xml))
{
return false;
}
else
{
$fd = fopen($xml, "r");
$template = fread ($fd, filesize($xml));
fclose ($fd);
foreach ($content as $key => $value)
{
$template = preg_replace('/\{'.$key.'\}/', $value, $template);
}
return $template;
}
}
|
Prześledźmy działanie funkcji. Jeśli powiedzie się próba otwarcia pliku zawierającego szablon - jest on wczytywany do pamięci. Potem zaś parametry są rozbijane na klucz oraz wartość i wstawiane do wyrażenia regularnego, które zastępuje dane pozycje - właściwymi danymi. W tej chwili mamy najtrudniejszą robotę z głowy. Co nam pozostało, to odpowiednie wstawianie zmiennych.
Główna funkcja kompilująca - GetFeed - zajmuje się przekształcaniem danych z konfiguracji, tworzeniem nagłówka i wywołaniem funkcji pobierającej właściwe dane:
PHP: |
static function GetFeed($config)
{
foreach ($config as $key => $value)
{
$template_vars[$key]=$value;
}
$template_vars['items']=self::getItems();
$template_vars['rss_build']=date('d F Y, H:i',time());
return self::ParaseXML("rss_main.xml", $template_vars);
}
|
funkcja getItems może wyglądać tak:
PHP: |
static function getItems($optional=false)
{
$items="";
/*
Poniższy fragmen to przykład
*/
$template_vars['item_title']="Nowy news";
$template_vars['item_link']="http://turniej.unreal.pl";
$template_vars['item_data']="<b>To jest test</b>";
$items .= self::ParaseXML("rss_item.xml", $template_vars);
return $items;
}
|
Jest to tylko prosty przykład jak wstawiać dane do zmiennej i jak wywołać funkcję przetważającą plik XML. W tym miejscu należy wstawić funkcje pobierającą newsy z bazy danych, itp.
Na koniec zaś funkcja publiczna:
PHP: |
public static function RenderFeed($config)
{
return self::GetFeed($config);
}
|
Niestety nie jest to koniec. Aby efekt działania funkcji był widoczny dla przeglądarki jako kanał RSS należy ustawić odpowiedni nagłówek: PHP: |
header("Content-Type: application/xml; charset=ISO-8859-2");
|
i nie będzie kłopotu. Gotowy plik może wyglądać tak:
plik: rss.php
PHP: |
<?php
/**
* @author Raven
* @copyright 2007
* @created 18:27 24.12.2007
* Released under GPL License.
*/
header("Content-Type: application/xml; charset=ISO-8859-2");
$rss['rss_title']="turniej.unreal.pl";
$rss['rss_link']="http://turniej.unreal.pl";
$rss['rss_desc']="Kanał RSS serwisu turniej.unreal.pl";
$rss['rss_lng']="pl";
$rss['rss_gen']="turniej.unreal.pl";
$rss['rss_ttl']=60;
$rss['img_src']="http://turniej.unreal.pl/system/gfx/rss.jpg";
$rss['img_title']="turniej.unreal.pl";
$rss['img_link']="http://turniej.unreal.pl";
interface rss
{
/* renders feed */
public static function RenderFeed($config);
/* parases XML file */
static function ParaseXML($xml, $values);
/* gets main feed */
static function GetFeed($config);
/* returns items */
static function getItems($optional=false);
}
class rssfeed implements rss
{
/* renders feed */
public static function RenderFeed($config)
{
return self::GetFeed($config);
}
/* parases XML file */
static function ParaseXML($xml, $content)
{
if(!file_exists($xml))
{
return false;
}
else
{
$fd = fopen($xml, "r");
$template = fread ($fd, filesize($xml));
fclose ($fd);
foreach ($content as $key => $value)
{
$template = preg_replace('/\{'.$key.'\}/', $value, $template);
}
return $template;
}
}
/* gets main feed */
static function GetFeed($config)
{
foreach ($config as $key => $value)
{
$template_vars[$key]=$value;
}
$template_vars['items']=self::getItems();
$template_vars['rss_build']=date('d F Y, H:i',time());
return self::ParaseXML("rss_main.xml", $template_vars);
}
/* returns items */
static function getItems($optional=false)
{
global $_DB;
$items="";
/*
Poniższy fragmen to przykład
*/
$template_vars['item_title']="Nowy news";
$template_vars['item_link']="http://turniej.unreal.pl";
$template_vars['item_data']="<b>To jest test</b>";
$items .= self::ParaseXML("rss_item.xml", $template_vars);
return $items;
}
}
echo rssfeed::RenderFeed($rss);
?>
|
Aby informacja o istnieniu kanału pojawiała się na stronie, należy w nagłówkach XHTML dodać:
PHP: |
<link rel="alternate" type="application/rss+xml" title="turniej.unreal.pl RSS Feed" href="rss.php" />
|
Oczywiście jest to tylko prosty przykład, który może być dalej rozbudowywany.
|
|