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"].'&amp;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)

  1. michael
    michael 05.08.2012
    hallo

    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
  2. Eugen Helmut
    Eugen Helmut 05.08.2012
    Echt cooler Beitrag. Danke!
    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

Neuen Kommentar schreiben