Kristof: (ZU DIESEM FORUM) Cookies

Hallo,

ich möchte jetzt doch mal die technische Frage nach den Cookies für/im Forum anregen.
Sollten Namen und E-mail speichern.

Nein, Stefan
(Zitat: Also Leute, da ihr das ja offensichtlich total easy zu realisieren findet, postet mir exakt den Code, sagt mir dazu, wo welcher Code hingehoert, richtig idiotensicher bitte, und dann koennen wir gerne mal darueber reden und ein wenig rumprobieren. Aber bitte dazu einen neuen Thread...)
kann ich leider nicht aus dem Ärmel schütteln.

Aber vielleicht schonmal überlegen, mein Konzept wäre die Abfrage beim Aufruf der Seite self_forum.html, und zwar Javascript im Kopf der Datei um Variablen mit dem Cookie Inhalt zu setzen (bzw nicht wenn kein Cookie).

Im Formular wird diese Variable vielleicht erst dann eingetragen wenn auf das Feld gesprungen wird (onfocus oder so).
Nur beim Senden einer Nachricht wird ein Cookie (oder neues Cookie)  gesetzt.

Jetzt bleibt die Frage der Übergabe der Werte an die jeweilige Forumsdatei.
Da gibt es doch Möglichkeiten beim Aufruf der Datei?
Wäre jedenfalls einfacher als mit versteckten Dateien in einem Frameset.

