Hallo icho40,
ich lerne noch
Nur HTML/CSS? Oder auch PHP?
Ich hab die Dateien von hier selfhtml.org und einfach per try&error gelöscht, was ich nicht brauche.
Das ist Nr. 1 unserer fertigen Designs, das bereits mit Grid-Layout arbeitet. Und das ruinierst Du mit Layout-Tabellen? Oh je. Was Grid-Layout ist, findest Du im Selfhtml-Wiki erklärt, aber wenn Du noch gar keine Ahnung von CSS hast, dann solltest Du diese Grundkenntnisse schnell erlernen.
Wie auch immer.
Das sehe ich jetzt erst: deine Checkboxliste ist zweidimensional.
Heißt: dieses hidden input
<input type="hidden" name="wochentag" value="'. $value . '">
nützt dir nichts, weil Du ja 5 Zeilen mit Checkboxen erzeugst, für jeden Wochentag eine. Und wenn Du fünfmal ein hidden input mit Name "wochentag" hast, dann kannst Du auch name="wochentag[]"
verwenden und es hilft nichts. Denn für die Checkboxen weißt Du immer noch nicht, zu welchem Tag sie gehören.
D.h. für die Antwort ans PHP muss außer dem Gericht auch der Wochentag rein. Das kannst Du auf zwei Arten machen.
(a) Mache aus result ein zweidimensionales Array. Du findest in $_POST['result'] dann ein Array mit bis zu 5 Einträgen, deren Key der Wochentag ist, und jeder dieser Einträge ist ein Array mit den für diesen Tag ausgewählten Gerichten. Ich DENKE, dass das fachlich am sinnvollsten ist.
Aber vielleicht siehst Du das ja anders.
(b) Bleibe bei einem eindimensionalen Array und verwende als Value eine Kombination aus Wochentag und Gericht, so dass in result dann Werte wie "Montag-Suppe", "Dienstag-Bistro" stehen. Die musst Du dann wieder auseinandernehmen (-> explode) und auf die Wochentage verteilen, um die Bestellung zu bekommen. Ich GLAUBE, dass das ungeschickter ist.
Die Lösung liegt in beiden Fällen bei dem input für die Checkbox. Um mal bei deinem Coding-Style zu bleiben:
Variante a:
echo '<input type="checkbox" name="result[' . $wochentag . '][]" value="'. $value . '">';
Variante b:
echo '<input type="checkbox" name="result[]" value="'. $wochentag . '-' . $value . '">';
Das mit dem Coding-Style geht allerdings besser. Die erste Optimierung wäre, das input-Element in doppelte Anführungszeichen zu setzen und dafür die HTML Attribute mit einfachen Anführungszeichen zu versehen. Dann kannst Du String-Interpolation verwenden (hier im PHP-Handbuch). Das heißt, dass PHP im String Variablen ersetzt, wenn der in doppelten Anführungszeichen steht:
echo "<input type='checkbox' name='result[]' value='$wochentag-$value'>";
Das sieht doch cooler aus, oder?
Aber guter Stil ist eigentlich anders. Man muss HTML nicht per ECHO ausgeben. Wenn Du einen guten Code-Editor hast, der HTML-Elemente mit Syntaxfarben versehen kann, machen diese Echos alles kaputt. Besser ist, für einen Moment aus PHP auszusteigen. Um dann nicht die Übersicht bei dem foreach zu verlieren, verwendet man dann die sogenannte Alternative Syntax. Die sieht so aus:
foreach ($array as $wert):
// schleifeninhalt
endforech;
Und weil dein Wochentage-Array mit Keys aufgebaut ist, die Du bestimmt statt der Langnamen zum Server schicken willst, verwendest Du dafür die Foreach-Variante mit $key = $value. Die Initialisierung des $menue-Arrays ziehst Du vor die Schleife, die brauchst Du nur einmal. Und das hidden input für die Wochentage brauchst Du gar nicht.
$menue = array("Suppe","Dessert","Bistro","Classic","Wahl","Wellness");
foreach($wochentag as $tag => $wochentag):
?>
<?= $wochentag ?><br>
Gericht:
<?php
foreach($menue as $gericht):
?>
<label>
<?= $gericht ?>
<input type="checkbox" name="result[<?= $tag ?>][]" value="<?= $gericht ?>">
</label>
<?php
endforeach;
?>
<br>
<?php
endforeach;
// Weiteres PHP
Hinter dem ersten foreach beendest Du mit ?> den PHP-Modus, d.h. jetzt bist Du wieder im HTML Modus. Um den Wochentag auszugeben, musst Du aber an eine PHP-Variable heran. Dafür verwendet man das "Kurze Echo" <?= ... ?>
, was im Prinzip das Gleiche ist wie <?php echo ...; ?>
. Nur kürzer.
Für die innere Schleife steigst Du ins PHP ein und gleich wieder aus. Das <label> Element ist Teil der inneren Schleife. Den Namen des Gerichts holst Du mit <?= $gericht ?> (ich habe das $value hinter dem as
mal sinnvoller benannt) und schreibst die Checkbox dahinter. Das, was da aufgebaut wird, ist die Variante a von oben, d.h. das result-Array wird zweidimensional. Ich weiß allerdings nicht, ob die Wochentag-Kürzel in Hochkommas stehen müssen, damit PHP das versteht. Möglicherweise gibt das komische Meldungen und Du musst name="result['<?= $tag ?>'][]"
verwenden.
Das ganze HTML geht eigentlich noch viel schöner, aber ich will Dich nicht noch mehr überfordern 😉. Und die Labels brauchen eigentlich ein for-Attribut, das auf das id-Attribut des input-Elements verweist. Dafür musst Du aber ID-Management betreiben, weil natürlich pro Checkbox eine eigene ID nötig ist, deshalb schachtele ich einfach das input ins Label. Das ist semantisch ok, leider kommen nicht alle Screenreader damit klar. Aber Du sprachst ja von Privatgebrauch im lokalen Netz. Sobald Du damit ins Internet gehst und ggf. Nutzer bekommst, die sich das vorlesen lassen wollen oder müssen, melde Dich nochmal für bessere Zugänglichkeit.
Rolf
sumpsi - posui - obstruxi