Thread HTML::Form ein <select> hinzufügen (19 answers)
Opened by bianca at 2023-07-21 12:04

haj
 2023-07-22 18:16
#195170 #195170
User since
2015-01-07
557 Artikel
BenutzerIn

user image
2023-07-22T14:12:58 bianca
2023-07-22T14:04:35 haj
Dein 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.


Dass CPAN:HTML::Form beim Parsen Deines HTML-Texts das select-Element samt seiner Alternativen rauszieht, hast Du ja bei Deinem Feld mit Namen fname gesehen. Das Modul kann's also irgendwie... und ich habe auch rausgefunden, wie.

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. Du solltest also das gleiche Ergebnis im Request erzielen, wenn Du den Input als text deklarierst.

Andererseits: Es geht, wenn Du für den ausgewählten Wert den Namen und den Wert angibst. Ich habe hier CPAN:Data::Dump anstelle des Data::Dumper verwendet, der liefert einfach viel kompakteren Output - und anstelle der Formulare das Request-Objekt, das HTML::Form erzeugt, ausgegeben. Bei select multiple musst Du für jeden ausgewählten Wert ein push_input abfeuern.

Code (perl): (dl )
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;


Ausgabe:
Code: (dl )
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")

View full thread HTML::Form ein <select> hinzufügen