SilverStripe ´s Template Logik
Die Template Engine von SilverStripe baut wie das Framework auf Vererbung. Natürlich gibt es einen engen Zusammenhang zwischen Controller und Templates.
Themes
Mit Theme ist in SilverStripe ein austauschbares Template gemeint. Dieses befindet sich im Verzeichnis /themes/[themename] und hat die Unterverzeichnisse CSS, Images und Templates, wobei letzteres nocheinmal die Unterverzeichnisse Includes und Layout hat. Alle Template-Dateien tragen die Endung *.ss.
Aber damit noch nicht genug, denn es gibt noch mehr Verzeichnisse, in denen sich Dateien befinden, die mit dem Templating zu tun haben. Zum einen ist es möglich, dass ein Modul Templatedateien hat. Diese findet man dann unter /[modulname]/templates und auch hier gibt es wieder die Unterverzeichnisse Includes und Layout. Zum anderen kann es sein, dass ein Theme nochmal Dateien für ein Modul mitbringt, die dann unter /themes/[theme]_[modulname] zu finden sind(zB /themes/blackcandy_blog).
Das ist auf den ersten Blick verwirrend und selbst eingefleischte Programmierer fragen sich, welche der Dateien sie eigentlich bearbeiten müssen, um im Frontend eine Veränderung zu erreichen. Aber wie das in der Informatik so ist: Logik ist das oberste Prinzip, das dem Verstand beim Durchdringen der Materie hilft.
Grundsätzliches
Der wichtigste Seitentyp, von dem alle anderen erben, ist Page. Eine Seite dieses Typs wird jetzt folgendermaßen zusammengesetzt:
- /themes/[themename]/templates/Page.ss ist der Rahmen des HTML-Dokuments, das entstehen soll, sozusagen das Haupttemplate.
- Die Template-Variable $Layout wird durch den Code der Datei /themes/[themename]/templates/Layout/Page.ss ersetzt.
- Das Haupttemplate ist der Ãbersichtlichkeit halber in Includes zerlegt, zB <% include Navigation %>. Hier würde dann der Code der Datei /themes/[themename]/templates/includes/Navigation.ss eingesetzt.
Vererbung im Kleinen
Um nicht für jeden einzelnen Seitentyp Templatedateien anlegen zu müssen, gibt es auch bei den Templates das Prinzip der Vererbung. Ich gehe im Folgenden mal davon aus, dass wir einen Seitentyp ArticlePage erstellt haben, der vom Seitentyp Page abgeleitet ist.
Das Templatesystem sucht jetzt natürlich das Haupttemplate /themes/[themename]/templates/ArticlePage.ss. Ist dieses nicht angelegt, kommt das Haupttemplate der Elternklasse zum Zug, nämlich /themes/[themename]/templates/Page.ss.
Als nächstes wird nach der Datei /themes/[themename]/templates/Layout/ArticlePage.ss gesucht. ist auch diese Datei nicht angelegt, wird wieder von der Elternklasse geerbt.
Includes haben auf dieser Ebene mit Vererbung nichts zu tun.
Vererbung im Großen
Wie eingangs erwähnt, gibt es jetzt aber noch Templatedateien in den Modulen oder modulspezifische Theme-Templatedateien. Die Rangfolge sieht dabei so aus:
- modulspezifische Theme-Templatedateien (zB /themes/blackcandy_blog)
- Modul-Templatedateien (zB /blog/templates)
- Theme-Templatedateien(zB /themes/blackcandy)
Wenn man die Logik dahinter verstanden hat, muss man diese Rangfolge nicht auswendig lernen. Es kann ja sein, dass der Controller eines Moduls eigene Templates benötigt. Deshalb haben Modul-Templatedateien Vorrang vor denen des Themes. Der Ersteller eines Themes kann wiederum auf besondere Anforderungen eines Modul mit eigenen Templatedateien eingehen, weshalb modulspezifische Theme-Templatedateien die oberste Priorität haben.
Templates, aber mit Methode!
Es gibt die Möglichkeit verschiedene Layout-Templates eines Seitentyps zu definieren, die in Abhängigkeit von der Controllermethode, die über die URL gaufgerufen wird, geladen werden.
Nehmen wir mal an, dass der ArticlePage_Controller eine Methode names helloWorld() hat, die über die URL angesprochen werden kann. Wenn jetzt ein Template /themes/[themename]/templates/Layout/ArticlePage_helloWorld.ss definiert wurde, dann wird dieses beim Methodenaufruf via URL geladen.
Und noch mehr Themes
Themes sind grundsätzlich austauschbar. Die SilverStripe Seite bietet eine ständig wachsende Anzahl von Themes, die die Community einspeist. Diese sind recht ansprechend aber leider(oder zum Glück?) nicht bugfrei. Hat man ein neues Theme installiert, muss man es in der _config.php noch aktivieren:
SSViewer::set_theme('[themename]');
Wie hilft mir die IDE?
Die NetBeans können von Haus aus mit Dateien, die die Endung *.ss tragen, nichts anfangen. Eine Syntax-Highlighting des HTML-Codes lässt sich aber einfach erreichen. Unter Einstellungen->Miscellaneous->Files auf New... klicken und .ss eingeben. Dann diesen neuen Dateityp mit HTML assoziieren.