Kalle_Worms: Verarbeiten von Checkboxen (abmelden)

Hallöle,

ich grüble schon lange über eine elegante Lösung nach, wie ich abgemeldete Checkboxen erkennen kann.
Für eine große Anzahl von Möglichkeiten (ca. 60 aus einer Datenbank) kann sich ein Teilnehmer per Checkbox an- oder abmelden.

Nun gibt es DREI Zustände der Checkboxen, die mit Einträgen in der Datenbank korrespondieren:

  • NICHT angemeldet (kann angemeldet werden),
  • angemeldet (kann abgemeldet werden),
  • Anmeldung bereits gebucht und gegen Änderung gesperrt:

<input type='hidden' name='person_id' value='5054'>
<input type='checkbox' name='chkbox[]' value='123'>
<input type='checkbox' name='chkbox[]' value='456' checked>
<input type='checkbox' name='chkbox[]' value='789' checked disabled>
...

Wenn ich '123' anklicke, hat $HTTP_POST_VARS['chkbox'][0] den Wert '123' und ich kann für Person 5054 einen Satz anlegen.
Wenn aber '456' weggeklickt wurde, ist  $HTTP_POST_VARS['chkbox'] leer (auch die gesperrte Checkbox wird nicht gemeldet).
Es gibt also keine Meldung, WAS weggeklickt wurde und welche Sätze ich löschen muss.
Also habe ich ALLE (ausser gesperrte) gelöscht und die angehakten neu angelegt: Quick and dirty.

Eine Lösung mit Sessions scheidet aus, das PHP bei dem Provider (okay, eine alte, aber zuverlässige Domain) kennt schon session_start() nicht. Ein anderer Provider (terions) mit PHP 5 steht zur Verfügung, ist zwar günstig, dafür aber unzuverlässig erreichbar und dann langsam. Das Formular selbst muss also bei Rücksendung die Änderung erkennen lassen.

Versuche z.Z. mit zusätzlichem hidden-Attribut pro Checkbox zu arbeiten:
<input type='hidden' name='chkbox_alt[]' value='123-0'> // AUS
<input type='hidden' name='chkbox_alt[]' value='456-1'> // AN
<input type='hidden' name='chkbox_alt[]' value='789-3'> // GESPERRT

und bekomme dann sowas:
chkbox_alt chkbox
---------- ------
842-0      573     Haken ist geblieben
573-1      876     Neu angemeldet
123-0      579     Haken ist geblieben
876-0
929-0
333-1
579-1

Demnach wäre 333 zu löschen.

Mein Problem ist doch ganz alltäglich. Habe ich vielleicht einen anderen Lösungsansatz übersehen?

Lieben Gruß, Kalle

  1. Hi,

    wäre es nicht auch möglich, für jeden Eintrag den aktuellen Status anzuzeigen und daneben in einer DropDown-Box die möglichen Änderungen

    • anmelden
    • abmelden
    • keine Änderung

    anzubieten, mit default = keine Änderungen ?

    Vielleicht eine Variante :-)

    Ciao, Frank

    1. Hi, Frank,

      wäre es nicht auch möglich, für jeden Eintrag den aktuellen Status anzuzeigen und daneben in einer DropDown-Box die möglichen Änderungen

      • anmelden
      • abmelden
      • keine Änderung

      anzubieten, mit default = keine Änderungen ?

      Danke für die Idee, aus Programmierers Sicht eine saubere Sache.

      Muss ich mal nachdenken. Viele erst aufzuklappende Boxen wären bei der Masseneingabe wohl eher hinderlich.

      LG Kalle

      1. Hi,

        aber eine lange Reihe von 60 Checkboxen untereinander finde ich auch nicht so prickelnd. Außerdem, wieviel Modifikation tritt denn im Durchschnitt pro Benutzer auf?

        Außerdem könntest du auch ein Javascript mit anbieten für "Massen-Einstellungen" also

        • alle abmelden wo Abmeldung möglich
        • alle anmelden wo Anmeldung möglich

        Ciao, Frank

        1. Hi,

          aber eine lange Reihe von 60 Checkboxen untereinander finde ich auch nicht so prickelnd. Außerdem, wieviel Modifikation tritt denn im Durchschnitt pro Benutzer auf?

          Es ist eine Firmenliste mit Ankreuzmöglichkeit.

          Jeder angemeldete Besucher einer Messe kann ankreuzen, mit welchem der 60 Aussteller ein Gespräch gewünscht ist. Es werden so 5 - 10 Kreuze gemacht.

          Noch besser: Jeder der Aussteller kann ankreuzen, mit welchen der 400 !!! Besucher er sprechen möchte. Gibt so 50 - 100 Kreuze (Aussteller haben mehrere Mitarbeiter für Parallelgespräche).

          Die Software macht daraus feste Termine.

          Außerdem könntest du auch ein Javascript mit anbieten für "Massen-Einstellungen" also

          • alle abmelden wo Abmeldung möglich
          • alle anmelden wo Anmeldung möglich

          Alle abmelden macht Sinn, gute Idee.

          Schön, dass wir darüber geschrieben haben. Das ursprüngliche Problem (wie merke ich weg- gehakte Checkboxen) konnte ich aber immer noch nicht befriedigend lösen.

          Ciao, Kalle

          1. Hi nochmal,

            Schön, dass wir darüber geschrieben haben. Das ursprüngliche Problem (wie merke ich weg- gehakte Checkboxen) konnte ich aber immer noch nicht befriedigend lösen.

            • du weißt um die gespeicherten Einstellungen in deiner Datenbank
            • du weißt welche Checkboxes zurückgeliefert werden (sollen)
            • alle Werte sollen dann gespeichert werden

            Also der einfachste Weg: du änderst nix, du löschst die alte Liste und schreibst sie komplett neu, aus den Daten, die zurückgesendet werden. Dazu fragst du alle möglichen "Termine" aus deiner DB ab, wenn ein Checkbox-Value zurückgeliefert wurde, dann schreibst du 1 in die DB, ansonsten 0. (Punkt, Fertig) Das was du erreichen willst, ist genau, dass du den neuen Status aus x 0 x x 0 x 0 0 für die getätigten Änderungen speichern willst. Da interessiert es eigentlich nicht, was vorher gespeichert war, denn diesen Zustand bietest du ja als HTML-Ausgabe dem Besucher zum Kreuzeln an.

            Du brauchst also nur eine Verbindung zwischen dem "Termin" in der DB und der Benennung des Checkbox-Inputs herstellen.

            Ciao, Frank

  2. echo $begrüßung;

    Nun gibt es DREI Zustände der Checkboxen, die mit Einträgen in der Datenbank korrespondieren:

    • NICHT angemeldet (kann angemeldet werden),
      <input type='checkbox' name='chkbox[]' value='123'>
    • angemeldet (kann abgemeldet werden),
      <input type='checkbox' name='chkbox[]' value='456' checked>

    Wenn eine Checkbox nicht markiert ist, zählt sie nicht zu den Successful controls und wird nicht mit vom Browser gesendet.

    Dein Script muss die verwendeten name- oder value-Werte der Checkboxen kennen und beim Nichtvorhandensein eine unangekreuzte Checkbox erkennen.

    • Anmeldung bereits gebucht und gegen Änderung gesperrt:
      <input type='checkbox' name='chkbox[]' value='789' checked disabled>

    Siehe obigen Link. Formularelemente, die disabled sind, werden nicht übertragen. Das wirkt sich dann so aus, als ob sie nicht markiert wären.
    Hier wäre die Verwendung des Attributes readonly angebrachter.

    echo "$verabschiedung $name";