Stylemotion.de Forum » apexx » Konzepte & Codeschnipsel
Einen Abschnitt im Design-Template vom Inhalt abhängig machen
Seiten (1): 1  
Autor Beitrag
 
Christian Scheb
Stylemotion.de (Entwickler)
Einen Abschnitt im Design-Template vom Inhalt abhängig machen
Es kommt manchmal vor, dass wir einen Code-Abschnitt im Design-Template vom Inhalt abhänig machen wollen. Ein Beispiel dafür wäre eine Navigation, die nur bei bestimmten Inhalten anstelle der Standard-Navigation eingeblendet werden soll.

Um dieses Tutorial zu verstehen, ist es wichtig, dass man den Abschnitt "Wie eine Seite entsteht" aus der offiziellen Dokumentation gelesen hat.

Es ergeben sich im Wesentlichen 2 Varianten, wie sich soetwas realisieren lässt:

1) Für jede Design-Variante ein sperates Design-Template anlegen
Du hast das Design mit 4 verschiedenen Navigationen, also legst du 4 Design-Templates an. In die design_default.html kommt die Standard-Navigation. Du legst und noch 3 weitere Templates an, wir nennen sie einfach design_navi1.html, design_navi2.html und design_navi3.html. In den Inhalts-Templates muss nun jedesmal, wenn nicht das Standard-Design verwendet werden soll, die Template-Funktion {DESIGN()} aufrufen. So wird ein anderes Design-Template erzwungen. Ein solcher Aufruf sieht in etwa so aus:
Code:
1{DESIGN('navi1')}

Dies erwingt design_navi1.html als Design-Template.

Beispiel:
Wir haben Inhaltsseiten (Modul "Statische Seiten") mit der ID 123 und 456. Bei diesen statischen Seiten möchten wir, dass das Design-Template die Navigation 2 anzeigt. Das Design-Template dazu heißt design_navi2.html. Wir fügen in das Template, das zur Darstellung von statischen Seiten verwendet wird, templates/default/content/content.html folgenden Code ein:
Code:
1{if ID==123 || ID==456}{DESIGN('navi2')}{/if}

Wenn die ID der statischen Seite gleich 123 oder gleich 456 ist, dann wird der Befehl {DESIGN('navi2')} ausgeführt und wir erzwingen dadurch die Verwendung des Design-Templates design_navi2.html.

Vorteil: Man kann pro Inhalt sehr genau festlegen, wann welches Design-Template zum Einsatz kommt.
Nachteil: Man hat in den Inhalts-Templates Code, der gar nicht zum Inhalt gehört sondern eher zum Design.


2) Ein Design-Template, dynamischer Teil wird anhand globaler Variablen entschieden
Es gibt in allen Templates sogenannte globale Variablen, die überall verfügbar sind und Basis-Informationen beinhalten. Es gibt unter Anderem eine Variable, darin steht welches Modul gerade den Inhalt liefert, der in das Design-Template eingebunden wird. Diese Variable heißt APEXX_MODULE. Des Weiteren kann man auf die Parameter zugreifen, die in der URL übermittelt wurden (SERVER_REQUEST_[parameter-name]). Damit lassen sich nun Bedingungen formulieren, wann welche Navigation angezeigt werden soll:

Beispiel:
Das selbe wie oben. Wir fügen aber bei dieser Variante in das Design-Template templates/default/design_default.html diesen Code ein:
Code:
1
2
3
4
5
6
7
{if APEXX_MODULE=='content' && (SERVER_REQUEST_ID==123 || SERVER_REQUEST_ID==456)}
Wenn das Modul mit der ID "content" (also das Modul "Statische Seiten") den Inhalt liefert und die ID des Inhalts gleich 123 oder 456 ist.

{else}
Ansonsten...

{/if}'


Vorteil: Man hat nur ein Design-Template und entscheidet anhand von Regeln über dynamische Teile des Designs. Die Entscheidung fällt genau an dieser einen Stelle. In Gegensatz dazu ist die Entscheidung bei Variante 1 auf viele Inhalts-Templates verteilt, in denen ein DESIGN()-Aufruf erfolgt.
Nachteil: Die Regeln, anhand denen entschieden wird, können sehr kryptisch und kompliziert werden.


3) Eine globale Variable definieren, die dem Design-Template mitteilt welche Navigation angezeigt werden soll
Du überlegst dir einen Namen für eine globale Variable, anhand der im Code entschieden wird, welche Navigation angezeigt wird. In den Inhalts-Templates muss nun jedesmal diese globale Variable mit dem entsprechenden Wert definiert werden.

Beispiel:
Unsere globale Variable soll in diesem Beispiel SHOWNAVI heißen. Als mögliche Werte kommen für diese Variable "navi1" und "navi2" in Frage. Wenn die Variable den Wert "navi2" besitzt, dann wird im Design-Template die Navigation 2 ausgegeben, ansonsten die Navigation 1. Im Design-Template definierst du mit einem IF-Konstrukt diese Fallunterscheidung:

Code:
1
2
3
4
5
{if SHOWNAVI=='navi2'}
Navigation 2 anzeigen
{else}
Navigation 1 anzeigen
{/if}


In den Inhalts-Templates musst du nun die Variable SHOWNAVI definieren und mit dem jeweiligen Wert belegen:

Code:
1{static SHOWNAVI='navi2'}


Vorteil: Man kann pro Inhalt sehr genau festlegen, wann welches Design-Template zum Einsatz kommt. Im Gegensatz zu Variante 1 benötigt man aber nicht mehrere Design-Templates sondern kann alles in einem einzigen Design-Template regeln. Insofern empfiehlt sich diese Variante, wenn die Variationen im Design nur geringfügig sind.
Nachteil: Man hat in den Inhalts-Templates Code, der gar nicht zum Inhalt gehört sondern eher zum Design.
Christian Scheb ist offline  
 
IrealiTY
Kunde (Support beendet)
ah super!
sowas hab ich schonmal gesucht =) Bist der beste scheb.
IrealiTY ist offline  
 
TigerClaw
Kunde (Support beendet)
kann man diese FUnktion auch verwenden für Navigationen wie z.B. auf gamestar.de. Klickt ein Besucher also auf Videos oder auf Artikel, dann wird nicht nur die Artikelseite geladen, sondern auch der Button "Artikel" aus der Navigation hervorgehoben, ist das dafür geeignet? oder kann man da auch nur mit regeln ohne diesen Umweg wie oben beschrieben?
TigerClaw ist offline  
 
Christian Scheb
Stylemotion.de (Entwickler)
Ja, das kann man schon so machen. Normalerweise prüft man dazu APEXX_MODULE=='articles'
Christian Scheb ist offline  
 
Christian Scheb
Stylemotion.de (Entwickler)
Ich habe eine neue Variante hinzugefügt. Variante 3 erklärt, wie man das selbe mit den globalen Variablen erreicht, die ab Version 1.6.4 möglich sind.
Christian Scheb ist offline  
Seiten (1): 1  
 
Suche Optionen
» Erweiterte Suche
Druckansicht Druckansicht