checkboxen und .cgifields
|
Seitenanfang |
| Guten Morgen. Ich generiere mit Perl und CGI ein Formular, manchmal ist es nur für einen Artikel und manchmal auch für mehrere. In diesem Formular kann man dann verschiedene standalone Checkboxen anklicken, die sich für jeden Artikel wiederholen, als Bezeichung tragen sie jedoch eindeutige Namen z.B. (Artikel1|Bez1) (Artikel2|Bez1). Beim Start des Formulares sind einige Checkboxen vorselektiert, wenn man diese jedoch wegklickt übernehmen sie, beim abschicken, den Wert der Checkbox des vorherigen Artikels. Wenn alle gleichen Checkboxen selektiert werden funktioniert alles problem und wenn ich alle deselektiere genauso, ich hoffe ich hab mich verständlich ausgedrückt. Ausserdem finde ich im Quelltext des generierten Forumlares für jede Checkbox ein Hidden Feld welches als Namen ".cgifields" und als Wert den namen einer Checkbox hat. Ich benutze CGI Version 3.29. Vielleicht hat ja jemand einen Tipp für mich. Gruss Christian
Datum: 15.06.2007-09:27

|
re: checkboxen und .cgifields
|
Seitenanfang |
| Was verstehst Du unter "alle gleichen Checkboxen"? Kannst Du mal ein paar Zeilen des Codes posten und den entscheidenden Ausschnitt aus dem HTML-Quelltext? P.S.: Generell finde ich die Verwendung einer Template-Engine (z.B. HTML::Template bzw. HTML::Template::Compiled) sauberer als das Formular mit CGI.pm zu erzeugen.
Datum: 15.06.2007-11:20

