Vor einigen Wochen habe ich das Forum unseres Studienkurses auf phpBB 3.0.2 aktualisiert. Bedenkt man, dass eine sehr alte 2er-Version installiert war, so war dies doch eine gehörige Umstellung. Aber es hat funktioniert! Heute habe ich nun versucht, eine Erweiterung für RSS-Feeds zu installieren, damit man nicht immer schauen muss, ob sich etwas im Forum getan hat.
Eine erste Anfrage im IRC-Channel #phpbb auf Freenode erzählte man mir von der Mod RSS Feed 2.0, die dies bewerkstelligen sollte. Von der Vorgängerversion der Forensoftware kannte ich den Mod-Installer EasyMOD, der automatisch Erweiterungen installierte. Auf die Frage nach einer Version für phpBB 3 erhielt ich zwar die Antwort, dass sich die Software in Entwicklung befände, aber einen Releasetermin konnte man mir nicht geben.
Manuelle Installation
Daher blieb mir nichts anderes übrig, als der beigefügten Installationsanleitung Install_RSSFeed20_v103.xml zu folgen. Dort stand recht detailliert beschrieben, was ich nacheinander tun sollte. Das hat auch alles recht gut funktioniert. Ich lud also die veränderten Dateien hoch und folgte den Anweisungen aus der Rubrik Do it yourself. Diese erklären, wie die Mod aktiviert wird. Nur, was dann? Ich konnte keine RSS-Feeds erzeugen, alles was im Quelltext der ausgelieferten Forenseiten stand, war der HTML-Kommentar zur Mod
<!-- // MOD : MSSTI RSS Feeds (V1.0.4) - Start--><!-- // MOD : MSSTI RSS Feeds (V1.0.4) - End -->
Aktivierung nötig!
Also war sie, trotz Befolgen der Anleitung wohl doch nicht aktiviert. Nach einigem Suchen entdeckte ich unter SYSTEM => Allgemeine Funktionen den neuen Unterpunkt ACP_RSS_FEEDS. Ein Klick darauf brachte mich gleich einmal die erste Fehlermeldung:
Language file rss.php couldn't be opened.
Was war passiert? Richtig! Im Ordner mods meines verwendeten Sprachpakets du_x_sie fehlte die Übersetzung der Datei rss.php. Als Notlösung kopierte ich die Version aus dem englischen Sprachenset (/language/en) in den deutschen Ordner. Juhu! Nun hatte ich die Möglichkeit, die Mod und die einzelnen Feeds zu aktivieren und weitere Einstellungen vorzunehmen. Das tat ich doch gleich und drückte auf Speichern. Das Ergebnis war die nächste Fehlermeldung:
General Error
SQL ERROR [ mysql4 ]
Duplicate entry 'rss_enable' for key 1 [1062]
SQL
INSERT INTO phpbbb_config (config_name, config_value, is_dynamic) VALUES ('rss_enable', 1, 0)
Da wusste wohl die rechte Hand der Entwickler nicht, was die linke tat. Die SQL-Anweisungen aus der erwähnten Installationsanleitung hätte ich mir sparen können, da ich sie nun wieder löschen musste. Der Thread im Support-Forum erwähnt dies zwar mehrmals, aber bisher konnte sich noch keiner dazu erweichen, die Datei abzuändern. Daher: Keine SQL-Kommandos zur Installation nötig.
Thunderbird mag trotzdem nicht
Nun war also auch dieses Problem gelöst. Nachdem ich sämtliche Caches gelöscht hatte (Punkt Den Cache leeren direkt in der Administrationsoberfläche von phpBB), sah ich tatsächlich das RSS-Icon in der Adressliste des Firefox. Ich konnte es auch anklicken und bekam ein dynamisches Lesezeichen angezeigt, nur die Übernahme in den Thunderbird gestaltete sich etwas schwieriger. Dieser erkannte nur einen Beitrag und hing sich anschließend, beim Versuch, den Feed zu öffnen, sogar fast auf. Ein erneuter Blick ins Support-Forum, sowie ein paar Experimente mit dem als XML-Datei heruntergeladenen Feed, ergaben einen Verdacht: Am Anfang des dynamischen Lesezeichens sah man eine Statistik zum Forum, an dessen Ende Links auf ältere Seiten mit Feedeinträgen. Sobald ich diese beiden Datensätze aus der XML-Datei entfernte und diese vom Webserver aus in den Thunderbird importierte, funktionierte der Import. Ziel war es also nun, die Statistiktabelle und die Fortsetzungslink irgendwie loszuwerden. Im Forum findet sich der Hinweis, wie man aus der Datei rss_template.xml das Erzeugen der Box entfernt. Ich trieb es noch einen Schritt weiter und entfernte auch die Links. Damit sieht meine Datei folgendermaßen aus:
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:admin="http://webns.net/mvcb/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<channel>
<title>{FEED_TITLE} - {FEED_MODE}</title>
<!--<atom:link href="{FEED_INDEX}" rel="self" type="application/rss+xml" />-->
<description>{FEED_DESCRIPTION}</description>
<link>{FEED_INDEX}</link>
<language>{FEED_LANG}</language>
<pubDate>{FEED_DATE}</pubDate>
<lastBuildDate>{FEED_TIME}</lastBuildDate>
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
<generator>MSSTI v0.0.1 - (C) 2008 leviatan21 - http://www.mssti.com/</generator>
<copyright>Copyright : (c) {FEED_TITLE} - {FEED_DATE}</copyright>
<dc:creator>{FEED_MANAGING}</dc:creator>
<image>
<title>{FEED_TITLE} - {FEED_MODE}</title>
<url>{FEED_IMAGE}</url>
<link>{FEED_INDEX}</link>
</image>
<ttl>60</ttl>
<!-- IF S_ERROR -->
<item>
<title>{S_ERROR}</title>
</item>
<!-- ELSE -->
<!-- BEGIN items -->
<item>
<title>{items.TITLE}</title>
<link>{items.LINK}</link>
<!-- IF FEED_TEXT or items.STATISTICS -->
<description><![CDATA[<!-- IF FEED_TEXT -->{items.DESCRIPTION}<!-- ENDIF --><!-- IF items.STATISTICS--><p>{items.STATISTICS}</p><!-- ENDIF --><hr />]]></description>
<!-- IF FEED_TEXT -->
<content:encoded><![CDATA[{items.DESCRIPTION}]]></content:encoded>
<!-- ENDIF -->
<!-- ENDIF -->
<category domain="{items.CATEGORY}"><![CDATA[{items.CATEGORY_NAME}]]></category>
<dc:creator><![CDATA[{items.CREATOR}]]></dc:creator>
<dc:date>{items.PUBDATE}</dc:date>
<guid isPermaLink="false">{items.GUID}</guid>
</item>
<!-- END items -->
<!-- ENDIF -->
</channel>
</rss>
Da war doch noch was: das Login-Problem
Theoretisch sollte jetzt alles passen - theoretisch! Was ich natürlich vergessen hatte, war die Tatsache, dass das Forum seine Inhalte nur nach der Anmeldung preisgibt. Mit diesem Hack kann man zwar auch dieses Problem lösen, aber nicht ganz zufriedenstellend: Man musste von nun an jede Feed-URL von Hand &uid=__DIE_EIGENE_USER-ID_ anhängen. Irgendwie müsste sich das doch noch vereinfachen lassen. Wenn man doch nur den Linkteil mit der uid irgendwie automatisch erzeugen könnte. Erster Ansatz war overall_header.htm, die bereits während der Installation der Mod bearbeitet worden war:
<!-- // MOD : MSSTI RSS Feeds (V1.0.4) - Start--><!-- IF S_ENABLE_FEEDS --><link rel="alternate" type="application/rss+xml" title="{L_RSS_FEEDS} - {SITENAME}" href="{U_RSS}&uid={S_USER_ID}" /><!-- IF S_ENABLE_FEEDS_FORUMS --><link rel="alternate" type="application/rss+xml" title="{L_RSS_FEEDS} - {L_ALL_FORUMS}" href="{U_RSS}?mode=forums&uid={S_USER_ID}" /><!-- ENDIF --><!-- IF S_ENABLE_FEEDS_THREADS --><link rel="alternate" type="application/rss+xml" title="{L_RSS_FEEDS} - {L_ALL_TOPICS}" href="{U_RSS}?mode=topics&uid={S_USER_ID}" /><!-- ENDIF --><!-- IF S_ENABLE_FEEDS_POSTS --><link rel="alternate" type="application/rss+xml" title="{L_RSS_FEEDS} - {L_ALL_POSTS}" href="{U_RSS}?mode=posts&uid={S_USER_ID}" /><!-- ENDIF --><!-- IF S_ENABLE_FEEDS_EGOSEARCH && S_USER_LOGGED_IN --><link rel="alternate" type="application/rss+xml" title="{L_RSS_FEEDS} - {L_YOUR_POSTS}" href="{U_RSS}?mode=egosearch&uid={S_USER_ID}" /><!-- ENDIF --><!-- IF S_ENABLE_FEEDS_FORUM && S_FORUM_ID --><link rel="alternate" type="application/rss+xml" title="{L_RSS_FEEDS} - {L_FORUM} {FORUM_NAME}" href="{U_RSS}?f={S_FORUM_ID}&uid={S_USER_ID}" /><!-- ENDIF --><!-- IF S_ENABLE_FEEDS_THREAD && S_TOPIC_ID --><link rel="alternate" type="application/rss+xml" title="{L_RSS_FEEDS} - {L_TOPIC} {TOPIC_TITLE}" href="{U_RSS}?f={S_FORUM_ID}&t={S_TOPIC_ID}&uid={S_USER_ID}" /><!-- ENDIF --><!-- ENDIF --><!-- // MOD : MSSTI RSS Feeds (V1.0.4) - End --></div>
Dies war eine gute Idee, nur leider nicht gut genug. Die Variable {S_USER_ID}, die ich hier an jede URL angehängt habe, existiert dummerweise nicht - noch nicht. Eine weitere Nachfrage im IRC-Channel brachte mich dazu, die Variable einfach zu definieren und zwar in der Datei functions.php. Auch sie wurde bereits während der ursprünglichen Installation bearbeitet und wird nun einfach um die mittlere der folgenden Zeilen ergänzt:
$template->
assign_vars(array( 'S_USER_ID' =>
$user->
data['user_id'],
'SITENAME' =>
$config['sitename'],
Weg mit den User-IDs
Das Ergebnis konnte sich sehen lassen: personalisierte RSS-Links und zwar ohne, dass diese erst mühsam zusammen gebastelt werden mussten. Allerdings noch immer mit einem Haken: Thunderbird zeigte mir statt der Urheber im Absenderfeld lediglich deren User-ID an, während es im Firefox funktionierte. Es musste also irgendwie mit dem automatischen Login über die User-ID zusammenhängen. Nach einigem Rumprobieren fand ich auch hierfür eine Lösung:
Ich ersetzte in der mitgelieferten rss.php an der Stelle
case 'posts':
$row_title = 'post_subject';
$row_creator= 'poster_id';
den Wert poster_id durch username und schon funktionierte es auch im Thunderbird mit den Benutzernamen. Diese Lösung ist zwar sehr unsauber, aber das gilt ja auch schon für den Autologin über den Parameter uid ;):
Fazit
Nach einigem Aufwand habe ich nun tatsächlich RSS-Feeds von unserem Forum im Feedreader. Für alle, denen das Nachmachen der einzelnen Schritte zu mühsam ist, hier eine Sammlung aller modifizierter Dateien (bitte nur über Installationen kopieren, in denen nicht schon andere Mods installiert wurden).
Update
Mittlerweile ist es mir auch gelungen, die restlichen Feeds verfügbar zu machen. Alles, was man dafür braucht, ist meine überarbeitete Version der Datei rss.php.