MankoFranko: Checkbox-Protokoll onChange

Hallo, ich habe folgendes Problem:

Ich habe eine HTML-Datei mit variabler Anzahl von Checkboxen.
Nun möchte ich eine Art Log-Datei erstellen, aus der hervorgeht, wann welche Checkbox in welchen Zustand (checked/unchecked) versetzt worden ist.

Der Weg meiner Wahl waren zunächst Server-Side-Includes, also:

<input type="checkbox" name="box1" onchange="<!--#exec cgi='/cgi-bin/write.pl' -->" />

Nun habe ich dabei folgende Probleme/Fragen:

1. Wie übergebe ich dem Skript den Namen der Checkbox?
Bei der mir bekannten Variante des parametrisierten Aufrufs (cgi-bin/write.pl?Name='box1') funktionierte das Skript gar nicht erst.

2. Wie finde ich den Zustand der Checkbox heraus? Bei JS würde ich das "this"-Object übergeben und vom Skript aus drauf zugreifen. Bei Perl stehe ich da vor einem Problem, oder?

3. Interessanterweise wird das Skript grundsätzlich nur einmal ausgeführt, bei der ersten Änderung. Alle folgenden Änderungen bleiben unbehandelt. Weiß jemand wieso?

Würde mich über Tipps und Hinweise freuen (auch andere Wege, z.B. mitttels PHP, sind willkommen solange sie serverseitig einsetzbar sind).

Danke, der MankoFranko

  1. use Mosche;

    Ich habe eine HTML-Datei mit variabler Anzahl von Checkboxen.
    Nun möchte ich eine Art Log-Datei erstellen, aus der hervorgeht, wann welche Checkbox in welchen Zustand (checked/unchecked) versetzt worden ist.

    1. Wie übergebe ich dem Skript den Namen der Checkbox?
      Bei der mir bekannten Variante des parametrisierten Aufrufs (cgi-bin/write.pl?Name='box1') funktionierte das Skript gar nicht erst.

    Dann binde es mit #include virtual="..." ein, dann kannst du auch GET-Parameter übergeben.

    1. Wie finde ich den Zustand der Checkbox heraus? Bei JS würde ich das "this"-Object übergeben und vom Skript aus drauf zugreifen. Bei Perl stehe ich da vor einem Problem, oder?

    Warum generierst du nicht gleich die gesamte Seite mit Perl? Sollte einfacher sein, als auf einer Seite mehrere Perl-Scripte mit SSI einzubinden.

    1. Interessanterweise wird das Skript grundsätzlich nur einmal ausgeführt, bei der ersten Änderung. Alle folgenden Änderungen bleiben unbehandelt. Weiß jemand wieso?

    Habe ich nicht ganz verstanden, könnte aber ein Cache-Problem sein.
    use Tschoe qw(Matti);

    --
      Anyone who quotes me in their sig is an idiot. -- Rusty Russell.
    1. Erstmal Danke für Deine Antwort!

      Dann binde es mit #include virtual="..." ein, dann kannst du auch GET-Parameter übergeben.

      Das Problem ist, dass ich gar keine GET-Parameter bekomme, da ich das Logging ja nicht über einen Submit-Button o.ä. anstoßen will, sondern jedesmal, wenn jemand den Checkbox-Wert verändert.
      Bindet "#include virtual..." nicht einfach nur den Inhalt der Datei als Text ein?

      Warum generierst du nicht gleich die gesamte Seite mit Perl?

      Weil das HTML schon per XSLT generiert wird.

      Habe ich nicht ganz verstanden, könnte aber ein Cache-Problem sein.

      Glaube ich nicht. Ich habe das als 3-zeiliges Script von einer Testseite mit nur einer einzigen Checkbox versucht. Und der Rechner hier verfügt über ausreichend Resourcen.

      1. use Mosche;

        Dann binde es mit #include virtual="..." ein, dann kannst du auch GET-Parameter übergeben.

        Das Problem ist, dass ich gar keine GET-Parameter bekomme, da ich das Logging ja nicht über einen Submit-Button o.ä. anstoßen will, sondern jedesmal, wenn jemand den Checkbox-Wert verändert.
        Bindet "#include virtual..." nicht einfach nur den Inhalt der Datei als Text ein?

        Du wolltest doch Parameter mit ?bla=blub&bims=bams übergeben. Dies nennt man GET-Parameter. Bei mir funktioniert folgendes:
        <!--#include virtual="/inc/shead.shtml?$QUERY_STRING" -->

        POST-Parameter kannst du hingegen an eine Datei, die als SSI geparst wird, nicht schicken, da beschwert sich zumindest der Apache.

        Aber jetzt habe ich das ganze erst verstanden. Du willst also, wenn jemand den Zustand einer Checkbox verändert, diese Zustandsveränderung an den Server senden.
        Einerseits wäre es möglich, einfach das gesamte Formular abschicken zu lassen (also bei onChange="document.forms[0].submit();") und dann dein Perl-Script entsprechend reagieren zu lassen. Allerdings ist das sehr umständlich.
        Zweite Möglichkeit wäre es, die Zustandsveränderung erstmal mit Javascript zu sammeln und dann gemeinsam (wenn deine Zustandsveränderungen "abgespeichert"/verarbeitet werden) als schon vorbeireitete Log-Meldung an den Server mitgesendet werden. Sicherlich am einfachsten zu realisieren.

        Nächste Möglichkeit lehnt sich an die erste an:
        Du musst jedesmal, wenn eine Zustandveränderung eintritt, vom Server eine Ressource laden. Üblicherweise wird dazu einfach ein kleines Bild genommen (meist ein 1x1-Transparant-GIF), welches von einem Perl-Script ausgegeben wird. Dieses schreibt auch die Log-Meldung, und du kannst die entsprechenden Daten, die du in dein Log schreiben willst, als GET-Parameter an das Bild hängen. Du musst dann als onChange-Event einfach nur angeben, dass ein entsprechendes Bild neu geladen wird.

        Das ganze ist allerdings alles ziemlich umständlich, da je keine dauerhafte Kommunikation zwischen Browser und Server besteht, und sind daher alles nur Krücken. Was passiert, wenn jemand JS deaktiviert?

        use Tschoe qw(Matti);

        --
          Anyone who quotes me in their sig is an idiot. -- Rusty Russell.
  2. <input type="checkbox" name="box1" onchange="<!--#exec cgi='/cgi-bin/write.pl' -->" />

    Das Kann auf jeden Fall nicht funktionieren, da "OnChange" ja ein für Javascript konzipierter Eventhandler ist...

    Du musst, denke ich, einfach ein Formular per "action=" an das Script senden (so macht mans in PHP, von Perl hab ich keine Ahnung...)

    gruß

    1. Das Kann auf jeden Fall nicht funktionieren, da "OnChange" ja ein für Javascript konzipierter Eventhandler ist...

      Auf keinen Fall würde ich nicht sagen, immerhin es funktioniert ja. Allerdings nur einmal. Und ich kann keine Parameter übergeben.

      Du musst, denke ich, einfach ein Formular per "action=" an das Script senden (so macht mans in PHP, von Perl hab ich keine Ahnung...)

      Dann müsste ich jedesmal einen POST-Event auslösen und das ist nicht der Sinn der Sache.