Inhaltsverzeichnis

Modul-/Templatevarianten

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:

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:

Templates mit Varianten

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!

index.php für Templates mit Varianten

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.)

Die Variante zur Auswahl stellen

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.

Angepaßtes CSS laden

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.

Module mit Varianten

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' );

Kleiner Trick für dynamische Ermittlung der Varianten

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!