Thread Select Liste ...: HTML::Template (14 answers)
Opened by BlackExe at 2007-07-07 03:19

Ronnie
 2007-07-07 12:26
#288 #288
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Ich empfehle die Verwendung von CPAN:HTML::Template::Compiled, sowie einer kleinen Helper Klasse:
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
#!/usr/bin/perl

use strict;
use warnings;

package Widget::Select;
use Moose;
use Data::Dumper;

has 'tuple'     =>  (is => 'rw'); # ID, Text, ...
has 'name'      =>  (is => 'rw');
has 'selection' =>  (is => 'rw');

sub set_tuple {
    my $self = shift;
    $self->{tuple} = [@_] if @_ % 2 == 0;
}

sub as_form {
    my $self = shift;
    my @l = @{$self->{tuple}}; # non destructive
    
    my $o = '<select name="' . $self->name . "\">\n";
    
    while (my ($k, $v) = splice @l, 0, 2) {
        $o .= ($k == $self->selection)  ? 
        '<option selected value="'. $k .'">'. $v .'</option>'."\n" :
        '<option value="'. $k .'">'. $v .'</option>'."\n";
    }
    
    $o .= '</select>' . "\n";
    return $o;
}

1;

Diese wird dann im Code wie folgt verwendet:
Code (perl): (dl )
1
2
my $wdgt_people = Widget::Select->new(name => 'sel_people');
$wdgt_people->set_tuple( 1, 'Jack', 2, 'Joe' ); # easier using a database-query

und im Template muss nur noch die Methode as_form aufgerufen werden. Mann kann es auch völlig ohne Template verwenden, z.B. via CGI:
Code (perl): (dl )
1
2
3
4
print  $q->header, $q->start_html, $q->h1('foo'), 
        $q->start_form, $wdgt->as_form, $q->hr,
        $q->submit(-name => "action", -value => "submit"),
        $q->end_form, $q->end_html;

EDIT: Gerade gesehen, dass der Beispiel-Code schon etwas älter sind und einige Korrekturen, im Hinblick auf die OO-Kapselung, bei der Verwendung von CPAN:Moose sinnvoll wären.\n\n

<!--EDIT|Ronnie|1183796970-->

View full thread Select Liste ...: HTML::Template