Styleswitcher

Da hat man nun drei verschiedene Layouts für seine Webseite gebastelt, hat in alle drei viel Zeit & Mühe gesteckt, und dann kann man sich partout nicht entscheiden: welches soll denn nun verwendet werden?
Dank PHP müssen nun keine Entwürfe in die Mülltonne fliegen – man verwendet einfach einen sogenannten Styleswitcher, sodass der Besucher selbst entscheiden kann, mit welchem der verschiedenen zur Verfügung gestellten Layouts er die Seite denn nun betrachten möchte.

Übrigens kann so ein Styleswitcher nicht nur ein nettes Feature sein, um verschiedene Layouts präsentieren zu können, sondern er kann auch ganz konkret zur Barrierefreiheit einer Seite beitragen. So könnte man zum Beispiel extra für Besucher mit Beeinträchtigungen des Sehvermögens ein Layout mit starken Kontrasten sowie größeren Symbolen und einer größeren Schrift bereitstellen.

wie funktioniert’s?

In Kurzform: das Ganze realisieren wir, indem zunächst – logisch – mindestens zwei verschiedene Stylesheets erstellt werden. Dann bauen wir auf der Webseite einen Link ein, über den das Layout gewechselt werden kann. Damit der Browser des Benutzers sich diese Entscheidung merkt und auch beim nächsten Besuch wieder den ausgewählten Style verwendet, speichern wir ein Cookie auf dem Rechner des Besuchers.

Voraussetzungen

Voraussetzung Nr. 1 ist, dass ihr Layout und Inhalt getrennt habt – sprich, dass ihr sämtliche Formatierungen über ein externes (!) Stylesheet vornehmt und nicht im HTML (wie etwa durch das font-Tag).

Voraussetzung Nr. 2 ist, dass bei euch PHP läuft.
Man kann den Styleswitcher zwar auch über JavaScript realisieren, aber damit sperrt ihr all jene Benutzer aus, die JS deaktiviert haben. Hier folgt nun also ein Tutorial, wie ihr das Ganze serverseitig über PHP umsetzen könnt. :-)

Wichtig: Credits gehen an yablo.de, dessen Anleitung mir beim Schreiben dieses Tutorials geholfen hat!

die Stylesheets

… werden ganz gewöhnlich erstellt und abgepeichert, beispielsweise unter den Namen style1.css und style2.css.

die einzelnen Header-Dateien

Wir brauchen nun so viele Header-Dateien, wie wir Layouts haben.
Sinnvollerweise nennen wir die Header-Datei für den ersten Style header1.php, die für den zweiten Style header2.php und so weiter. Hier werden nun die einzelnen Stylesheets verlinkt, wobei das Stylesheet, das zum jeweiligen Layout gehört – bei header1.php also style1.css – mit dem Attribut rel=”stylesheet” versehen werden, während die anderen Styles das Attribut rel=”alternate stylesheet” sowie ein title-Tag verpasst bekommen.

<link rel="stylesheet" type="text/css" media="screen" href="style1.css" />
<link rel="alternate stylesheet" type="text/css" media="screen" href="style2.css" title="zweiter Style" />

Wenn der User nun, wie bei unserem Styleswticher, ein anderes Layout auswählt, wird der bevorzugte Style (in diesem Falle: style1.css) durch den alternativen (style2.css) überschrieben.

Im Grunde genommen wären wir jetzt fertig – der User klickt, und schon wechselt der Style.
Aaaber… das Leben eines Webdesigners wäre nicht so schön, wie es ist, gäbe es nicht den Internet Explorer. :-) Der kommt damit nämlich nicht so ganz klar. Also erweitern wir diesen bis jetzt wirklich einfachen Code und erhalten dadurch obendrein die Möglichkeit, dass der ausgewählte Style auch beim Besucher gespeichert wird, sodass er beim nächsten Besuch der Seite automatisch wieder gesetzt wird.

Wir merken uns also, dass wir jetzt die style1.css, style2.css, die header1.php sowie header2.php haben und basteln fröhlich weiter. :-)

die switch_header.php

Jetzt erstellen wir eine Datei namens switch_header.php, welche die einzelnen durchnummerierten Headerdateien verwaltet:


<?php
$styledatei = "header";
$styledatei .= $style;
$styledatei .= ".php";
include $styledatei;
?>

jetzt gibt’s Kekse – die cookie.php

Als nächstes kommt die cookie.php an die Reihe, die dafür sorgt, dass die Stylewahl des Benutzers auf seinem Rechner hinterlegt und für künftige Besuche bereitgestellt wird.

<?php
$gesamtestyles = 2;
$standardstyle = 1;
if (isset($_REQUEST['neuerstyle'])) {
$neuerstyle = (int)$_REQUEST['neuerstyle'];
if ( ($neuerstyle<1) OR ($neuerstyle>$gesamtestyles) ) $neuerstyle = $standardstyle;
} elseif (isset($_REQUEST['style'])) {
$neuerstyle = (int)$style;
if ( ($style<1) OR ($style>$gesamtestyles) ) $neuerstyle = $standardstyle;
} else $neuerstyle = $standardstyle;
$style = $neuerstyle;
setcookie ('style', "", time() - 3600);
setcookie ('style', $neuerstyle, time()+(86400*365),'/');
setcookie ('style', $neuerstyle, time()+(86400*365),'/','.deinedomain.de/');
$style = $neuerstyle;
?>

Die Zahl der insgesamt verfügbaren Styles musst du in der zweiten Zeile noch anpassen, ebenso wie die Adresse deiner Webseite ganz unten im Quelltext.

index.php