Gruesse
Kristof

  1. Hi,

    ich möchte jetzt doch mal die technische Frage nach den Cookies für/im Forum anregen.
    Sollten Namen und E-mail speichern.

    kein schlechter Gedanke, aber auch nicht neu. Egal, wärmen wir es noch mal auf :-)

    Aber vielleicht schonmal überlegen, mein Konzept wäre die Abfrage beim Aufruf der Seite self_forum.html, und zwar Javascript im Kopf der Datei um Variablen mit dem Cookie Inhalt zu setzen (bzw nicht wenn kein Cookie).

    Dieser Code müßte in _jeder_ Datei stehen, da die einzelnen Artikel reine HTML-Dokumente sind, ohne daß sie über ein CGI-Script laufen (sie wurden mal davon erzeugt, aber das bringt uns nichts). Somit wird die Übertragung _jeder_ Datei um (optimiert) ca. 200 Byte verzögert, eher mehr. Das klingt zwar nicht gerade nach viel, ist aber ein nicht zu vernachlässigender Traffic (zu dem btw. auch der Cookie selbst gehört).

    Im Formular wird diese Variable vielleicht erst dann eingetragen wenn auf das Feld gesprungen wird (onfocus oder so).

    Ich schlage onLoad vor, oder ohne Event-Handler direkt nach dem Formular.

    Jetzt bleibt die Frage der Übergabe der Werte an die jeweilige Forumsdatei.
    Da gibt es doch Möglichkeiten beim Aufruf der Datei?

    Nö, der Cookie ist ja auf dem heimischen Rechner gespeichert und muß nicht übergeben werden. "Einfach" der JavaScript-Code zur Auswertung reicht, allerdings wie gesagt muß dieser auf jeder einzelnen Seite stehen.

    Stefan, wenn Du nicht von vornherein ablehnst (nur Du kannst die Auswirkungen abschätzen), können wir hier sicherlich gemeinsam einen optimierten JavaScript-Code entwickeln, das wäre sicher auch für die Forumsauslese ganz gut. Der Code muß dann nur an einer (vermute ich) Stelle des Scripts eingefügt werden, damit er in jedes neue Dokument geprintet wird, und natürlich muß er in self_forum_neu.html eingesetzt werden. Vom Aufwand her ist das minimal, wenn wir den Code hier gemeinsam schreiben ;-)

    Wie wär's?

    Cheatah

    1. Hi nochmal,

      [...] Der Code muß dann nur an einer (vermute ich) Stelle des Scripts eingefügt werden, [...]

      ich habe das Cookie-Setzen vergessen. Das sind noch mal ein paar (wenige) Zeilen Perl-Code; bei der Bestätigung muß eigentlich nur der entsprechende Set-Cookie-Header mit ausgegeben werden. Wenn man es besonders gut machen will, vergleicht man an der Stelle noch den Cookie mit den aktuellen Eingaben und setzt den Cookie nur bei einer Änderung - also eine weitere if-Abfrage.

      Cheatah

    2. Hallo Cheatah,

      Stefan, wenn Du nicht von vornherein ablehnst (nur Du kannst die Auswirkungen abschätzen), können wir hier sicherlich gemeinsam einen optimierten JavaScript-Code entwickeln, das wäre sicher auch für die Forumsauslese ganz gut. Der Code muß dann nur an einer (vermute ich) Stelle des Scripts eingefügt werden, damit er in jedes neue Dokument geprintet wird, und natürlich muß er in self_forum_neu.html eingesetzt werden. Vom Aufwand her ist das minimal, wenn wir den Code hier gemeinsam schreiben ;-)

      Ja, legt ruhig mal los. Wenn es funktioniert, wenn ich es kapiere <g> und wenn es allen was bringt, warum nicht? Ich wuerde aber vorschlagen, es erst mal nicht hier in das Forum einzubauen, sondern mit dem Original-Matt-Wright-Forum in einem Testbereich mal auszuprobieren. Da kann man am besten hemmungslos rumexperimentieren. Wenn du so was mal machen willst, Cheatah, auf jeden Fall! Vor allem koenntest du es, wenn es wirklich gut funktioniert, sogar als offizielle Forumserweiterung an Matt Wright herantragen.

      viele Gruesse
        Stefan Muenz

      1. Hi Stefan,

        Ja, legt ruhig mal los. Wenn es funktioniert, wenn ich es kapiere <g> und wenn es allen was bringt, warum nicht? Ich wuerde aber vorschlagen, es erst mal nicht hier in das Forum einzubauen, sondern mit dem Original-Matt-Wright-Forum in einem Testbereich mal auszuprobieren. Da kann man am besten hemmungslos rumexperimentieren. Wenn du so was mal machen willst, Cheatah, auf jeden Fall!

        okay, allerdings sind Cookies ein Thema, das ich bisher eher stiefmütterlich behandelt habe. Ich werde mich dann erst mal etwas einlesen und ein wenig ausprobieren. In der Zwischenzeit kannst Du ja schon mal einen Standard-Matt einrichten *g*

        Vor allem koenntest du es, wenn es wirklich gut funktioniert, sogar als offizielle Forumserweiterung an Matt Wright herantragen.

        Hey, gute Idee! Das würde ich dann aber eher mit einem File-Locking versehen, das dem bekannten "Subject stimmt, Artikel nicht"-Bug entgegenwirkt. Wenn man schon mal dabei ist... :-) Und war da nicht die Sache, daß die eMail-Adresse nicht korrekt an Antworten weitergegeben wird?

        Welche bekannten Bugs hat das Script? Wenn man die alle in einem Abwasch entfernt, ist es glaube ich am besten. Ich liste mal:

        Bugs:

        • File Locking
        • eMail-Adresse in Antworten ("...in Antwort auf xyz von ->Name<-")

        Dazu dann als Erweiterung(en):

        • Cookie-Funktion für Name, eMail, URL, Grafik (wenn schon, denn schon!)

        Ergänzungen bitte hier listen!

        Cheatah

    3. Moin

      hier mal ein kleiner Code dazu wie das aussehen könnte.
      Ich würde allerdings in den normalen Formularen nur die
      reine Abfrage reinbauen , und die Registrierung als
      extra Formular anbieten , so hält sich der Code in
      Grezen , die Getcookie-Funktion könnte man zur weiteren
      Optimierung ja auch noch in eine externe JS-Datei
      schreiben.

      gruss
      jens

      <HTML>
      <HEAD>
      <TITLE>Register Form</TITLE>

      <link rel=stylesheet type="text/css" href="../style/main.css">
      <script>
      function getCookie (name)
      {
      var dcookie = document.cookie;
      var cname = name + "=";
      var clen = dcookie.length;
      var cbegin = 0;
      while (cbegin < clen)
             {
              var vbegin = cbegin + cname.length;
              if (dcookie.substring(cbegin, vbegin) == cname)
                 {
                 var vend = dcookie.indexOf (";", vbegin);
                 if (vend == -1) vend = clen;
                 return unescape(dcookie.substring(vbegin, vend));
                 }
              cbegin = dcookie.indexOf(" ", cbegin) + 1;
              if (cbegin == 0) break;
              }
      return '';
      }

      function setCookie (name, value, expires)
      {
      if (!expires) expires = new Date();
      document.cookie = name + "=" + escape (value) + "; expires=" + expires.toGMTString() +  "; path=/";
      }

      function SetVals(theform)
      {
      var expdate   = new Date ();
      expdate.setTime (expdate.getTime() + (24 * 60 * 60 * 1000 * 365));
      setCookie("ForumName",theform.name.value,expdate);
      setCookie("ForumEmail",theform.email.value,expdate);
      }
      </SCRIPT>
      </HEAD>
      <body>

      <b>REGISTER-FORM</b>
      <FORM class="THeader01" NAME="regform" onSubmit="return false">

      <SCRIPT LANGUAGE="JavaScript">
      document.writeln("<B>Name<br><INPUT class='THeader01' NAME='name' TYPE='TEXT' SIZE='30' VALUE='"
         + getCookie("ForumName") + "'><br>")

      document.writeln("<B>E-Mail<br><INPUT NAME='email' TYPE='TEXT' SIZE='30' VALUE='"
          + getCookie("ForumEmail") + "'><br>")

      </SCRIPT>
      <INPUT TYPE="button" VALUE="Eintragen" onClick="SetVals(this.form);">
      </FORM>

      </BODY>

      1. Hi,

        hier mal ein kleiner Code dazu wie das aussehen könnte.

        vielen Dank! Ich werde den Code mal als Basis nehmen und versuchen, ihn auf Matt's Forum (und auf wenige Bytes) zu optimieren.

        Ich würde allerdings in den normalen Formularen nur die
        reine Abfrage reinbauen , und die Registrierung als
        extra Formular anbieten , so hält sich der Code in
        Grezen ,

        Die Registrierung wird wohl vom Perl-Script zurückgegeben werden, das die "Danke!"-Seite ausgibt - weniger Code pro Seite geht nicht :-)

        die Getcookie-Funktion könnte man zur weiteren
        Optimierung ja auch noch in eine externe JS-Datei
        schreiben.

        Werde ich wohl nicht machen, da dies JavaScript 1.1 erfordert und auch anderweitig schiefgehen kann. Zwar ist die Funktion nicht sooo wichtig, aber ich möchte sie doch so kompatibel wie möglich halten :-) Dennoch, eine Überlegung ist es allemal wert, danke für den Vorschlag!

        Cheatah

        1. Werde ich wohl nicht machen, da dies JavaScript 1.1 erfordert und auch anderweitig schiefgehen kann. Zwar ist die Funktion nicht sooo wichtig, aber ich möchte sie doch so kompatibel wie möglich halten :-) Dennoch, eine Überlegung ist es allemal wert, danke für den Vorschlag!

          naja.. wie gesagt , bisher gabs die Cookies ja eh nicht
          und die paar Leute die noch nen alten Browser haben
          würden denn halt nicht in den genuss kommen , aber
          ansonsten würde es ja nix an der Funktionalität des Forum ändern.
          Ich denke mal kaum das es da ncoh viel Leut gibt die
          nen alten Browser nutzen aber mit Gewalt auf ihre Kekse
          bestehen :)
          Ausserdem wird hier ja auch ständig über die Grösse
          des Forums gemeckert.. daher würde sich ein kleines
          externes echt besser machen denke ich.

          gruss
          Jens

    4. Moin!

      Ich hab jetzt mal die Netscape Doku gewaelzt und n bisschen gecodet, und jetzt poste ich das einfach mal als Alternativvorschlag zu Jens' Variante. Ich hab's nur mit Netscape 4.08 en WinNT getestet, und da laeuft's gut. Den Scriptbereich habe ich gleich mal als JS 1.2 deklariert, da ich annehme, dass es zumindest mit JS 1.0 nicht laeuft (aber solche Browser sind zum Glueck selten).

      Das Script arbeitet so, dass beim Abschicken eines Beitrags die Inhalte der Felder in einem Cookie gespeichert und beim naechsten Laden einer solchen Seite wieder ausgelesen werden. Dazu ist einfach das Script im HEAD einzufuegen (oh Wunder!) sowie das BODY- und das FORM-Tag abzuaendern (alles am Beispiel der self_forum_neu.html):

      <body bgcolor=#FFFFFF text=#000000 link=#AA5522 vlink=#552200 alink=#000000 onLoad="LoadValues();">

      <FORM NAME="posting" METHOD="POST" ACTION="/cgi-local/self_forum.pl" onSubmit="SaveValues(); return true;">

      Kurz zum Script selber: Im Anfangsbereich sind ein paar "Konstanten", um Anpassungen leichter vornehmen zu koennen. SaveValues() maskiert Sonderzeichen der eingegebenen Werte und speichert diese dann in einem (einzigen) Cookie zusammen mit der Angabe der Expire-Time (1 Jahr) und dem Pfad, fuer den dieses Cookie gelten soll (also fuer alles unterhalb von "/selfaktuell"). Und in LoadValues() werden die Werte eben wieder ausgelesen, kaum zu glauben, was? In der doppelten FOR-Schleife wird fuer jedes Element von fields (festgelegt durch FIELDS) nach dem zugehoerigen Cookiewert gesucht. (Die kann man sicher noch ein bisschen optimieren.) Dadurch kann man irgendwann auch mal ein Feld hinzufuegen oder wegnehmen, ohne dass ein entsprechend abgeaendertes Script nicht mehr mit bereits gesetzten Cookies zurechtkommt (hab ich zwar nicht getestet, aber ich vertrau dem jetzt einfach mal).

      Ein Problem koennte es vielleicht mit dem Namensfeld geben (bei mir funzt es, aber in anderen Browsern?). Letztlich wird zum Lesen oder Einsetzen eines Wertes aus dem oder in das Formular auf document.[form_name].[field_name].value zugegriffen. form_name ist in meinem Beispiel immer posting, field_name ist der Reihe nach name, email, url und img. Beim Namensfeld steht also document.posting.name.value da. Nur dummerweise ist name eine Eigenschaft des form-Objektes, was einen Konflikt ergeben koennte. Wie gesagt, bei mir funzt es. Falls andere Browser mackern, muessten wir vielleicht mal mit document.posting.elements["name"].value herumexperimentieren.

      Na gut, dann also hier die zwei Funktionen:

      <SCRIPT LANGUAGE="JavaScript1.2"><!--
          var FORM_NAME = "posting";
          var FIELDS = "name,email,url,img";
          var TIME_TO_LIVE = 365 * 24 * 3.6E6;    // one year
          var VALID_COOKIE_PATH = "/selfaktuell"; // for offline testing use just a /

      function LoadValues() {
              var cookie, i;
              var values, pair;
              var fields, field_count;

      fields = FIELDS.split(',');
              field_count = fields.length;

      if (!(cookie = document.cookie)) return false;
              values = cookie.split(/&/);
              if (values.length != field_count) return false;

      for (i=0; i<field_count; i++) {
                  for (j=0; j<field_count; j++) {
                      if (values[j].indexOf(fields[i] + "=") == 0) {
                          pair = values[j].split(/=/);
                          eval("document." + FORM_NAME + "." + pair[0] + ".value = "" +
                              unescape(pair[1]).replace(/"/, "\"")  + "";");
                      }
                  }
              }

      return true;
          }

      function SaveValues() {
              var fields, field_count;
              var i;
              var cookie, expire;

      fields = FIELDS.split(',');
              field_count = fields.length;
              cookie = "";

      for (i=0; i<field_count; i++) {
                  cookie += fields[i] + "=" + escape(eval("document." + FORM_NAME + "." + fields[i] + ".value"));
                  if (i < field_count - 1) cookie += "&";
              }

      expire = new Date();
              expire.setTime(expire.getTime() + TIME_TO_LIVE);
              document.cookie = cookie + "; EXPIRES=" + expire.toGMTString() + "; PATH=" + VALID_COOKIE_PATH;
          }
      //--></SCRIPT>

      Bye, Calocybe

      P.S. Stefan, in der self_forum_neu.html fehlt nach der Themenbereichsauswahlbox (was fuer ein Wort!) das </TD>. ;-)

    5. Dieser Code müßte in _jeder_ Datei stehen, da die einzelnen Artikel reine HTML-Dokumente sind, ohne daß sie über ein CGI-Script laufen (sie wurden mal davon erzeugt, aber das bringt uns nichts). Somit wird die Übertragung _jeder_ Datei um (optimiert) ca. 200 Byte verzögert, eher mehr. Das klingt zwar nicht gerade nach viel, ist aber ein nicht zu vernachlässigender Traffic (zu dem btw. auch der Cookie selbst gehört).

      Muß er nicht - es gibt ja JavaScript-Code in eigenen Dateien, und die werden hoffentlich vom Browser gecached.
      Ich mache das auf meiner Homepage auch so - ich vermute, Ihr könntet den Code (falls nicht bereits besser gepostet) weitgehend von dort übernehmen
      http://www.homepages.de/schroepl@dialup.nacamar.de/pbm/amtsblat/partien/zufall/formular.htm.