Bereitstellung von XML-Dokumenten mit Hilfe von TypoScript: Valides XML mit TypoScript erzeugen
XML steht für „Extensible Markup Language“ und wurde 1996 vom World Wide Web Consortium (W3C) auf Basis von SGML ins Leben gerufen. Die aktuelle Version 1.0 (Fourth Edition) wurde am 29. September 2006 veröffentlicht. XML spielt bei Web-Anwendungen vor allem beim Austausch von Daten zwischen mehreren Applikationen eine immer größere Rolle. So kann es beispielsweise dafür genutzt werden, eine Flash-Animation mit Inhalten zu versorgen oder Daten aus einer Datenbank für die externe Weiterverarbeitung zur Verfügung zu stellen.
Grundregeln
Die Regeln, nach denen ein XML-Dokument aufgebaut sein muss, wurden durch das W3C genau definiert [1]. Bei der Ausgabe sollten Entwickler auf folgendes achten:
- Deklarierung der XML-Version am Anfang
- genau ein Wurzelelement
- alle Elemente besitzen ein jeweils gleichnamiges Start- und Endtag (z. B. <magazin>T3N</magazin>)
- Attribute dürfen nur im Starttag vorkommen
Sofern man gegen eine der Regeln verstößt, kann das komplette Dokument nicht verarbeitet werden und der Vorgang wird abgebrochen. XML-Dokumente, die alle Regeln erfüllen, werden als „wohlgeformt“ bezeichnet.
Konfiguration
Um valides XML auszugeben, bedarf es keiner Extension, da TYPO3 nach wenigen Zeilen TypoScript von Haus aus dazu in der Lage ist. Zuerst sollte man ein neues PAGE-Objekt erstellen, bei dem der automatisch generierte Header ausgeblendet sowie ein eigener Dokumententyp und Zeichensatz für die Ausgabe definiert wird. Mit weiteren kleinen Konfigurationen wird das Template für die Ausgabe von XML konfiguriert. Über die Eigenschaft „typeNum“, die man später als GET-Parameter an die URL hängt, kann das PAGE-Objekt leicht direkt angesprochen werden.
xml = PAGE xml { typeNum = 123 config { # Standard-Header deaktivieren disableAllHeaderCode = 1 # keine Tags in XHTML umwandeln xhtml_cleaning = none admPanel = 0 metaCharset = utf-8 # Inhalt und Zeichensatz definieren additionalHeaders = Content-Type:text/xml;charset=utf-8 } 10 = COA 10 { wrap = <?xml version="1.0" encoding="UTF-8" standalone="yes" ?><navi>|</navi> # Platzhalter für XML-Ausgabe } }
Listing 1
Das COA-Objekt dient als Container für den eigentlichen XML-Code. Das Template lässt sich bereits jetzt über „http://domain.com/index.php?type=123“ im Browser aufrufen, jedoch bleibt das Fenster noch bis auf das Root-Element leer, da Inhalt fehlt.
Ein Beispiel
Um dem XML-Dokument Leben einzuhauchen, wird exemplarisch ein Menü mit Hilfe von TypoScript aus einem bestehenden Seitenbaum generiert und als Inhalt in das Dokument eingefügt. Man sollte dabei darauf achten, dass HTML-Tags nicht unformatiert ausgeben werden, da sie ansonsten als XML-Elemente verstanden werden. Falls man HTML-Code in das XML einbetten muss, kann dieser mit CDATA [2] geschützt werden. Dazu wird der Code mit „<![CDATA[“ und „]]>“ umschlossen. Dadurch weiß der XML-Parser, dass er diesen Abschnitt ignorieren soll.
Für die Ausgabe der Navigation reicht ein ganz normales TMENU. Man muss lediglich den Wrap jedes einzelnen Menüpunkts optimieren, um die URL von dem Titel zu trennen und in zwei unterschiedlichen Elementen unterzubringen. Das folgende TypoScript nimmt die Stelle des Platzhalters aus Listing 1 ein.
10 = HMENU 10 { special = directory special.value = 1 1 = TMENU 1 { NO { doNotLinkIt = 1 stdWrap.cObject = COA stdWrap.cObject { wrap = <item>|</item> 5 = TEXT 5.wrap = <link>|</link> 5.typolink.parameter.data = field:uid 5.typolink.returnLast = url 10 = TEXT 10.wrap = <title><![CDATA[|]]></title> 10.data = field:title } } } }
Listing 2
Sicherheitshalber sollte man bei der Ausgabe des Titels auf CDATA zurückgreifen, um mögliche Probleme zu vermeiden.
Im Moment lässt sich durch den Aufbau der URL (z. B. http://domain.com/index.php?type=123) nicht auf ein XML-Dokument schließen. TYPO3 generiert die XML-Ausgabe bei jedem Aufruf dynamisch und kann jedoch mit der entsprechenden Konfiguration nach außen hin als Pfad zu einer XML-Datei dargestellt werden.
So bietet die TYPO3-Extension „RealURL“ [3] die Möglichkeit Dateiendungen in URLs zu interpretieren und zum Beispiel alle Anfragen an http://domain.com/test.xml mit dem TYPO3-Seitentyp 123 zu generieren. Aber auch Weiterleitungen (sogenannte „Redirects“) können gezielt eingerichtet werden, um bestimmte, gut lesbare Pfade und Dateinamen zu verwenden und diese nach außen zu kommunizieren. Dies macht insbesondere dann Sinn, wenn man die gleichen Inhalte einer TYPO3-Seite in mehreren Formaten anbieten möchte. Zum Beispiel wäre es so möglich, die Einzelansicht einer News-Meldung sowohl in Standard-HTML (http://domain.com/news/22.htm) als auch in einem strukturierten XML-Format zur Weiterverarbeitung (http://domain.com/news/22.xml) anzubieten.
Fazit
Wie bereits erwähnt, benötigt man keine Extension, um XML mit TYPO3 dynamisch zu generieren. Dies lässt sich einfach durch TypoScript und einen zusätzlichen Seitentyp realisieren. Beim Erstellen der XML-Datei kann auf die gesamte Funktionsreferenz zurückgegriffen und können somit nahezu alle Daten aus TYPO3 als Inhalte verwendet werden.
Der Artikel bietet zwar nur einen kleinen Einblick in die Thematik, kann aber gut als Basis für weitere Experimente dienen. Grundsätzlich kann jedes Content-Element durch TypoScript in generiertes XML eingebettet werden. Eine große Hilfe dabei dürften die CONTENT- und RECORDS-Objekte sein, die in der TypoScript-Referenz TSRef [4] ausführlich dokumentiert sind.