perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 26
Click for quality!




10.02.2012 / 21:17

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  CGI: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


Beitragcheckboxen 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: checkboxen und .cgifields
Seitenanfang
Das mit dem Quoten hat sich soeben geklärt, danke für den Hinweis.

Datum: 15.06.2007-22:51

Beitragre: 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

Beitragre: checkboxen und .cgifields
Seitenanfang
Gut dann brauch sich ja keiner weiter den Kopf zerbrechen :)

Datum: 16.06.2007-01:31

-






-
-