|
re: checkboxen und .cgifields
|
Seitenanfang |
| Hi, ich poste mal eine stark verkürzte Version der Subroutine die das Formular erzeugt. sub select_articles { my @barcode = split(/\n/,param("barcode")); my $picture; my $gallery; my $seite; $seite .= start_form(-action => url()); $seite .= hidden(-name => "cmd", -value => "sell_articles", -override => 1); $seite .= hidden(-name => "barcodes", -value => param("barcode"), -override => 1); $seite .= "<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n<tr>\n<td>\n"; foreach (@barcode) { my @article = $dbh->selectrow_array("SELECT * FROM database WHERE id = '".$_."'"); $article[9] =~ s/\/srv\/www\/htdocs//; if ($article[9] ne "") { $picture .= td({-style => "padding:3px;"},img({-src => $article[9], -width => 100})); $gallery .= td({-style => "padding:3px;"}, checkbox(-name => "$_|gallery|pic1", -label => "Gallery", -checked => 1)); } # Es folgen noch weitere Bilder die man für diesen Artikel auswählen kann. # Genauso beim nächsten Artikel. # Wenn ich jetzt beim zweiten Artikel diese Checkbox deselektiere # bekommt sie den Wert vom ersten Artikel. $picture = undef; $gallery = undef; } $seite .= "</td>\n</tr>"; $seite .= Tr( td({-style => "padding:3px;"}, submit(-name => "Submit", -value => "OK!", -class => "button"))); $seite .= "\n</table>\n"; $seite .= end_form(); print div({-style => "position:absolute;left:250px;margin-top:100px;"}, $seite); }
Der Quellcode zum generierten Formular, wieder start gekürzt. <table> <tr> <td style="padding:3px;"> <img src="/gem-pics/00000000371-01.JPG" width="100" /> </td> </tr> <tr> <td style="padding:3px;"> <label><input type="checkbox" name="00000000371|gallery|pic1" value="on" checked="checked" />Gallery</label> </td> </tr> </table> # es folgen weitere Informationen über den Artikel wobei man noch das ein oder andere auswählen kann <table> <tr> <td style="padding:3px;"> <img src="/gem-pics/00000000479-01.JPG" width="100" /> </td> </tr> <tr> <td style="padding:3px;"> <label><input type="checkbox" name="00000000479|gallery|pic1" value="on" checked="checked" />Gallery</label></td><td style="padding:3px;"><label><input type="checkbox" name="00000000479|gallery|pic2" value="on" />Gallery</label> </td> </tr> </table> <div> <input type="hidden" name=".cgifields" value="00000000479|gallery|pic1" /> <input type="hidden" name=".cgifields" value="00000000371|gallery|pic1" /> # hier gibt es noch viel mehr hidden felder, zu jeder checkbox im formular eins. # was sind das für felder und wozu sind sie gut? # in der doku zu cgi.pm hab ich nichts darüber gefunden </div> </form>
Ich hoffe man kann es noch verstehen und ich habe nicht zuviel gekürzt. Gruss Christian P.S.: Ich werd mir mal HTML::Template anschauen.
Datum: 15.06.2007-16:31

|
re: checkboxen und .cgifields
|
Seitenanfang |
Die Hidden-Felder '.submit' und '.cgifields' sind 'sticky fields', beim erneuten Erzeugen eines Formulars kann CGI dadurch die Formularfelder vorbelegen. Dieses Feature kann fuer das gesamte Script aber auch fuer einzelne Formularfelder abgeschaltet werden, die Option heiszt '-nosticky'.
use CGI qw(-nosticky); # global no sticky$cgi->checkbox(-name => 'my_checkbox', -nosticky => 1);
Datum: 15.06.2007-18:38

|
re: checkboxen und .cgifields
|
Seitenanfang |
Hallo, danke für die Antwort. Also ist das nicht die Ursache für mein Problem. Hat vielleicht jemand noch eine Idee?
Datum: 15.06.2007-19:10

|
re: checkboxen und .cgifields
|
Seitenanfang |
Lass mich sehen ob ich das Problem richtig verstanden habe. Auf einer Seite werden mehrere Artikel und zu jeden Artikel mehrere Bilder aus einer Galerie mit dazugehoeriger Checkbox angezeigt werden (eine Checkboxgruppe?).Durch anklickend der Checkboxen werden die Bilder den jeweiligen Artikeln zugeordnet/hinzugefuegt? Das Fehlverhalten ist aber dass nach dem Abschicken der Seite (bei jeder Checkboxgruppe?) die Werte der Checkboxen falschen Werte zugeordnet sind, sie haben die Werte der vorhergehenden Checkbox? Was ist dann mit der ersten Checkbox welchen Wert hat sie? Vor ihr sollten ja keine weitere kommen? Also so richtig begriffen hab ich's nicht. By the way:
my @article = $dbh->selectrow_array("SELECT * FROM database WHERE id = '".$_."'");
Hiermit waere ich vorsichtig an dieser Stelle sind SQL-Injections moeglich, d.h. durch $_ laesst sich SQL-Code einschleusen, es ist besser man verwendet Platzhalter oder mindestens den String vorher quoten.
Datum: 15.06.2007-20:18

|
re: checkboxen und .cgifields
|
Seitenanfang |
Hallo, ich versuchs nochmal.Im Parameter können mal mehr mal weniger Artikelnummern enthalten sein. Bei der Übergabe wird ein Formular generiert welches den Artikel nochmal anzeigt, Bilder zu den den einzelnen Artikeln sind schon hinterlegt, man kann dann durch eine Checkbox wählen welche Bilder benutzt werden sollen. Bei der Formulargenerierung wird bei jedem Artikel das erste Bild vorselektiert. Wenn ich mir jetzt 10 Artikel anzeigen lasse und die Artikel 2-9 deselektiere, bekommen Sie beim übermitteln den Wert vom ersten Artikel, Artikel 10 behält seinen Wert. Wenn ich bei Artikel 1 und 5 ein Häkchen setze haben die Artikel 2-4 den Wert von Artikel 1 und die Artikel 6-10 den Wert von bild 5. Wenn ich keinen deselektiere behält jedes seinen Wert und die Bilder stimmen bei jedem Artikel, genauso stimmt alles wenn ich alle deselektiere. Ist doch ziemlich kompliziert zu beschreiben was passiert :( Gruss Christian P.S.: Hab ich $_ nicht geqoutet? Wenn nicht, was ist dann quoten??
Datum: 15.06.2007-22:37

|
re: checkboxen und .cgifields
|
Seitenanfang |
| Das mit dem Quoten hat sich soeben geklärt, danke für den Hinweis.
Datum: 15.06.2007-22:51

|
re: checkboxen und .cgifields
|
Seitenanfang |
| Ha, darüber reden hilft und mir ist soeben mein Fehler aufgefallen. Ich habe den Wert der Checkbox in eine Variable gespeichert und wenn eine Checkbox nicht selektiert wurde, hat die Variable den Wert vom vorigen Artikel behalten. Trotzdem danke :) Gruss Christian
Datum: 15.06.2007-23:04

|
re: checkboxen und .cgifields
|
Seitenanfang |
| Gut dann brauch sich ja keiner weiter den Kopf zerbrechen :)
Datum: 16.06.2007-01:31

|