Um Modul- bzw. Templatevarianten zu verstehen, gehen wir von folgendem Szenario aus: Das Modul XY soll auf 3 Seiten verwendet werden. Auf den Seiten 1 und 2 soll die Standarddarstellung verwendet werden; für die Seite 3 sind aber optische Anpassungen nötig.
In Website Baker und LEPTON sind nun Umwege nötig: Z.B. kann man für die explizite Seite eine eigene CSS-Datei erstellen und diese mit Hilfe einer entsprechenden Anweisung im Template gezielt nur für diese Seite einbinden. Das funktioniert zwar, aber mit mehreren Einschränkungen:
templates
-Verzeichnis geändert werden. Das gilt dann aber für alle Instanzen des Moduls. Außerdem werden diese Anpassungen bei einem Update des Moduls überschrieben.BlackCat CMS verfügt daher über die Möglichkeit, Varianten zur Verfügung zu stellen. Das gilt für Module ebenso wie für Templates. Das Grundprinzip hierbei ist folgendes:
Ein Standard-BlackCat-Template hat normalerweise ungefähr folgende Ordnerstruktur:
./templates /<templatename> /index.php /info.php /css /default /frontend.css /backend.css /... /templates /default /index.tpl /...
Das Verzeichnis default
beinhaltet die Standarddarstellung, die immer dann gilt, wenn nichts anderes eingestellt wurde.
Um nun eine Variante zu erstellen, legt man parallel zum Verzeichnis default
ein weiteres Verzeichnis an, in dem man alle Templates bzw. CSS-Dateien ablegt, die abweichend von der Standarddarstellung gestaltet werden sollen.
./templates /<templatename> /index.php /info.php /css /default /frontend.css /backend.css /... /myvariant /frontend.css /backend.css /... /templates /default /index.tpl /... /myvariant /index.tpl
Die Besonderheit: Fehlt im Verzeichnis myvariant
ein Template, wird dieses automatisch aus dem Verzeichnis default
genommen. Man muss also wirklich nur diejenigen Dateien kopieren, die auch wirklich angepaßt werden sollen!
Die index.php
sieht für Template prinzipiell immer gleich aus. (Im folgenden Beispiel wurde wegen der besseren Lesbarkeit der Kopfteil mit Copyright und class.secure.php
weggelassen.)
// vom Admin ausgewählte Variante auslesen $variant = CAT_Helper_Page::getPageSettings($page_id,'internal','template_variant'); // falls keine gewählt wurde, Fallback auf 'default' if(!$variant) $variant = ( defined('DEFAULT_TEMPLATE_VARIANT') && DEFAULT_TEMPLATE_VARIANT != '' ) ? DEFAULT_TEMPLATE_VARIANT : 'default'; // dem Template Parser die Variante als Hauptpfad übergeben $parser->setPath(CAT_TEMPLATE_DIR.'/templates/'.$variant); // für dort nicht vorhandene Templates 'default' als Fallback setzen $parser->setFallbackPath(CAT_TEMPLATE_DIR.'/templates/default'); // das Template ausgeben $parser->output('index.tpl',array());
(Anmerkung: Zur Sicherheit könnte man noch eine Prüfung einbauen, ob das Varianten-Verzeichnis existiert.)
BlackCat CMS bietet die Varianten im Backend automatisch in Form einer Selectbox an, wenn diese in der info.php
konfiguriert sind. Beispiel:
$template_variants = array( 'default', 'myvariant' );
Anmerkung: Natürlich könnte auch einfach eine Liste der Unterverzeichnisse unterhalb von templates
angeboten werden, das könnte aber zu 'false-positives' führen, wenn man z.B. eine Sicherungskopie eines Templates erstellt hat, die eigentlich nicht für die Nutzung bestimmt ist. Daher werden nur die Varianten angeboten, die als solche konfiguriert sind.
BlackCat CMS verfügt über eine einfache Namenskonvention, die das automatische Laden der 'richtigen' CSS-Datei ermöglicht. Der einfachste Weg ist, die zur Variante gehörende CSS-Datei im Verzeichnis ./templates/<Templatename>/css/<Variante>
abzulegen und template.css
zu nennen.
Sollte eine komplexere Logik notwendig sein, kann dies über die Datei headers.inc.php
implementiert werden.
Hinweis: Wird für eine Variante kein angepaßtes CSS benötigt, muss auch nicht das entsprechende Verzeichnis angelegt werden.
Oben beschriebenes Vorgehen funktioniert grundsätzlich auch für Module. Die Variable in der info.php
heißt in diesem Fall $module_variants
:
$module_variants = array( 'default' );
Die vorhandenen Varianten in der info.php
als Liste anzugeben, wird für die meisten Fälle ausreichend sein. Will man es dem Benutzer aber erleichtern, eigene Varianten anzulegen, ohne daß er hinterher die info.php
anpassen muß (die ja zudem bei einem Update überschrieben wird), kann man statt des „hartcodierten“ Arrays folgenden Code benutzen:
$module_variants = CAT_Helper_Directory::getInstance() ->getDirectories( CAT_PATH.'/modules/'.$module_directory.'/templates', CAT_PATH.'/modules/'.$module_directory.'/templates/' );
Achtung, der Slash am Ende des zweiten Parameters ist wichtig!