Übergabe eines arrays mittels Formular
effemmess
- php
0 Matthias Fleischer0 Chris0 Chris
0 effemmess
Hi,
ich möchte erreichen, daß bei fehlerhaftem Ausfüllen eines Formulars dasselbe Formular nocheinmal angezeigt wird. Das Problem liegt darin, daß der Inhalt der Mehrfachauswahlbox anschließend nicht mehr vollständig ist. Die Daten der Box liegen in einem array. M.E. muß ich dieses (Original-)array mit übergeben?.? Kann mir jemand helfen???
<?php
$root_path = (eregi("/plugins/", $PHP_SELF)) ? "./../../" : "./../";
define('ROOT_PATH', $root_path);
require(ROOT_PATH.'admin/admin_global.php');
if ($action == "") {
$entrys = array();
for($i=0;$i<10;$i++) {
$entrys[$i]="track".$i;
}
$table_select = "<select name="entrys0[]" size="15" multiple>\n";
for($i=0;$i<count($entrys);$i++) {
$table_select .= "<option value"".$entrys[$i].""";
$table_select .= " selected";
$table_select .= ">".$entrys[$i]."huhu"."</option>\n";
}
$table_select .= "</select>\n";
$table_select .= "<input type="hidden" name="entrys[]" >\n";
}
if ($action == "test") {
printf(count($entrys)."<br/>");
printf(count($entrys0)."<br/>");
for($i=0;$i<count($entrys);$i++) {
printf("Entry".$i.": ".$entrys[$i]."<br/>");
}
}
show_form_header($PHP_SELF, "test");
show_table_header("Dateiauswahl", 2);
echo $table_select;
show_form_footer($lang['submit'], $lang['reset'], 2);
?>
Danke und Gruß!
Um das erstmal klar zu kriegen:
Ich vermute, Du möchtest die gleiche Selectbox mit der gleichen Vorauswahl wieder anzeigen?
Nunja, zunächstmal werden nur die Werte als Array übergeben, die auch ausgewählt wurden. Nehmen wir also an, jemand kann dort die Wochentage wählen und klickt Mo, Di, und Do. an. Dann werden als Array die Werte für diese 3 Tage übergeben.
Willst Du also die gleiche Auswahl nochmal anzeigen, mußt Du alle Optionen nochmal ausgeben und prüfen, welche auch in dem übergebenen Array enthalten waren:
Beispielfunktion:
function select_wochentage($name, $wochentage, $selected = Array())
{
$output = "\n<SELECT NAME="".$name."[]" MULTIPLE="multiple" SIZE="7">";
for ($i = 0; $i < @sizeof($wochentage); $i++)
{
$output .= "\n<OPTION VALUE="$i"";
if (@in_array($i, $selected))
{
$output .= " SELECTED="SELECTED"";
}
$output .= ">".$wochentage[$i]."</OPTION>";
}
$output .= "\n</SELECT>";
return($output);
}
Ok, ich geb zu: das mit den Wochentagen war mehr als ein beliebiges Beispiel, denn das Problem hatte ich schonmal *g*
P.S.: Da ich da eben nochmal on-the-fly dran editiert hab, übernehm ich keine Verantwortung für kleiner Tippfehler ;)
Hallo,
ich möchte erreichen, daß bei fehlerhaftem Ausfüllen eines Formulars dasselbe Formular nocheinmal angezeigt wird. Das Problem liegt darin, daß der Inhalt der Mehrfachauswahlbox anschließend nicht mehr vollständig ist. Die Daten der Box liegen in einem array. M.E. muß ich dieses (Original-)array mit übergeben?.? Kann mir jemand helfen???
Ich wills mal versuchen:
Werde Dir als erstes über die unterschiedlichen Darstellungsformen der Daten (Parameter) in ihren unterschiedlichen Stationen klar.
Der Browser erwartet für die Darstellung der Datenfelder
<input ...> Anweisungen
<select ...> Anweisungen
<textarea ...> Anweisung
HTML kennt keine Variablen.
Also musst Du die anzuzeigenden Daten in ausgerechneter Form, also im Klartext, übergeben. Der Rückweg der Daten geht dann über Toupel (Paare aus Namen und Wert). Bei Multiple-Select-Feldern ist man bei Verarbeitung der daten mit PHP dazu gezwungen, den Namen als Array vorzubestimmen. Anderenfalls überschreibt der nächste Wert seinen Vorgänger.
Das sieht dann so aus:
<select multiple name="sel_feld1[]">
...
<option selected value="3">drei</option>
...
</select>
Bei welcher Option Du selected hinzufügen musst, musst Du bei der Generierung der Option-Zeilen feststellen. Das Beste ist, sich eine Funktion zu erstellen, die die Option-Zeilen erzeugt:
$name = Name des Select-Objektes
$presetlist = Array mit den zur Auswahl stehenden Werten
die könnten auch aus einem Query stammen
$selectlist = Array mit den ausgewählten Werten
function optionlist($name, $presetlist, $selectlist)
{
if (!is_array($presetlist)) // foreach verträgt nur Arrays
{
return false;
}
echo "\n<select multiple $name"."[]>";
$optionlist="";
foreach($presetlist as $pre)
{
$selected="";
if(in_array($pre,$selectlist))
{
$selected = " selected ";
}
echo "\n <option $selected value="$pre">$pre</option>";
}
echo "</select">
}
So ungefähr müsste es klappen. Weitere Variationen mit $lines, $style, $nochoice, etc sind denkbar.
Bis denne
Chris
Hallo,
ich möchte erreichen, daß bei fehlerhaftem Ausfüllen eines Formulars dasselbe Formular nocheinmal angezeigt wird. Das Problem liegt darin, daß der Inhalt der Mehrfachauswahlbox anschließend nicht mehr vollständig ist. Die Daten der Box liegen in einem array. M.E. muß ich dieses (Original-)array mit übergeben?.? Kann mir jemand helfen???
Ich wills mal versuchen:
Werde Dir als erstes über die unterschiedlichen Darstellungsformen der Daten (Parameter) in ihren unterschiedlichen Stationen klar.
Der Browser erwartet für die Darstellung der Datenfelder
<input ...> Anweisungen
- text (und seine Brüder)
- radio entspricht select single
- checkbox entspricht select multiple
- file
<select ...> Anweisungen
- single
- multiple
<textarea ...> Anweisung
HTML kennt keine Variablen.
Also musst Du die anzuzeigenden Daten in ausgerechneter Form, also im Klartext, übergeben. Der Rückweg der Daten geht dann über Toupel (Paare aus Namen und Wert). Bei Multiple-Select-Feldern ist man bei Verarbeitung der daten mit PHP dazu gezwungen, den Namen als Array vorzubestimmen. Anderenfalls überschreibt der nächste Wert seinen Vorgänger.Das sieht dann so aus:
<select multiple name="sel_feld1[]">
...
<option selected value="3">drei</option>
...
</select>Bei welcher Option Du selected hinzufügen musst, musst Du bei der Generierung der Option-Zeilen feststellen. Das Beste ist, sich eine Funktion zu erstellen, die die Option-Zeilen erzeugt:
$name = Name des Select-Objektes
$presetlist = Array mit den zur Auswahl stehenden Werten
die könnten auch aus einem Query stammen
$selectlist = Array mit den ausgewählten Wertenfunction optionlist($name, $presetlist, $selectlist)
{
if (!is_array($presetlist)) // foreach verträgt nur Arrays
{
return false;
}
// hier steckt noch ein Fehler:
echo "\n<select multiple name="$name"."[]">";
$optionlist="";
foreach($presetlist as $pre)
{
$selected="";
if(in_array($pre,$selectlist))
{
$selected = " selected ";
}
echo "\n <option $selected value="$pre">$pre</option>";
}echo "</select">
}So ungefähr müsste es klappen. Weitere Variationen mit $lines, $style, $nochoice, etc sind denkbar.
Bis denne
Chris
Hallo,
erstmal Dank an euch beide...
Das mit den Funktionen ist natürlich super und werd ich dann auch damit machen. Das eigentliche Problem liegt aber darin, das ursprüngliche array ($wochentage bzw. $presetlist) mit zu übergeben. $presetlist ist schon Ergebnis aufwändiger Berechnungen, die ich ungern nach einem submit alle nochmal ausführen lassen möchte. Ich hatte da an type="hidden" gedacht. Aber folgende Zeile funktioniert leider nicht:
input type="hidden" name="$presetlist" value=$presetlist();
Allerdings scheint es mit einer etwas aufwändigeren Methode zu klappen:
...
$table_select = "<select name="selectedlist[]" size="15" multiple>\n";
for($i=0;$i<count($entrys);$i++) {
$table_select .= "<option value"".$entrys[$i].""";
$table_select .= " selected";
$table_select .= ">".$entrys[$i]."</option>\n";
}
$table_select .= "</select>\n";
//ab hier
for($i=0;$i<count($entrys);$i++) {
$table_select .= "<input type="hidden" name="presetlist[]" value=".$entrys[$i].">\n";
}
...
Auf jeden Fall stehen tatsächlich anschließend in _POST["selectedlist"] und in _POST["presetlist"] die entsprechenden arrays drin.
Falls noch jemand eine bessere Idee hat - bitte melden.
Gruß