Font
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]735[/thread]

HTML::Template + sub ärger: selectbox



<< >> 9 entries, 1 page
decoder
 2006-05-23 01:08
#7751 #7751
User since
2006-03-30
22 articles
BenutzerIn
[default_avatar]
Hallo

ich hab mir die subroutine geschrieben, die mir eine Select-box aufbaut in "HT" es soll mit ein parameter (immer ein integer) übergeben werden der einen Wert aus der Selectbox standartmässig auswählt (selected).

Ich wäre sehr dankbar wenn ihr mir da helfen könntet. Jeder Tip und Hinweis ist für mich Goldwert auch am Layout :)

Ich hab laut logfile auf (mod-perl) folgende probleme:

Code: (dl )
[Mon May 22 22:52:01 2006] 1.cgi: Variable "$template" will not stay shared at /var/www/perl/1.cgi line 40.

( $template->param({$loop_name => \@a_selectbox_loop}); )
hmm jo ich denke mal ich sollte $template... aus der sub rausnehmen komme aber nicht drauf wie ich einen return zurückmache :(

Code: (dl )
[Mon May 22 22:52:01 2006] 1.cgi: Subroutine build_selectbox redefined at /var/www/perl/1.cgi line 13.


keine Ahnung leider, total ratlos.

Code: (dl )
[Mon May 22 22:52:01 2006] null: Use of uninitialized value in numeric eq (==) at /var/www/perl/1.cgi line 27.


hmm versteh ich auch nicht da ich beim aufruf ja eine "2" mitgebe

Code: (dl )
[Mon May 22 22:52:01 2006] null: Use of uninitialized value in array element at /var/www/perl/1.cgi line 32.


(push(@a_selectbox_loop,{ ...) hmm wird sich wohl auf die vorletze beziehen.


Code: (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
#!/usr/bin/perl -w

use CGI;
use CGI::Carp qw(fatalsToBrowser);
use HTML::Template;
use strict;

my $template = HTML::Template->new(filename => '1.tmpl');
my $cgi = CGI->new();



sub build_selectbox
{
my ($loop_name, $selected_var, @a_selectbox_values) = @_;

my ($i, $selected, @a_selectbox_loop);

if (!defined($selected_var))
{
$selected_var = 1;
}

for(@a_selectbox_values)
{
$selected=0;

if ($i == $selected_var)
{
$selected=1;
}

push(@a_selectbox_loop,{
selectbox_label => $a_selectbox_values[$i],
selectbox_value => $i,
selectbox_selected => $selected
});
$i++;
}

$template->param({$loop_name => \@a_selectbox_loop});
}

my @a_array = ('---','Berlin','Wien','Bern');
&build_selectbox('loop_kursort', 2, @a_array);

print $template->output;


html template:

Code: (dl )
1
2
3
4
5
<select name="kursort">
<!-- TMPL_LOOP NAME="loop_kursort">
<option value="<!-- TMPL_VAR NAME="selectbox_value"-->"<!-- TMPL_IF NAME="selectbox_selected"--> selected<!-- /TMPL_IF-->> <!-- TMPL_VAR NAME="selectbox_label"--> </option>
<!-- /TMPL_LOOP-->
</select>
\n\n

<!--EDIT|decoder|1148332172-->
decoder
 2006-05-23 01:11
#7752 #7752
User since
2006-03-30
22 articles
BenutzerIn
[default_avatar]
vielleicht mit line-numbers besser :)

Code: (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
52
53
     1    #!/usr/bin/perl -w
2
3 use CGI;
4 use CGI::Carp qw(fatalsToBrowser);
5 use HTML::Template;
6 use strict;
7
8 my $template = HTML::Template->new(filename => '1.tmpl');
9 my $cgi = CGI->new();
10
11
12 sub build_selectbox
13 {
14 my ($loop_name, $selected_var, @a_selectbox_values) = @_;
15
16 my ($i, $selected, @a_selectbox_loop);
17
18 if (!defined($selected_var))
19 {
20 $selected_var = 1;
21 }
22
23 for(@a_selectbox_values)
24 {
25 $selected=0;
26
27 if ($i == $selected_var)
28 {
29 $selected=1;
30 }
31
32 push(@a_selectbox_loop,{
33 selectbox_label => $a_selectbox_values[$i],
34 selectbox_value => $i,
35 selectbox_selected => $selected
36 });
37 $i++;
38 }
39
40 $template->param({$loop_name => \@a_selectbox_loop});
41 }
42
43
44 my @a_array = ('---','Berlin','Wien','Bern');
45 &build_selectbox('loop_kursort', 2, @a_array);
46
47 #<select name="kursort">
48 # <!-- TMPL_LOOP NAME="loop_kursort">
49 # <option value="<!-- TMPL_VAR NAME="selectbox_value"-->"<!-- TMPL_IF NAME="selectbox_selected"--> selected<!-- /TMPL_IF-->> <!-- TMPL_VAR NAME="selectbox_label"--> </option>
50 #<!-- /TMPL_LOOP-->
51 #</select>
52
53 print $template->output;
Linuxer
 2006-05-23 01:42
#7753 #7753
User since
2006-01-27
3783 articles
HausmeisterIn

user image
Quote
1.cgi: Subroutine build_selectbox redefined at /var/www/perl/1.cgi line 13.

Ich vermute hier das Problem beim mod_perl; Aber das ist nur eine Vermutung meinerseits; bin ohne Erfahrungen mit mod_perl... Kann daher nix konkretes oder genaueres dazu sagen...
(und meine Testerei belief sich auf ein ":!perl -c %" und ":perl %" im vim (sprich: check syntax und führe auf der Konsole aus))

Quote
null: Use of uninitialized value in numeric eq (==) at /var/www/perl/1.cgi line 27.

Du erhälst diese Meldung, weil $i beim ersten Schleifendurchlauf nicht initialisiert ist; da Du bei der Deklaration $i keinen Wert zugewiesen hast:
Code (perl): (dl )
my ( $i, $selected, @a_selectbox_loop );


Quote
Use of uninitialized value in array element at /var/www/perl/1.cgi line 32.

Diese Meldung resultiert ebenfalls daher, dass $i beim ersten Durchlauf keinen definierten (numerischen) Wert hat:
Code (perl): (dl )
selectbox_label => $a_selectbox_values[$i],


[/edit]reformatiert und Rechtschreibung korrigiert + Satz erweitert[/edit]\n\n

<!--EDIT|Linuxer|1148335170-->
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
Ronnie
 2006-05-23 01:45
#7754 #7754
User since
2003-08-14
2022 articles
BenutzerIn
[default_avatar]
ungetestet, aber sollte entsprechend funktionieren:
Code: (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
#!/usr/bin/perl -w

use strict;

use Data::Dumper;
#use CGI;
#use CGI::Carp qw(fatalsToBrowser);
#use HTML::Template;

#my $template = HTML::Template->new( filename => '1.tmpl' );
#my $cgi = CGI->new();

sub build_selectbox {
my ($l_name, $selected, @options) = @_;
return { $l_name => [ map {
{
selectbox_label => $options[$_],
selectbox_value => $_,
selectbox_selected => $selected == $_ ? 1 : 0,
}
} (0 .. $#options) ] };
}

my @a_array = ( '---', 'Berlin', 'Wien', 'Bern' );
die Dumper &build_selectbox( 'loop_kursort', 2, @a_array );
# $template->param( build_selectbox( 'loop_kursort', 2, @a_array ) );
# print $template->output;

Hier die Ausgabe von Data::Dumper:
Code: (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
$VAR1 = {
'loop_kursort' => [
{
'selectbox_label' => '---',
'selectbox_selected' => 0,
'selectbox_value' => 0
},
{
'selectbox_label' => 'Berlin',
'selectbox_selected' => 0,
'selectbox_value' => 1
},
{
'selectbox_label' => 'Wien',
'selectbox_selected' => 1,
'selectbox_value' => 2
},
{
'selectbox_label' => 'Bern',
'selectbox_selected' => 0,
'selectbox_value' => 3
}
]
};

Ich bin nicht sicher ob man param so verwenden kann, einfacher ist es allemal, wenn man den $l_name erst gar nicht an die Funktion übergibt.\n\n

<!--EDIT|Ronnie|1148334532-->
decoder
 2006-05-23 12:40
#7755 #7755
User since
2006-03-30
22 articles
BenutzerIn
[default_avatar]
@Ronnie danke funktioniert super so :)

mit Data::Dumper muss ich mich noch einwenig anfreunden, hehe

Code: (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
#!/usr/bin/perl -w

use CGI;
use CGI::Carp qw(fatalsToBrowser);
use HTML::Template;
use strict;

my $template = HTML::Template->new(filename => '1.tmpl');
my $cgi = CGI->new();

sub build_selectbox {
my ($l_name, $selected, @options) = @_;
return { $l_name => [ map {
{
selectbox_label => $options[$_],
selectbox_value => $_,
selectbox_selected => $selected == $_ ? 1 : 0,
}
} (0 .. $#options) ] };
}


my @a_array = ('---','Berlin','Wien','Bern');

$template->param( build_selectbox( 'loop_kursort', 3, @a_array ) );

print "Content-Type: text/html; charset=utf-8\n\n", $template->output;
GwenDragon
 2006-05-23 12:44
#7756 #7756
User since
2005-01-17
14198 articles
Admin1
[Homepage]
user image
Wenn du schon CGI benutzt:
Code: (dl )
1
2
print $cgi->header( -content_type => "text/html",
-charset=>"utf-8" ), $template->output;


Es kann auch sinnvoll sein, schon früher das Charset zu setzen mit:
Code: (dl )
$cgi->charset('utf-8');
\n\n

<!--EDIT|GwenDragon|1148374007-->
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

decoder
 2006-05-23 12:46
#7757 #7757
User since
2006-03-30
22 articles
BenutzerIn
[default_avatar]
@Linuxer

unter CGI habe ich die erste Meldung auch nicht scheint wirklich etwas mit mod-perl zu tun haben.
kanns leider im moment nicht auf mp ausprobieren ob die codeänderung schon was gebracht hat.

Meine Vermutung ist das $template was ja eine Klasse ist (?) in die sub gequetscht wird, aber pure Spekulation :)

Die Sache mit dem $i war auch ein volltreffer hab immer nur auf die "$selected_var" geachtet.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
for 
{
...

if (!defined($i))
{
$i=0;
}

...
}



kann man das eigentlich auch kürzer schreiben (perl-like), wenn nicht defined dann initalisiere ?

liebe grüße +
dankeschön!
decoder
 2006-05-23 12:47
#7758 #7758
User since
2006-03-30
22 articles
BenutzerIn
[default_avatar]
@gwenDragon das ist richtig das ist unsauber, hab mich aber nur auf die sub konzentriert,

eigentlich sollte das ja auch beim output
Code: (dl )
print "Content-Type: text/html; charset=utf-8\n\n", $template->output;

stehen.

[edit]e ok hast du gerade gesagt, zu früh aufgestanden :)[/edit]\n\n

<!--EDIT|decoder|1148374649-->
Linuxer
 2006-05-23 14:35
#7759 #7759
User since
2006-01-27
3783 articles
HausmeisterIn

user image
Quote
kann man das eigentlich auch kürzer schreiben (perl-like), wenn nicht defined dann initalisiere ?


Code (perl): (dl )
$i = 0 unless ( defined($i) );


oder

Code (perl): (dl )
$i = defined($i) ? $i : 0;


Aber die beste Variante wäre wohl, die Variable bei der Deklaration mit Wert zu füllen...
Code (perl): (dl )
my $i = 0;
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
<< >> 9 entries, 1 page



View all threads created 2006-05-23 01:08.