Günther: /HTML: reload nach Submit eines Formulars (aber ohne JS!)

Hallo,
ich habe da ein kleines Problem:
Auf meiner PHP-Website habe ich eine Skin-Auswahl eingebaut.
D.h. man kann in einem Formular einen Skin auswählen und nachdem man dann "Change Skin" geklickt hat sollte der Skin dann ausgewählt sein. das funktioniert aber nicht ganz. die einstellung usw. ist zwar gespeichert aber der skin ändert sich erst nach dem klicken eines links bzw. eines reloads der seite.
kann man das nicht irgendwie automatisieren, aber _ohne_ javascript?
(z.b. mit header() oder <meta>-tags? << falls das möglich ist, wie? ich habe mich bereits mit der header() fkt beschäftigt aber habe das gewünschte ergebnis noch nicht erzielen können. wo genau muss ich diese header funktion wie einbauen?)
MfG,
Günther

  1. Hi!

    Am Besten wäre es du setzt den Link zu dieser Seite mal hierher, damit wir uns die Seite anschauen könne.
    Wie überträgst du die Variablen? Mit GET oder POST?
    Da würde ich GET empfehlen.
    Wenn der Browser die Seite nur neu laden soll kannst du einfach immer eine Zufallsvariable an die Seite anhängen (z.B. rnd=127462), die dafür sorgt dass die Seite neu geladen wird.

    cu

    Marc Reichelt || http://www.marcreichelt.de/

    --
    Linux is like a wigwam - no windows, no gates and an Apache inside!!!
    SELFCode: ss:| zu:) ls:[ fo:} de:[ va:} ch:? sh:) n4:° rl:? br:^ js:( ie:% fl:) mo:)
    http://emmanuel.dammerer.at/selfcode.html
    1. Am Besten wäre es du setzt den Link zu dieser Seite mal hierher, damit wir uns die Seite anschauen könne.

      tut mir leid aber ich teste das im moment nur offline, d.h. das wird nicht möglich sein :(
      Unten im Post ist aber der code von der skin-auswahl.

      Wie überträgst du die Variablen? Mit GET oder POST?

      mit post.

      Da würde ich GET empfehlen.
      Wenn der Browser die Seite nur neu laden soll kannst du einfach immer eine Zufallsvariable an die Seite anhängen (z.B. rnd=127462), die dafür sorgt dass die Seite neu geladen wird.

      wozu, dasselbe könnte man doch z.b. auch mit post machen, oder irre ich mich da?

      also, ich werde das jetzt noch etwas detailierter beschreiben:
      Der Benutzer wählt also in der Drop-Down-box einen Skin aus.
      Daraufhin wird erstmal in $GLOBALS eine variable gesetzt die dazu dient um zu sehen ob der button geklickt wurde und eine zweite variable die den skin speichert.
      in der datei index.php (dort ist die skin-auswahl via include() eingabut) wird dann gleich am anfang, je nach status dieser beiden variablen ein cookie gesetzt.
      Fall 1) skin ausgewählt + ausgewählter skin existiert in DB
      -> skin in cookie speichern, die beiden oben genannten variablen gleich 0 setzen (damit diese schleife nicht jedesmal bei einem reload durchlaufen wird). zusätzlich wird der skin in der variable $skin gespeichert.
      Fall 2) kein skin ausgewählt oder skin existiert nicht
      -> defaultskin aus DB auslesen und in variable $skin speichern.

      Sobald jemand in der skin-auswahl einen skin auswählt, wird die seite neu geladen und sofort wird der neue skin richtig in $skin gespeichert.

      die variable $skin wird dann so weiterverwertet:
      $skin ist ja nur die SkinID, dadurch wird dann aus der DB das zugehörige verzeichnis ausgelesen.
      dann wird durch
      define('SKIN_DIR', './templates/skins/' . $skindir);
      das skinverzeichnis gesetzt und alle templates sollten dann aus SKIN_DIR angeigt werden.
      das dateisystem sieht also so aus:

      /templates/skins/skin1:
      template1.tpl
      template2.tpl
      template3.tpl

      /templates/skins/skin2:
      template1.tpl
      template2.tpl
      template3.tpl

      und genau da liegt das problem. dieses verzeichnis scheint erst nach einem reload der seite aktualisiert zu werden. (obwohl das verzeichnis ja VOR dem ersten echo() befehl definiert wird usw.)
      kann man das irgendwie vereinfachen?

      Gruß,
      Günther.

      Hier die skinauswahl.php:

      <?php
       if(isset($_POST['Submit']) AND $_POST['Submit'] == "Change skin")
       {
        if(isset($_POST['SkinSelect']) AND $_POST['SkinSelect'] == true)
        {
         $GLOBALS['SkinSelect']['Pressed'] = 1;
         $GLOBALS['SkinSelect']['SkinID'] = $_POST['SkinSelect'];
        }
        else
        {
         echo(":P");
        }
       }
       else
       {
        $sql = "SELECT
            ID,
            Name
           FROM
            ".DBPREFIX."skins;";
        $result = new Query($sql);
        if($result -> error())
        {
         $result -> getError();
        }
        $skins = array();

      while($row = $result -> fetch())
        {
         $skins[$row['ID']] = changetext($row['Name']);
        }
        if(isset($_COOKIE['SkinID']) AND array_key_exists($_COOKIE['SkinID'], $skins))
        {
         $skin = $_COOKIE['SkinID'];
        }
        else
        {
         $sql = "SELECT
             Defaultskin
            FROM
             ".DBPREFIX."config;";
         $result = new Query($sql);
         if($result -> error())
         {
          $result -> getError();
         }
         $row = $result -> fetch();
         $skin = changetext($row['Defaultskin']);
        }
        echo("<form action="index.php" method="post">\n");
        echo("<select name="SkinSelect">\n");
        foreach($skins as $key => $value)
        {
         echo("<option value="".$key.""");
         if($key == $skin)
         {
          echo(" selected="selected"");
         }
         echo(">".$value."</option>\n");
        }
        echo("</select>\n");
        echo("<input type="submit" value="Change skin">");
        echo("</form>\n");
       }
      ?>

      1. Hallo.

        wozu, dasselbe könnte man doch z.b. auch mit post machen, oder irre ich mich da?

        Er meinte nur, dass sich dann die Addresse geändert hat und der Browser neu lädt, weil er die Seite nicht zu kennen glaubt.

        MfG _Siro.

        1. Er meinte nur, dass sich dann die Addresse geändert hat und der Browser neu lädt, weil er die Seite nicht zu kennen glaubt.

          sorry aber ich kann nicht ganz folgen, wieso glaubt der browser denn die seite nicht zu kennen? :S

          gruß,
          günther

          1. Er meinte nur, dass sich dann die Addresse geändert hat und der Browser neu lädt, weil er die Seite nicht zu kennen glaubt.

            sorry aber ich kann nicht ganz folgen, wieso glaubt der browser denn die seite nicht zu kennen? :S

            Weil durch die Zufallsvariable oben eine andere Adresse steht.
            http://www.domain.de/index.php?bla=23
            ist für den Browser eine andere Adresse als
            http://www.domain.de/index.php?bla=42
            also muß er die Seite auch neu laden.

            Cooler ist übrigens sowas:
            Header("Content-type: text/html\nExpires:-1\nPragma:no-cache\nCache-Control:no-cache,must-revalidate,no-store,post-check=0,pre-check=0\n");

            Damit sagst Du dem Browser, daß er nicht cachen soll. Die meisten (Konqueror, M$IE, Mozilla, ...) halten sich sogar daran.

            1. Hi,

              Weil durch die Zufallsvariable oben eine andere Adresse steht.
              http://www.domain.de/index.php?bla=23
              ist für den Browser eine andere Adresse als
              http://www.domain.de/index.php?bla=42
              also muß er die Seite auch neu laden.

              so ist das also, vielen dank für die erklärung.
              So ganz überzeugt bin ich von der methode allerdings nicht. Hört sich für mich irgendwie so an als würde man absichtlich einen Fehler produzieren der den Browser das Gewünschte durchführen lässt.

              Header("Content-type: text/html\nExpires:-1\nPragma:no-cache\nCache-Control:no-cache,must-revalidate,no-store,post-check=0,pre-check=0\n");

              Das gefällt mir doch gleich viel besser :)
              Wo genau muss ich das denn hinschreiben?
              einfach ganz an den beginn der index.php?

              1. Wo genau muss ich das denn hinschreiben?
                einfach ganz an den beginn der index.php?

                hmm nein da anscheinend nicht, oder?
                zumindest funktioniert es bei mir damit nicht (IE 6).
                Dasselbe Problem habe ich z.B. bei einer Shoutbox.
                Wenn da jemand was "shoutet" wird das erst nach einem reload der seite wirklich in der shoutbox angezeigt. wie kann ich das umgehen??

                gruß günther

              2. Hallo.

                Die Funktion muss _ganz am Anfang stehen.
                Kannst du auch nachlesen unter:
                http://de3.php.net/manual/de/function.header.php

                MfG _Siro.

              3. Hi

                Header("Content-type: text/html\nExpires:-1\nPragma:no-cache\nCache-Control:no-cache,must-revalidate,no-store,post-check=0,pre-check=0\n");

                Das gefällt mir doch gleich viel besser :)

                Ebent[TM].

                Wo genau muss ich das denn hinschreiben?
                einfach ganz an den beginn der index.php?

                Jo, und zwar bevor Du Inhalt rausschreibst, also ganz ganz am Anfang.
                Also richtig:

                <?php
                Header(...
                ...
                ?>
                <html>
                <head>
                ...

                sozusagen.
                Wenn Du zuerst Inhalt rausschreibst, kriegst Du nur eine Fehlermeldung. So ist es _falsch_:

                <html>
                <head>
                <?php
                Header(...
                ...

  2. Hallo Ghünther.

    Das Abschicken des Formulars bewirkt doch einen Reload.
    Ich glaube, du musst mal erklären, wie du das genau umgesetzt hast.

    MfG _Siro.