De:Projektdatei austauschen
From phpCMS
Frage: Wie kann ich durch Austausch der Projektdatei das Layout wechseln?
Antwort: von Samson (08.02.2006)
Contents |
[edit] Einführung
Wenn man dem Besucher die Auswahl eines anderen Layouts anbieten möchte, steht man vor der Frage wie man das mit phpCMS umsetzen kann. Eine Möglichkeit, die man schnell in Erwägung zieht, ist die Übergabe eines alternativen Templates per URI:
index.htm?template=/template/alternativ.tpl
Damit der Besucher im Genuß der Layoutalternative bleibt, müßte der Parameter aber an alle Links der Seite angehangen werden. Schnell wird einem klar, das diese Variante inakzeptabel ist.
Die zweite Möglichkeit ist die Layoutänderung per CSS-Datei. Dazu muß man sich aber wieder ein Plugin basteln, das den CSS-Link im Template austauscht und entsprechend die Cookies setzt.
Beide Varianten wurden im phpCMS-Forum schon ausführlich diskutiert. Doch es gibt noch eine dritte Möglichkeit - das Austauschen der Projektdatei ! Doch diese Möglichkeit scheitert an der fehlenden Unterstützung durch phpCMS. Da bringt es auch nichts, wenn man in der Konfigurationsdatei die globale Projektdatei ändert.
Ich möchte jetzt eine Lösung präsentieren, die den Austausch trotzdem ermöglicht. Dazu ist ein kleiner Patch von phpCMS und der Bau eines kleinen Plugins erforderlich.
[edit] class.parser_page_phpcms.php
In der Funktion CheckProject ab Zeile 55, muß man nach dem Code
if (isset($this->content->PROJECT)) {
$temp = trim($this->content->PROJECT[0]);
} else {
$temp = false;
}
folgende Zeilen einfügen
if($DEFAULTS->INI_SWITCH == 'on') {
if($DEFAULTS->INI_FILES[$_COOKIE["phpcmsinifile"]]) {
$temp = $DEFAULTS->INI_FILES[$_COOKIE["phpcmsinifile"]];
}
}
[edit] default.php
Hier müssen zusätzliche Konfigurationswerte eingefügt werden:
$this->INI_SWITCH = 'on';
$this->INI_FILES = array("Standard 3clm"=>"/template/home.ini",
"Demo4you"=>"/template/demo_4you_home.ini");
Im Array INI_FILES werden die Bezeichnungen der Layouts und die Pfade zur entsprechenden Projektdatei abgelegt.
[edit] iniswitch.php
Das ist ein Plugin, das die Links zum Umstellen des Layouts anzeigt. Das Plugin setzt außerdem das Cookie und lädt die Seite anschließend neu:
<?php
if($_GET["layout"]) {
// Neues Layout einstellen, Cookie für 1 Jahr setzen und Seite neu laden
setcookie ("phpcmsinifile",$_GET["layout"],time()+31536000,"/");
Header("Location:".$CHECK_PAGE->path."/".$CHECK_PAGE->name);
}
// Navigation generieren
$count = 0;
while(list($key,$value) = each($DEFAULTS->INI_FILES)) {
$count++;
$Ausgabe .= '<a href="?layout='.$key.'" title="'.$key.'">'.$count.'</a> ';
}
$current = count($Tags);
$Tags[$current][0] = '<!-- PLUGIN:INISWITCH -->';
$Tags[$current][1] = 'INI-Switcher: '.$Ausgabe;
?>
[edit] Templatedatei
In der Templatedatei jedes Layouts muß dieses Plugin natürlich auch noch eingebunden werden, z.B. mit
{PLUGIN FILE="$plugindir/iniswitch.php" TYPE="DYNAMIC"}
Dort, wo die Links zur Layout-Umstellung erscheinen sollen, schreibt man
<!-- PLUGIN:INISWITCH -->
[edit] Funktionsweise
Der Parser kommt als erstes zum Zug. Er ersetzt die in der Contentdatei angegebene Projektdatei durch eine neue - vorausgesetzt INI_SWITCH ist on und das Cookie gesetzt. Wird die Projektdatei nicht gefunden, wird die globale Projektdatei benutzt.
Das Plugin liest das Array mit den INI-Dateien aus der Konfigurationsdatei und zeigt die Links zum Austauschen des Layouts an. Klickt der Besucher auf einen Link, setzt das Plugin das Cookie und lädt die Seite neu.
[edit] Vor- und Nachteile
Der Projektdatei-Austausch eignet sich nur für Websites, wo alle Contentdateien dieselbe Projektdatei benutzen. Benötigt Deine Website mehrere Projektdateien für ein und dasselbe Layout, ist ein CSS-Dateiaustausch die einfachere Variante.
[edit] Ausbau und Erweiterungsmöglichkeiten
Bei der Linkgenerierung könnte man ganz auf ein Plugin verzichten, wenn die Links zum Switchen bereits vom Parser generiert werden. Sollte der Patch einmal festeingebaut werden, ist solch eine Lösung denkbar.
Main Page: Tutorials MainPage | Top Page: De:MiniHowTos
This page in other languages: English

