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

Seitenbaum des SilverStripe ThemesMit „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:

  1. modulspezifische Theme-Templatedateien (zB /themes/blackcandy_blog)
  2. Modul-Templatedateien (zB /blog/templates)
  3. 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?

Seitentyp in NetBeans einstellenDie 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.

Tags: