• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[GELÖST] Checkbox in Cookie speichern in foreach Schleife?

nixeifoit

New member
Hallo zusammen,

ich möchte gerne den "Checkbox-Status" merken lassen um bei einem "Refresh" der Seite diesen nicht zu verlieren.

Hierzu habe ich auf Github einen "tollen" Javascript Code gefunden, welcher auch funktioniert: https://gist.github.com/draft13/6298036

Leider wird der Status nur von "einer Checkbox" gespeichert. Da es sich aber beim Aufbau um eine foreach Schleife handelt, benötige ich Eure Hilfe / Unterstützung das ganze anzupassen, um für alle Checkboxen die erscheinen, den Status getrennt voneinander sichern zu können.

Hier auch noch der PHP Code:

PHP:
				<?php
					foreach ($verzeichnisse as $v) {
						if ($v != "Tisch-20" && $v != "Tisch-21" && $v != "Tisch-15" && $v != "Tisch-23" && $v != "Tisch-24" && $v != "Tisch-25" && $v != "Tisch-26" && $v != "Tisch-27" && $v != "Tisch-28" && $v != "Tisch-29" && $v != "Tisch-30") {
							//Spielstand Datei
							$file = "daten/$v/stand.txt";							
							$spielstand = implode ("", file ($file));
							$spielstaende = explode (";", $spielstand);
							$s1s= ltrim($spielstaende[2],"0");
							$s2s = ltrim($spielstaende[4],"0");
							$status = $spielstaende[10];
							$status = is_numeric($status) ? $status : 3;
							$runden = $spielstaende[11];
							$runden = is_numeric($runden) ? $runden : 0;
							echo "<tr>\n";
							echo "	<td bgcolor=\"#70158c\"> </td>\n";
							echo "	<td align=\"center\" class=\"staende\">\n";
							echo "	$v\n";
							echo "	</td>\n";
							echo "	<td><img src=\"css/$status.png\" alt=\"Tisch\" /></td>\n";
							//Spieler Datei
							$spielfile = "daten/$v/stand.txt";
							$spieler = implode ("", file ($spielfile));
							$spielerdata = explode (";", $spieler);
							$s1 = ltrim($spielerdata[1],"0");
							$s2 = ltrim($spielerdata[3],"0");
							$zeit = ltrim($spielerdata[9],"00:00:00");
							$s1_form = str_replace(" ","-",$s1);
							$s2_form = str_replace(" ","-",$s2);
							
							if ($s1s == "") $s1s = "0";
							if ($s2s == "") $s2s = "0";              
							?>
							<td class="staende">
  <input class="runden" name="Runden_
    <?php echo $v; ?>" type="text" value="
    <?php echo $runden; ?>" maxlength="3" size="3">
  </td>
  <td></td>
  <td>
    <a href="#" title="
      <?php echo $v; ?> = RACE-TO setzen und RESET" onClick="if (!confirm('Soll der Rundenstand an 
      <?php echo $v; ?> und Stand zurückgesetzt werden?')) return false; document.getElementById('do').value='setrunde';document.getElementById('do_tisch').value='
      <?php echo $v; ?>'; document.form1.submit();">
      <img src="css/reset.png" alt="Runden Speichern" />
    </a>
    <!-- 
                            <a href="tische-internet-admin4.php?do=reset&tisch=
    <?php echo $v; ?>" title="
    <?php echo $v; ?> Reset" onclick="if (!confirm('Soll der 
    <?php echo $v; ?> wirklich zurückgesetzt werden?')) return false;"><img src="css/reset.png" alt="Tisch zurücksetzen" /></a>-->
  </td>
  <td>
    <input type="checkbox" id="checkbox" onchange="set_check();">
    </td>

Ich danke Euch für die Hilfe, und wünsche Euch noch einen schönen Samstag Abend.
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

Vielen Dank für Deine Antwort und Nachfrage.

Ich habe den Code (nachfolgend) aus Github genommen, und habe die ID von linksNewWindow auf checkbox geändert.

PHP:
<script type="text/javascript">
  function setCookie(c_name,value,expiredays) {
        var exdate=new Date()
        exdate.setDate(exdate.getDate()+expiredays)
        document.cookie=c_name+ "=" +escape(value)+((expiredays==null) ? "" : ";expires="+exdate)
    }

    function getCookie(c_name) {
        if (document.cookie.length>0) {
            c_start=document.cookie.indexOf(c_name + "=")
            if (c_start!=-1) { 
                c_start=c_start + c_name.length+1 
                c_end=document.cookie.indexOf(";",c_start)
                if (c_end==-1) c_end=document.cookie.length
                    return unescape(document.cookie.substring(c_start,c_end))
            } 
      }
        return null
    }
onload=function(){
document.getElementById('linksNewWindow').checked = getCookie('linksNewWindow')==1? true : false;
}
function set_check(){
setCookie('linksNewWindow', document.getElementById('linksNewWindow').checked? 1 : 0, 100);
}
</script>

Nachfolgend habe ich den "letzten Part" der PHP Foreach Schleife mit folgender Tabellen-Reihe ergänzt:

PHP:
  <td>
    <input type="checkbox" id="checkbox" onchange="set_check();"> </td>

Mein konkretes Problem:

Der Script funktioniert und auch in der ersten "erscheinende" Checkbox in der Tabelle wird der Status gespeichert.

Jedoch die restlichen anderen nicht. Die Tabelle wird "je nach dem" erweitert, welche Tische ich angezeigt bekommen möchte, bzw. Wo Ordner vorhanden sind.

Ich hoffe es ist ein wenig verständlicher.

Ich kann Dir / Euch auch gerne eine Test-ZIP der Daten hochladen (Nachträglich hinzugefügt!). Es handelt sich nur um ein lokales System, welches für Hobbyturniere verwendet wird, wo die Checkbox nur eine einzige Aufgabe haben soll: Wenn eine Begegnung fertig ist, und der Verantwortliche diese in den Excel Raster eingegeben hat, sollte dieser je Tisch eine Markierung setzen, damit er sieht, dass dieser Tisch bereits im Raster eingegeben wurde und erledigt ist, jedoch ist der Status ohne dieser Cookie-Funktion nach einem Refresh der Seite weg und somit ein wenig "unpraktikabel".

Oder gibt es andere, bessere Möglichkeiten? Wenn ja, welche bitte - ich befinde mich erst in der "Lernphase" von PHP/Javascript und habe nur CSS und HTML Kenntnise bis jetzt.

Vielen Dank und LG
 

Anhänge

  • daten.zip
    9,8 KB · Aufrufe: 1
Zuletzt bearbeitet:
Ich habe den Code (nachfolgend) aus Github genommen, und habe die ID von linksNewWindow auf checkbox geändert.
Mit document.getElementById('linksNewWindow') greifst du aber weiterhin auf das Element mit der ID linksNewWindow zu. Das musst du dann dort auch schon anpassen. checkbox finde ich als ID aber nicht praktikabel...
 
Welche Rolle spielt denn PHP bei deinem Projekt?
Wäre es nicht besser das als Formular (mit Aktualisierungsbutton) zu machen und die Daten dann via PHP richtig zu speichern? Dann kannst du die bei deiner PHP-Ausgabe direkt mit einbeziehen und brauchst das JavaScript/Cookie nicht. Mal davon abgesehen, wenn jemand die Cookies löscht, dann sind alle Daten weg.

ps. das ZIP hab ich mir noch nicht angeschaut...
 
Hallo,

vielen Dank für Deine Bemühungen und Antwort.

PHP verwende ich um Daten aus einer txt Datei auszulesen, und diese auch wieder teilweise "zurück zu schreiben"!

Das mit dem zusätzlichen "Speichern-Button" für die Checkboxes habe ich bereits auch überlegt, wobei mir eben die "Cookie" Lösung simpler vorkam, da diese auf dem verwendeten Rechner nicht "manuell / automatisch" gelöscht werden.

LG
 
Der Script funktioniert und auch in der ersten "erscheinende" Checkbox in der Tabelle wird der Status gespeichert.
Das wird dann daran liegen, das du in deiner foreach immer eine Checkbox mit der selben ID einfügst <td><input type="checkbox" id="checkbox" onchange="set_check();"></td>. Eine ID muss aber eindeutig sein!
 
Ich würde den Checkboxen ja einfach eine gemeinsame Klasse geben und dann mittels document.getElementsByClassName() darüber iterieren. Natürlich brauchst du dann für jede Checkbox auch noch ein separates Cookie - also wäre eine eindeutige ID auch hilfreich.
 
Hallo Ihr beiden!

Vielen Dank für Eure Antworten!

Ich versuche derzeit selbst, die Lösung zu fertigen.

Dauert bei mir immer einige Zeit - ich möchte ja verstehen, was ich an Code produziere und wie dieser funktioniert.

Bis dato konnte ich das Problem noch nicht lösen!

LG
 
Woran scheitert es denn?

Ich würde spontan das Array $verzeichnisse ganz am Anfang befüllen, mindestens vor deinem JavaScript-Block:
PHP:
<?php

$Pfad="./daten/";
$verzeichnisse = array();

if($Verzeichniszeiger=opendir($Pfad)) 
{
    //Filesystem sequentiell auslesen
    while($Datei=readdir($Verzeichniszeiger))
    {
        //unötige Verzeichnisse entfernen
        if ($Datei!="." && $Datei!=".." && $Datei!="undefined")
        {
            //Wenn es sich um eine Verzeichnis handelt
            if(is_dir($Pfad.$Datei))
            {
                array_push($verzeichnisse, $Datei);
            }
        }
    }
    closedir($Verzeichniszeiger);
    // Sortieren des Arrays
    natsort ($verzeichnisse);
    //Ausgabe der Verzeichnisse				
}  
?>

In deiner foreach hast du ja dann deine $v-Variable, die könntest doch für deine eindeutige ID verwenden: <?php echo "<td><input type=\"checkbox\" id=\"checkbox_" . $v . "\" onchange=\"set_check('checkbox_" . $v . "');\"></td>\n"; ?>

Und vorher im JavaScript-Block die Funktion mit Parameter anpassen und die foreach nochmals durchrattern:
Code:
function set_check(elementId){
    setCookie(elementId, document.getElementById(elementId).checked? 1 : 0, 100);
}
PHP:
onload=function(){
<php
foreach ($verzeichnisse as $v) {
    echo "    document.getElementById('checkbox_" . $v . "').checked = getCookie('checkbox_" . $v . "'')==1? true : false;";
}
?>
}


Alles ungetestet... xD
 
Zuletzt bearbeitet:
Hallo,

WOW - ich bin überwältigt.

Vielen Dank für Deine Anpassungen - ich werde diese heute "analysieren" und mir auch gleich Notizen dazu machen und morgen das ganze testen / einbauen.

Ich melde mich dann.

LG
 
Hallo zusammen,

ich habe es nun hinbekommen.

Ich musste der foreach schleife noch etwas hinzu geben und den Refresh Button mit window.location.reload() ersetzen.

Das einzige was nun nicht mehr gemacht werden darf, ist ein direkter "Neuaufruf" der Seite und die Verwendung von STRG + F5, dann verschwindet alles! (Was auch klar ist!!)

Wenn Ihr die Code-Schnipsel möchtet, kann ich diese gerne noch hier hinzufügen.

Vielen Dank für Eure Zeit und Unterstützung.

LG
 
Zurück
Oben