QuoteFor a <select> element without the multiple attribute there will be one input object of type of "option". For a <select multiple> element there will be one input object for each contained <option> element. Each one of these option objects will have the same name.
1 2 3 4 5 6 7
$tmp->{formref}->push_input( ('hidden'), { name => 'honeypot', value => 'erwischt', } );
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
->push_input( ('select'), { name => 'seltestxxxxx', value => 'ausw1', }, { name => 'seltestxxxxx', value => 'ausw2', selected => 'selected', }, { name => 'seltestxxxxx', value => 'ausw3', }, );
QuoteAH01215: Unknown input type 'select' at xxx.pl line 0815...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
->push_input( ('option'), { name => 'seltestxxxxx', value => 'ausw1', }, { name => 'seltestxxxxx', value => 'ausw2', selected => 'selected', }, { name => 'seltestxxxxx', value => 'ausw3', }, );
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; use HTML::Form; local $Data::Dumper::Purity = 1; local $Data::Dumper::Useqq = 1; local $Data::Dumper::Deparse = 1; local $Data::Dumper::Sortkeys = sub { my ($hash) = @_; return [(sort {lc $a cmp lc $b} keys %$hash)]; }; use 5.010; my $html = <<HTMLHEREDOC <html> <head></head> <body> <div>Ausgabe:</div> <form action="http://www.perl-community.de" method="post"> <select name="fname"> <option value="wert1">Anzeige1</option> <option value="wert2">Anzeige2</option> <option value="wert3">Anzeige3</option> <option value="wert4" selected>Anzeige4</option> <option value="wert5">Anzeige5</option> </select> </form> </body> HTMLHEREDOC ; my @forms = HTML::Form->parse($html,'http://www.perl-community.de'); say Dumper(\@forms); my %tmp = ( name => 'selname', menu => [ { name => 'Zusanzeige1', value => 'zuswert1' }, { name => 'Zusanzeige2', value => 'zuswert2' }, { name => 'Zusanzeige3', value => 'zuswert3' }, ], ); $forms[0]->push_input('option',{%tmp}); say Dumper(\@forms);
2023-07-22T10:57:27 GwenDragonIch nehme an menu ist HTML5 und nicht HTML 4. ;-)
Da wird HTML::Form das nicht kennen.
1 2 3 4 5 6 7 8 9
... my %tmp = ( name => 'selname', select => [ { name => 'Zusanzeige1', value => 'zuswert1' }, ...
2023-07-22T10:57:27 GwenDragonIch nehme an menu ist HTML5 und nicht HTML 4. ;-)
Da wird HTML::Form das nicht kennen.
2023-07-22T14:04:35 hajDas sieht wie ein Anwendungsfall von WWW::Mechanize aus. Das ist eine Erweiterung von LWP::UserAgent, ergänzt um Schnittstellen zur Formularbearbeitung: Da gibt es (unter anderem) Methoden set_fields und submit_form
2023-07-22T14:04:35 hajDein Code sah für mich allerdings so aus, als wolltest Du ein neues Feld selname in ein Formular hineinfrickeln, das dieses Feld gar nicht hat? Das gibt das Modul nicht her, da müsstest Du den Request selbst aufbauen.
2023-07-22T14:12:58 bianca2023-07-22T14:04:35 hajDein Code sah für mich allerdings so aus, als wolltest Du ein neues Feld selname in ein Formular hineinfrickeln, das dieses Feld gar nicht hat? Das gibt das Modul nicht her, da müsstest Du den Request selbst aufbauen.
Nicht frickeln. Ich wollte gern Felder in Formularen hinzufügen und das Formular dann absenden. Klappt mit <input> "hidden" und "text" wunderbar. Und laut Doku kann das Modul auch <select>. Aber wenn du im Quellcode nachgeschaut hast ist wohl die Doku falsch.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
#!/usr/bin/perl use strict; use warnings; use Data::Dump 'dump'; use HTML::Form; use 5.010; my $html = <<HTMLHEREDOC <html> <head></head> <body> <div>Ausgabe:</div> <form action="http://www.perl-community.de" method="post"> <select name="fname"> <option value="wert1">Anzeige1</option> <option value="wert2">Anzeige2</option> <option value="wert3">Anzeige3</option> <option value="wert4" selected>Anzeige4</option> <option value="wert5">Anzeige5</option> </select> </form> </body> HTMLHEREDOC ; my @forms = HTML::Form->parse($html,'http://www.perl-community.de'); say dump $forms[0]->click; my %tmp = ( name => 'selname', menu => [ { name => 'Zusanzeige1', value => 'zuswert1' }, { name => 'Zusanzeige2', value => 'zuswert2' }, { name => 'Zusanzeige3', value => 'zuswert3' }, ], value_name => 'Zusanzeige1', value => 'zuswert1', checked => 1, ); $forms[0]->push_input('option',{%tmp}); say dump $forms[0]->click;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bless({
_content => "fname=wert4",
_headers => bless({
"content-length" => 11,
"content-type" => "application/x-www-form-urlencoded",
}, "HTTP::Headers"),
_method => "POST",
_uri => bless(do{\(my $o = "http://www.perl-community.de")}, "URI::http"),
}, "HTTP::Request")
bless({
_content => "fname=wert4&selname=zuswert1",
_headers => bless({
"content-length" => 28,
"content-type" => "application/x-www-form-urlencoded",
}, "HTTP::Headers"),
_method => "POST",
_uri => bless(do{\(my $o = "http://www.perl-community.de")}, "URI::http"),
}, "HTTP::Request")
2023-07-22T16:16:44 hajBedanke mich sehr für die Hilfe!Das Modul kann's also irgendwie... und ich habe auch rausgefunden, wie.
2023-07-22T16:16:44 hajJa da muss man/Frau erst mal drauf kommen. Völlig richtig! Ich war so in dem ich-muss-alles-genau-nachbauen-Tunnel, dass ich das völlig aus den Augen verloren habe, was da eigentlich läuft :-()Einerseits: Für Deinen Anwendungsfall verstehe ich nicht, wofür Du die Alternativen im menu brauchst. An den Server wird der Typ select nicht geschickt, der bekommt nur die Name=Wert-Paare für die Optionen, die ausgewählt wurden, und es ist völlig egal, welche Optionen es sonst noch gegeben hätte.
2023-07-22T16:16:44 hajWieder was gelernt!Ich habe hier Data::Dump anstelle des Data::Dumper verwendet, der liefert einfach viel kompakteren Output
color=red;color=blue;color=yellow;age=77;name=Dig;city=NY
2023-07-22T17:50:29 rostiAlso wenn es um das Absenden mit libwww geht, da brauchst Du ja nur name=value Paare. Mit dem Enctype="application/x-www-form-urlencoded"