PHP: Własny kanał RSS |
Wpisany przez Kacper Kołodziej | |||
poniedziałek, 31 maja 2010 12:01 | |||
Wiele osób zadaje sobie pytanie: Jak spowodować, żeby nowi czytelnicy dobrze zapamiętali naszą stronę i często na nią wracali?
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ł.
|