So. Deine Indexseite – also die Seite, die du bisher schon hattest – musst du nun mit der cookie.php und den Styles verbinden. Dazu notierst du ganz oben – als allererstes, noch vor der Doctye-Angabe:
<?php include('cookie.php'); ?>
Die Stylesheets hast du ja in den einzelnen Headerdateien eingebunden, die wiederum durch die switch_header.php aufgerufen werden – folglich muss nun nur noch die switch_header.php eingebunden werden. Dies nimmst du innerhalb des head-Tags vor.
<?php include('switch_header.php'); ?>

aufrufen

Die verschiedenen Styles können nun wie folgt aufgerufen werden:

http://deinedomain.de/index.php?neuerstyle=1

http://deinedomain.de/index.php?neuerstyle=2

Hierzu bietet es sich an, ein Dropdown-Menue einzubauen oder aber – bei wenigen Styles – ganz normale Links.

verwandte Beiträge

14 Gedanken zu “Styleswitcher

  1. cool, ich hab mich schon länger gefragt, wie sowas geht. sieht eigentlich sehr simple aus :)

  2. Ahhh.. supermegaultraklasse.. hab vor ein paar tagen erst nach plugins und co dafür gesucht, aber nichts gescheites gefunden :D
    das muss ich mal ausprobieren!

  3. Ich teste das ganze gerade auf Pytal und bekomme leider eine Fehlermeldung : Parse error: syntax error, unexpected ‘;’ in /###/www/#####/#####/#/de/pytalhost/hollywoodgeisha/web/Homepage/cookie.php on line 8

    In Zeile 8 steht aber nur : $neuerstyle = (int);

    Bin grad überfordert & weiß nun nicht wo der Fehler sein soll o.O

  4. Ich habs auch ausprobiert, und bei mir zeigts das gleiche wie bei Svenya an.

    Parse error: syntax error, unexpected ‘;’ in /usr/export/www/vhosts/funnetwork/hosting/incircus/cookie.php on line 8

    Hab kein Plan wie ich das wegbekomme. :(

  5. Hallo,

    nach dem Parsen zu –> integer $_REQUEST['style'] -Variable <–!

    Wundert mich, dass von Frau Mühlbauer keine Antwort kommt … Quellcode nur kopiert und keine Ahnung (Webdesigner)?!

    Gruß Matu

  6. heey :o ich hab das selbe problem wie Rob & Svenya bei mir wird auch nur
    Parse error: syntax error, unexpected ‘;’ in /usr/export/www/vhosts/funnetwork/hosting/usestyle/cookie.php on line 8
    angezeigt v.v was muss man dagegen tun? xD

  7. Hej! Hatte mich in der cookie.php vertippt bzw. die Variable $style vergessen – ist jetzt korrigiert! :-)

    @ Matu:
    nö, nur erst keine Zeit gehabt und dann verplant. Manchmal geht das Real Life eben immernoch vor. ;-)

  8. ;_; also i.was mach ich falsch … jetzt habe ich ne andere warnung
    Warning: include(switch_header1.php) [function.include]: failed to open stream: No such file or directory in /usr/export/www/vhosts/funnetwork/hosting/usestyle/switch_header.php on line 5

    Warning: include() [function.include]: Failed opening ‘switch_header1.php’ for inclusion (include_path=’.:’) in /usr/export/www/vhosts/funnetwork/hosting/usestyle/switch_header.php on line 5

  9. Argh, in der switch_header.php muss es natürlich statt:
    $styledatei = “switch_header”;
    so heißen:
    $styledatei = “header”;
    Denn es soll ja die Header-Datei mit der jeweiligen Nummer eingebunden werden (header1.php oder header2.php usw.) und nicht switch_header1.php. Hab’s oben korrigiert, nochmal getestet und nehme mir vor, meinen Quellcode und die Tutorials nicht mehr spätnachts mit zuviel Kaffee intus zu schreiben. ;-)

  10. wuhu :P habs soweit geschafft <3 xD nur ne frage hab ich dann wie muss dann die index seite aussehen ? also bei mir sieht die dann so aus :x
     
    <?php include(‘cookie.php’); ?>

    <?PHP
    $number = “1″;
    include(“cutenews/show_news.php”);
    ?>

    <?php include(‘switch_header.php’); ?>
    aaaaber XD das problem ist o.o Cutenews ist dann leider HINTER dem layout x.x’ … xD

  11. Hej! Der Header-Inhalt (der ja durch switch_header eingebunden wird) muss vor dem Cutenews stehen. :)

     

    <?php
    include(‘cookie.php’);
    $number = “1″;
    include(‘cutenews/show_news.php’);
    include(‘switch_header.php’);
    ?>

  12. x.x jetzt hat der wieder ein anderes problem xDD
     
    Parse error: syntax error, unexpected ‘;’ in /usr/export/www/vhosts/funnetwork/hosting/usestyle/index.php on line 7

  13. Hej! Die Fehlermeldung besagt, dass in deiner index.php in Zeile 7 ein Semikolon steht, was da nicht hingehört. Was ist denn bei dir Zeile ? Und hast du die richtigen Anführungszeichen verwendet? (auf den ersten Blick sehen die ja alle gleich aus, aber es gibt ja die doppelten und einfachen Gänsefüßchen, und dann auch die Akzentzeichen)… das müssen hier einfache Anführungsstriche sein.

  14. So also ich hab es jetzt wieder soweit gebracht das keine fehlermeldungen mehr kommen aber es sieht jetzt wieder so aus http://i27.tinypic.com/1z34fb8.png
    <?php
    include(‘cookie.php’);
    $number = “1″;
    include(‘cutenews/show_news.php’);
    include(‘switch_header.php’);
    ?>
    http://i32.tinypic.com/ju7f6f.png da sieht man wo cutenews eig. hin sollte :x
    aber x.x irgendwie funzt das net.
    Lg cute