TYPO3: in eigener Extension einen RSS-Feed anbieten
Im Internet finden sich zahlreiche Anleitungen, wie man aus tt_news heraus einen RSS-Feed anbietet. Aber wie sieht es aus, wenn man einen Feed für eine andere Extension (zum Beispiel eine selbstentwickelte) einbinden möchte?
Die folgenden Codeschnipsel sollten Ihnen bei diesem Problem helfen. Es gibt wahrscheinlich schönere Lösungen, aber mit der folgenden Methode funktioniert es auf jeden Fall und ist relativ einfach zu verstehen. (Noch ein Hinweis am Rande: Ich habe es mit der Extension „Ecodev: feeds services (RSS / ATOM)“ [ecorss] probiert aber sie hat die gesamte TYPO3-Seite gecrasht...)
Ich nutze dabei die Möglichkeit, in TypoScript eigene Userfunktionen (userFunc) zu nutzen. Damit ist es möglich, die gesamte Logik (das Erstellen des RSS Feeds) auszulagern.
PHP
Legen Sie eine PHP Datei mit dem folgenden Inhalt an. Sie kann (nach meinem Wissen) an einem beliebigen Ort innerhalb des TYPO3-Auftritts liegen. Am meisten Sinn macht es aber wohl im Extensionverzeichnis oder unter fileadmin.
< ?php
/**
* this class creates our RSS-Feed
*
* @author Paul Rohrbeck (rohrbeck@stimme.net)
*/
class user_createRSS {
var $cObj;// The backReference to the mother cObj object set at call time
/**
* main function, does everything you need... ;-)
*
* @param $content content...
* @param $conf "variables"
*/
function main($content, $conf) {
// some basic stuff:
$ts = time();
$base_url = $GLOBALS['TSFE']->tmpl->setup['config.']['baseURL'];
// get started...
$content .= '< ?xml version="1.0" encoding="utf-8"?>' . "\n";
$content .= '<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">' . "\n";
$content .= '<channel>' . "\n";
// some basic information
$content .= '<atom:link href="'.$base_url.'" rel="self" type="application/rss+xml" />' . "\n"; // unschön, müsste eigentlich auf sich selber verlinken
$content .= '<title>'.$conf["title"].'</title>' . "\n";
$content .= '<link>'.$base_url.'</link>' . "\n";
$content .= '<description>'.$conf["description"].'</description>' . "\n";
$content .= '<copyright>'.$conf["copyright"].'</copyright>' . "\n";
$content .= '<language>'.$conf["language"].'</language>' . "\n";
$content .= '<image>';
$content .= '<title>'.$conf["title"].'</title>' . "\n";
$content .= '<url>'. $base_url . $conf["image_url"].'</url>' . "\n";
$content .= '<link>' .$base_url. '</link>' . "\n";
$content .= '<width>'.$conf["image_width"].'</width>' . "\n";
$content .= '<height>'.$conf["image_height"].'</height>' . "\n";
$content .= '<description>'.$conf["image_description"].'</description>' . "\n";
$content .= '</image>' . "\n";
$content .= '<docs>http://blogs.law.harvard.edu/tech/rss</docs>' . "\n";
// connect to database: change whatever settings you wish
$select_fields = '*';
$from_table = 'tx_prsmallads_smallads'; // table of your extension
$where = "deleted = 0 AND hidden = 0 AND endtime > $ts";
$group = '';
$order = '';
$limit = '20';
$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($select_fields, $from_table, $where, $group, $order, $limit);
// now put in all the items:
while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)){
$pubDate = date('D, d M Y H:i:s O', $row["tstamp"]); // timestamp in the correct format for the rss feed
$link_to_detailpage = $base_url . 'index.php?id='.$conf["singlePid"].'&sid='.$row["uid"]; // link to the page with the detail view
$description = substr($row["content"], 0, $conf["maxChars"]) . ' [...]';
$content .= '<item>' . "\n";
$content .= '<title>'.$row["cat"].': '.$row["title"].'</title>' . "\n";
$content .= '<link>'.$link_to_detailpage.'</link>' . "\n";
$content .= '<description>'.$description.'</description>' . "\n";
$content .= '<guid>'.$link_to_detailpage.'</guid>' . "\n";
$content .= '<pubdate>'.$pubDate.'</pubdate>' . "\n";
$content .= '</item>';
}
$content .= '</channel>';
$content .= '</rss>';
return $content;
}
}
?>
Ein paar weitere Informationen, wie ein RSS-Feed aufgebaut sein muss, gibt es hier. Es gibt viele weitere Felder, die ich hier aufgrund der Einfachheit weggelassen habe...
TypoScript
Folgende TypoScript-Angaben müssen Sie in das Setup-Template ihrer Website übernehmen:
# create rss feed:
includeLibs.createRSS = path/to/your/file/create_rss.php
temp.rssfeed = USER
temp.rssfeed {
userFunc = user_createRSS->main
title = Titel des Feeds
description = Abonnieren Sie den RSS Feed.
copyright = Peter Pan
language = de
# icon angaben
image_width = 100
image_height = 100
image_description = hochschulen³ Logo
image_url = path/to/your/logo/logo.png
# single ansicht
singlePid = 237
# wie lang so der text sein
maxChars = 200
}
# rss feed erstellen
rss200 = PAGE
rss200 {
typeNum = 200
config {
# keine header daten aus TYPO3
disableAllHeaderCode = 1
# type und charset anpassen
additionalHeaders = Content-type:text/xml;charset=utf-8
# nicht zwingend nötig...
linkVars = L,debug
no_cache = 1
xhtml_cleaning = 0
admPanel = 0
}
# template einbinden
10 < temp.rssfeed
}
Der Feed ist nun über den type 200 (zum Beispiel: deine-url.de) zu erreichen. Natürlich können Sie diese Zahl beliebig ändern. Um in Ihrem HTML-Template eine entsprechende Referenz einzufügen, können Sie den folgenden TypoScript-Code benutzen:
page = PAGE
page {
headerData.147 = TEXT
headerData.147.value = <link rel="alternate" type="application/rss+xml" title="Titel des Feeds" href="http://deine-url.de/?type=200" />
}
Empfehlen Sie diesen Artikel weiter!

Kommentare (2)
ist zwar schon etwas länger her dein eintrag, aber trotzdem besten dank für die schöne anleitung. leider bekomm ich da nur einen xml-verarbeitungsfehler (kein element gefunden)… weiss aber nicht wo suchen.
kannst du mir allenfalls weiterhelfen?
gruss michael
Ich hab es für meinen Falls ein wenig anders gelöst.
In einer bestehenden Extension habe ich die RSS Feeds dynamisch ausgegeben und in TS verknüpft:
10 < plugin.tx_myextension_pi2
So hat man den Vorteil, den RSS Feed in einem Template bereit zu stellen und mit Markern und Rows zu arbeiten.
Schöne Grüße
Eugen