makaio: Mehrer CSS - Steuerung über $GLOBALS

Hi!

Ich möchte auf meiner Seite mehrere Sytlesheets zur Wahl stellen. Dazu habe ich mir gedacht ein kleines Menu mit den zur Verfügung stehenden Stilen anzubieten. Wenn der Stil dann ausgewählt wird wird an die index.php der Wert der Variable $change_style weitergegeben, die dann wie folgt weiterverarbeitet wird:

if ( isset( $change_style ) ) {
  $GLOBALS['style'] = $change_style;
}

Im weiteren Verlauf des Seitenaufbaus wird sich dann also auf $GLOBALS['style'] bezogen. Das Stylesheet wird mit folgender Anweisung eingebunden:

<LINK rel="stylesheet" type="text/css" href="styles/<?php echo $GLOBALS['style'].".css"; ?>" />

Das klappt beim ersten Aufruf wunderbar (Bsp.: index.php?change_style=style1), alles wird gemäß dem entsprechenden Sytelsheet angezeigt.

Wenn ich dann aber in meiner Navigationsleiste auf einen beliebigen Link*** klicke  geht der Wert der $GLOBALS-Variable verloren. Somit sind auch keine Formatierungsanweisungen mehr da.

Was mache ich falsch?

Gruß,

Matthias

*** Die Links werden mit folgender Zeile generiert:
echo "<a class="nav_link" href="?con=".$id."">".$name."</a>";

  1. Moin!

    Wenn der Stil dann ausgewählt wird wird an die index.php der Wert der Variable $change_style weitergegeben, die dann wie folgt weiterverarbeitet wird:

    if ( isset( $change_style ) ) {
      $GLOBALS['style'] = $change_style;
    }

    AUA! AUTSCH! Das tut weh!

    Gleich drei böse Punkte in nur drei Zeilen Code (die man eigentlich auch nur als eine Zeile zählen könnte).

    Erstens: Woher kommt $change_style? Doch nicht etwa aus dem URL-Parameter? Dann informiere dich bitte über register_globals, und warum man diese Option besser ausschaltet, und auch nicht mehr davon ausgehen sollte, dass sie eingeschaltet ist: http://www.dclp-faq.de/q/q-formular-register-globals.html

    Zweitens: Du willst eine globale Variable benutzen - deshalb $GLOBALS. Dein Code deutet aber extrem darauf hin, dass du keinen Schimmer hast, was $GLOBALS macht. Lies: http://www.dclp-faq.de/q/q-sicherheit-global.html

    Drittens: $GLOBALS ist das Array mit allen globalen Variablen drin. Dein Code ist gleichbedeutend mit diesem hier:
    $style = $change_style;

    Und das sieht doch ziemlich idiotisch aus, einer existierenden Variablen den Inhalt einer anderen existierenden Variablen zuzuweisen - ohne deren Inhalt irgendwie zu bearbeiten.

    Lies: http://www.dclp-faq.de/q/q-php-variablen.html

    Wenn ich dann aber in meiner Navigationsleiste auf einen beliebigen Link*** klicke  geht der Wert der $GLOBALS-Variable verloren. Somit sind auch keine Formatierungsanweisungen mehr da.

    Logisch. Weil alle Variablen gelöscht werden, wenn das eine Skript beendet ist.

    Was mache ich falsch?

    Du mußt entweder an alle Links den URL-Parameter mit dem gewählten Stylesheet dranhängen. Dann kannst du diese Information mit $_GET['change_style'] abfragen.

    Oder du startest eine Session. Dann kannst du das gewählte Stylesheet in $_SESSION speichern. Diese Variable wird wiederhergestellt, wenn weitere Skripte aufgerufen werden - allerdings erst durch den Befehl session_start().

    Lies: http://www.dclp-faq.de/ch/ch-version4_session.html (am besten alles davon).

    - Sven Rautenberg

    --
    Die SelfHTML-Developer sagen Dankeschön für aktuell 21335,05 Euro Spendengelder!
  2. Hi!

    moin

    Ich möchte auf meiner Seite mehrere Sytlesheets zur Wahl stellen. Dazu habe ich mir gedacht ein kleines Menu mit den zur Verfügung stehenden Stilen anzubieten. Wenn der Stil dann ausgewählt wird wird an die index.php der Wert der Variable $change_style weitergegeben, die dann wie folgt weiterverarbeitet wird:

    if ( isset( $change_style ) ) {
      $GLOBALS['style'] = $change_style;
    }

    wie wird die variable weitergegeben?
    wenn über get, dann bitte $_GET["change_Style"]

    <LINK rel="stylesheet" type="text/css" href="styles/<?php echo $GLOBALS['style'].".css"; ?>" />

    Das klappt beim ersten Aufruf wunderbar (Bsp.: index.php?change_style=style1), alles wird gemäß dem entsprechenden Sytelsheet angezeigt.

    Wenn ich dann aber in meiner Navigationsleiste auf einen beliebigen Link*** klicke  geht der Wert der $GLOBALS-Variable verloren. Somit sind auch keine Formatierungsanweisungen mehr da.

    selbstverständlich geht der wert verloren, du musst ihn natürlich wieder an die nächste file übergeben. nur wiel du in in dem Array $GLOBALS speicherst heisst das nicht das sie auch global ist.

    Was mache ich falsch?

    du musst zuerst nen default style festlegen.
    dann recht weit oben in denem script oder ner function sowas in der art:
    *snip*

    $GLOBALS['style'] = (isset($_GET["change_Style"]) && !empty($_GET["change_style"])) ? $_GET["change_style"] : $GLOBALS["default_style"];

    erklärung.

    wenn die variable cange_style übergeben wird dann wird diese auch benutzt, wenn dem nicht so ist wird der default style geladen.
    du musst, wenn du nicht willst das sich der style wieder in den default ändert, an jeden link immer folgendes anhängen:
    <a href="meinlink.php?change_style=<?php echo $GLOBALS['style']?>

    änder den name aber in style oder so, kommt besser.

    Gruß,

    Matthias

    mfg analpha