| PHP: Własny kanał RSS |
|
| Wpisany przez Kacper Kołodziej | |||
| poniedziałek, 31 maja 2010 12:01 | |||
|
W interesie twórcy serwisu jest więc spowodowanie, żeby każdy wykonał jakąś czynność, która pozwoli mu na zapamiętanie i powrót do naszej strony.
Klasa do obsługi kanaługoogle_protectAndRun("ads_core.google_render_ad", google_handleError, google_render_adJeśli planujemy stworzenie wielu kanałów wiadomości, najlepiej napisać w PHP klasę, która będzie generowała kanał RSS. Ja, chociaż (na razie) prowadzę tylko jeden kanał RSS, to korzystam z możliwości jakie daje programowanie obiektowe. Dlatego Ciebie też do tego zachęcam. encoding=$encoding;
$this->file=$fsave;
$this->dateFormat="d.m.Y H:i";
if ($this->file) {
if (!(@fopen($this->file,"w+"))) {
return false;
}
}
$this->itemIndex=0;
$this->isImg=false;
$this->addInfo("lastBuildDate",date("r"));
$this->addInfo("generator","RSSGenerator v1.1 by Kacper Kołodziej (http://kacperkolodziej.com) 2010; (inspired by RSScreator v1.0 by Paweł Lis");
}
public function addInfo($k,$v) {
$this->info[$k]=$v;
}
public function setImg($filename,$url,$title=null) {
if (!empty($title)) {
$this->image['title']=$title;
}
$this->image['link']=$url;
$this->image['url']=$filename;
list($this->image['width'],$this->image['height']) = getimagesize($filename);
$this->isImg=true;
}
public function item($title,$url,$desc,$date=null) {
$this->item[$this->itemIndex]['title']=$title;
$this->item[$this->itemIndex]['link']=$url;
$this->item[$this->itemIndex]['description']=$desc;
if (is_int($date)) {
$this->item[$this->itemIndex]['pubdate']=date($this->dateFormat,$date);
} elseif ($date=="now") {
$this->item[$this->itemIndex]['pubdate']=date($this->dateFormat);
} else {
$this->item[$this->itemIndex]['pubdate']=null;
}
$this->itemIndex=count($this->item);
}
public function __destruct() {
$doc=new DOMDocument("1.0",$this->encoding);
$doc->formatOutput=true;
$rss=$doc->appendChild($doc->createElement("rss"));
$rss->setAttribute("version","2.0");
$rss->setAttribute("xmlns:atom","http://www.w3.org/2005/Atom");
$channel=$rss->appendChild($doc->createElement("channel"));
if ($this->isImg) {
$img=$channel->appendChild($doc->createElement("image"));
foreach ($this->image as $key => $value) {
$imgE=$img->appendChild($doc->createElement($key));
$text=$imgE->appendChild($doc->createTextNode($value));
}
}
foreach ($this->info as $key => $value) {
$dataE=$channel->appendChild($doc->createElement($key));
$text=$dataE->appendChild($doc->createTextNode($value));
}
foreach ($this->item as $array) {
$item=$channel->appendChild($doc->createElement("item"));
foreach ($array as $key => $value) {
$itemE=$item->appendChild($doc->createElement($key));
$text=$itemE->appendChild($doc->createTextNode($value));
}
}
if ($this->file) {
$f=fopen($this->file,"w+");
$s=fputs($f,$doc->saveXML());
$c=fclose($f);
if ($f && $s && $c) {
return true;
} else {
return false;
}
} else {
header("Content-type: application/xml; charset=" . $this->encoding);
print $doc->saveXML();
}
}
}
?>
Klasa jest w całości mojego autorstwa. Można z niej korzystać na zasadach licencji GNU GPL v3. Przypomnę tylko, że:
* należy dodawać informacje o autorze modyfikacji w zmiennej rss
$rss->addInfo("title","Testowy kanał RSS"); //dodajemy tytuł kanału
$rss->addInfo("link","http://kacperkolodziej.com/"); //dodajemy link do strony
$rss->addInfo("description","Opis przykładowego kanału RSS"); //dodajemy opis kanału
$rss->setImg("http://kacperkolodziej.com/img/logo.png","http://kacperkolodziej.com/","Logo przykładowego kanału RSS"); //dodajemy obrazek; argumenty funkcji: link do obrazka, adres link "na" obrazku
$data=123456; //data dodania przykładowego elementu
$rss->dateFormat="d/m/Y"; //zmieniamy format daty - zmienna $dateFormat typu public
$rss->item("Przykładowy element","http://strona/podstrona","Opis przykładowego elementu ",$data); //dodajemy element
?>
Jak widać wszystko odbywa się błyskawicznie. Oczywiście bardzo łatwo
generować kanał RSS za pomocą wpisów z bazy danych. Wystarczy
odpowiednie zapytanie, które wybierze ostatnie 10 wpisów (sortując
malejąco po dacie):
SELECT * FROM `tabela_z_wpisami` ORDER BY `data_dodania` DESC LIMIT 10
Następnie za pomocą funkcji mysql_fetch_array() "wydobędziemy" po kolei wszystkie wybrane wpisy. w zmiennej rss
$rss->addInfo("title","Testowy kanał RSS"); //dodajemy tytuł kanału
$rss->addInfo("link","http://kacperkolodziej.com/"); //dodajemy link do strony
$rss->addInfo("description","Opis przykładowego kanału RSS"); //dodajemy opis kanału
$rss->setImg("http://kacperkolodziej.com/img/logo.png","http://kacperkolodziej.com/","Logo przykładowego kanału RSS"); //dodajemy obrazek; argumenty funkcji: link do obrazka, adres link "na" obrazku
$sql=mysql_query("SELECT * FROM `tabela_z_wpisami` ORDER BY `data_dodania` DESC LIMIT 10");
while ($row=mysql_fetch_array($sql)) {
$rss->item($row['tytul'],"http://strona/plik?id=" . $row['id'],substr(0,250,$row['tresc']),$row['data_dodania']);
}
?>
Oczywiście nie możesz skopiować powyższego kodu w takiej formie jak go widzisz. Aby działał on, musisz posiadać odpowiednią bazę danych i odpowiedni plik, który na podstawie zmiennej $_GET['id'] odczyta z bazy artykuł.
|