RSS Feed im Eigenbau (2 / 2)

Im 1. Teil des Tutorials habe wir uns den Grundaufbau eines RSS Feeds angeschaut und eine Möglichkeit gefunden, gestalterisch etwas Kreativität in unseren Feed zu bringen. Nun ja, dass alles können wir getrost in die Tonne kloppen und mit einem neuen leeren "Blatt" beginnen. Denn nun wird's lustig: wir bringen mit Hilfe von PHP etwas leben in unseren Feed.
Diesmal bauen wir den Code Zeile für Zeile auf:
01 <?php
02 include("../functions/sql.php");
03 include("scribo_rss_fct.php");
04
05 echo "<?xml version=\"1.0\" encoding=\"utf-8\" ?> \n";
06 ?>
07 <rss version="2.0"> \n
08
09 <channel> \n

Dies ist unsere neue Dokumentendeklaration: Zuerst habe ich zwei weitere PHP Dateien "angesprochen", die wir später noch brauchen werden. Die Deklaration des XML Dokumentes darf diesmal nicht als klartext da stehen, weil wir ja statt XML eine PHP Datei schreiben wollen. Darum geben wir diese Zeile unter PHP mit echo aus. Danach schließen wir das PHP Script und der Rest bleibt wie gehabt.

Nun folgen wieder unsere Tags für den Head Bereich:
10 <title>Lautsprecher</title> \n
11 <link>http://blog.mwi-projects.de</link> \n
12 <description>Die Welt aus...</description> \n
13 <language>de-DE</language> \n
14 <copyright>MWi</copyright> \n

Bisher also alles wie gehabt. Doch nun kommen wir zum . Wir brauchen also den Zeitpunkt des neusten Artikels. Und hier kommt es nun darauf an, wie ihr eure Datenbank angelegt habt. Nehmen wir für dieses Tutorial einfach meine Datenbank für Scribo: da erwarten uns folgende Felder in der Artikeltabelle:
Article_ID,
Article_Author,
Article_Topic,
Article_Caption,
Article_Text,
Article_Date,
Article_Time
OK, da steht zwar noch mehr drin und bezüglich des Autoren und des Themas hab ich den Datenbankzugriff jetzt auch vereinfacht, aber wir behandeln hier ja auch nicht das Thema SQL_Querys.
Wie ich schon im 1. Teil anmerkte, müssen die Zeitangaben für RSS-Feeds in einem speziellen Format vorliegen. Also hab ich mir eine kleine Funktion gebaut (diese liegt in scribo_rss_fct.php) die mir das bewerkstelligt. Und so schaut sie aus:
01 <?php
02 function($date, $time)
03 {
04 $a = explode ( '-', $date );
05 $b = explode ( ':', $time );
06
07 $timestamp = mktime($b[0],$b[1],0,$a[1],$a[2],$a[0]);
08 $new_date = date("D, d M Y H:i:s +0200", $timestamp);
09
10 return $new_date;
11 }
12 ?>

