PHP: Własny kanał RSS Drukuj
Ocena użytkowników: / 1
SłabyŚwietny 
Wpisany przez Kacper Kołodziej   
poniedziałek, 31 maja 2010 12:01

Budowanie kanału RSSWiele osób zadaje sobie pytanie: Jak spowodować, żeby nowi czytelnicy dobrze zapamiętali naszą stronę i często na nią wracali?
Oprócz oczywistej kwestii jaką jest wysoki poziom treści, należy pamiętać, że większość z nas przegląda dziennie dziesiątki, a niekiedy setki różnych stron internetowych. Może się więc zdarzyć tak, że jeśli nie zapisaliśmy sobie konkretnej strony w zakładkach, to po prostu o niej zapomnimy już za dzień czy dwa.

 

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.
Po reformach przeprowadzonych w przeglądarkach internetowych, nie mamy już możliwości stworzenia przycisku, który pozwoli na dodanie do ulubionych naszej strony. Pozostają więc dwa najbardziej popularne rozwiązania: newsletter i kanał RSS. Chociaż pierwsze z nich wydaje się bardziej zachęcające dla użytkownika (kiedy otrzymujemy wiadomość e-mail, choć wiemy, że wysłał ją automat, to czujemy się bardziej zobowiązani, żeby kliknąć w odnośnik, ponieważ "ktoś" do nas napisał), to drugie jest bardziej skuteczne. Dlaczego? Czytnik RSS, z reguły, mamy uruchomiony cały czas, co spowoduje natychmiastowe powiadomienie o nowych treściach na ulubionej stronie. Z pocztą e-mail jest taki problem, że niektórzy odwiedzają ją nawet rzadziej niż raz na tydzień!
Teraz, po solidnym wprowadzeniu do tematu, zabierzmy się za pracę.

 

 

Klasa do obsługi kanału

google_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
* rozpowszechniać klasę można w dowolny sposób, pod warunkiem, że zostanie zachowana informacja o autorze pierwotnej wersji i autorach modyfikacji.

No dobrze, skoro już sobie wytłumaczyliśmy na jakich warunkach można korzystać z tej klasy, zabierzmy się do najprostszej, najkrótszej i najprzyjemniejszej części tworzenia własnego kanału RSS.
Zakładam, że znasz podstawowe zasady korzystania z klas, więc przedstawię Ci kod - jego omówienie jest "w nim" - tzn. w komentarzach ;)

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.
Wtedy taki skrypt wyglądałby tak:

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ł.