Ok, was passiert hier: zuerst sei gesagt, dass die Datumsangabe in meiner Datenbank in MySQL Timestamp Form gespeichert sind. Beispiel für den heutigen Tag wäre also 2008-10-09.
Wir splitten also in Zeile 4 und 5 Datum und Uhrzeit wieder in die einzelnen Ziffern auf. Mit dem Befehl "mktime" machen wir aus den einzelnen Komponenten wieder einen gültigen Unix Timestamp, der unser gewünschtes Datum enthält. Und schon ist es ganz einfach, das für RSS-Feeds benötigte Format zu erzeugen.
Kommen wir nun zurück zu unserem RSS-Feed. Dort müssen wir nun nur noch die Datenbank nach dem gewünschten Datum, etc. abfragen:
16 <?php
17 $query = "SELECT Article_Date, Article_Time
18 FROM $scribo_article
19 ORDER BY Article_ID DESC
20 LIMIT 0,1";
21 $result = mysql_db_query ($dbname, $query, $db);
22 $row = mysql_fetch_assoc($result);
23 $new_date = get_tstamp($row[Article_Date], $row[Article_Time]);
24 ?>
25 <lastBuildDate><?php echo $new_date; ?></lastBuildDate>
OK, lassen wir das Query einfach so stehen wie es ist, ohne es weiter zu erläutern. Sämtliche Variablen für den Datenbankzugriff befinden sich, oh Wunder, in der Datei sql.php.
Zeile 23 ist für uns wieder interessanter, da wir dort unsere Funktion aufrufen und den rückgegebenen Wert in $new_date speichern. In Zeile 25 dann der finale Schritt, wir geben das Datum aus.
Nun kommt wieder ein Datenbank-Query, denn wir wollen ja wieder etwas Inhalt in unseren Feed packen:
26 <?php
27 $query = "SELECT * FROM $scribo_article
28 ORDER BY Article_ID DESC
29 LIMIT 0,20";
30 $result = mysql_db_query ($dbname, $query, $db);
31 while($row = mysql_fetch_assoc($result))
32 {
Reichlich unspektakulär das Ganze. Wir rufen alle Eigenschaften der Tabelle Scribo_Article auf (ist in diesem Fall schneller, als wenn erst die ensprechenden Spalten gesucht werden müssen) sortieren Sie nach der ID absteigend (in dem Wissen, dass der neueste Artikel die höchste ID hat, usw.) und begrenzen das Ganze dann auf die ersten 20. (also die 20 neuesten) Artikel. Die While-Schleife gibt uns dann Artikelweise die benötigten Daten, bis quasi nichts mehr da ist.
Es wird also Zeit nun die einzelnen Tags abzurufen:
33 echo " <item> \n";
34 echo " <title>".$row[Article_Caption]."</title> \n";
35 echo " <author>".$row[Author_Name]."</author> \n";
36 echo " <category>".$row[Article_Topic]."</category> \n";
37 echo " <guid>".$row[Article_ID]."</category> \n";
38
39 $new_date = get_tstamp($row[Article_Date], $row[Article_Time]);
40 echo " <pubDate>".$new_date."</pubDate>\n";
41 echo " <link>/article.php?id=".$row[Article_ID]."</link>\n";

OK, hier ist gerade unheimlich viel passiert, oder? Nein, eigentlich nicht. Wir haben wie in Teil 1 unsere verschiedenen Tags aufgerufen und diese mit Inhalt aus der Datenbank befüllt. Für das Datum haben wir in Zeile 34 wie schon im Header unsere Funktion aufgerufen, die uns das benötigte Zeitformat liefert.
Fehlt jetzt nur noch der eigentliche Text. Und hier scheiden sich die Geister. Einige mögen es, wenn Texte nur als Appetithäpchen serviert werden, für andere sind Feeds die Hauptnahrungsquelle, die bitteschön vollständig zu sein hat. Zur Arbeitsersparniss geben wir an dieser Stelle einfach einen vollständigen Feed aus:
42 $text = '<![CDATA['.$row[Article_Text].']]>';
43 echo " <description>".$text."</description> \n";

Gut, das war jetzt sehr einfach gehalten. Aber prinzipiell könnt ihr hier mit dem Text machen was ihr wollt. Man kann zum Beispiel noch einen Link einbauen, der die Feed Besucher zu den Kommentaren führt, und dergleichen. Wichtig ist nur, dass der Text durch <![CDATA[ umschlossen wird (s. Teil 1)
Zum guten Rest bleibt nur noch das aufräumen schließen der offenen Tags, etc:
44 echo" </item> \n";
45 }
46 ?>
47 </channel> \n
48 </rss>
Und das war es schon. Wie gesagt, Ihr habt nun einen schönen sich selbst aktualisierenden Feed. Eine kleine Sache noch: wenn ihr mit größeren Besucherzahlen zu kämpfen habt, sollte man sich vielleicht überlegen, ob man sich nicht doch auf Grundlage dieses Scriptes, durch PHP eine reine XML Datei generieren lässt. Aber das wäre dann wieder ein anderes Thema.
Und zum Schluss nochmal das komplette Script:
01 <?php
02 include("../functions/sql.php");
03 include("scribo_rss_fct.php");
04
05 echo "<?xml version=\"1.0\" encoding=\"utf-8\" ?> \n";
06 ?>
07 <rss version="2.0"> \n
08
09 <channel> \n
10 <title>Lautsprecher</title> \n
11 <link>http://blog.mwi-projects.de</link> \n
12 <description>Die Welt aus...</description> \n
13 <language>de-DE</language> \n
14 <copyright>MWi</copyright> \n
16 <?php
17 $query = "SELECT Article_Date, Article_Time
18 FROM $scribo_article
19 ORDER BY Article_ID DESC
20 LIMIT 0,1";
21 $result = mysql_db_query ($dbname, $query, $db);
22 $row = mysql_fetch_assoc($result);
23 $new_date = get_tstamp($row[Article_Date], $row[Article_Time]);
24 ?>
25 <lastBuildDate><?php echo $new_date; ?></lastBuildDate>
26 <?php
27 $query = "SELECT * FROM $scribo_article
28 ORDER BY Article_ID DESC
29 LIMIT 0,20";
30 $result = mysql_db_query ($dbname, $query, $db);
31 while($row = mysql_fetch_assoc($result))
32 {
33 echo " <item> \n";
34 echo " <title>".$row[Article_Caption]."</title> \n";
35 echo " <author>".$row[Author_Name]."</author> \n";
36 echo " <category>".$row[Article_Topic]."</category> \n";
37 echo " <guid>".$row[Article_ID]."</category> \n";
38
39 $new_date = get_tstamp($row[Article_Date], $row[Article_Time]);
40 echo " <pubDate>".$new_date."</pubDate>\n";
41 echo " <link>/article.php?id=".$row[Article_ID]."</link>\n";
42 $text = '<![CDATA['.$row[Article_Text].']]>';
43 echo " <description>".$text."</description> \n";
44 echo" </item> \n";
45 }
46 ?>
47 </channel> \n
48 </rss>

dieser Beitrag wurde aus dem Lautsprecher übernommen

Letzte Änderungen

GRUB2: Timer abschalten (starfiii, 31.Okt 09, 13:11)

Leider kein weiterer Artikel zu... (starfiii, 13.Mär 09, 14:01)

Windows 7, Build 7000 (public Beta),... (starfiii, 22.Jan 09, 11:45)

Deadlinks und andere Peinlichkeiten (mwi, 22.Jan 09, 09:53)

Wie werde ich "Webdesigner"? (mwi, 21.Jan 09, 11:17)