opi: HTML::Template und "option selected"

Beitrag lesen

Hallo Leute,

auf Grund dieses Threads hier im Archiv habe ich mich ein wenig mit
HTML::Templates beschäftigt. Nun stehe ich schon vor meinem ersten
Problem.

Ich möchte in einem Formular einen Eintrag vorselektieren und habe
zunächst ein kleines Testskript geschrieben:

  
#!/usr/bin/perl -w  
  
use strict;  
use HTML::Template;  
  
my $parm = [];  
my $argv = {};  
  
if ($ENV{REQUEST_METHOD} eq 'GET') {  
   @$parm = split /&/, $ENV{'QUERY_STRING'};  
}  
elsif ($ENV{REQUEST_METHOD} eq 'POST') {  
   read(STDIN, my $env, $ENV{'CONTENT_LENGTH'});  
   @$parm = split /&/, $env;  
}  
  
foreach (@$parm) {  
   my ($name,$value) = split /=/, $_;  
   $name  =~ tr/+/ /;  
   $name  =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;  
   $value =~ tr/+/ /;  
   $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;  
  
   # untaint name and value  
  
   next unless $name =~ /^(\w+)$/;  
   $name = $1;  
  
   next unless $value =~ /^([a-zA-Z_0-9\-, ]+)$/;  
   $value = $1;  
  
   $argv->{$name} = $value;  
}  
  
my $template = HTML::Template->new(filename => '../templates/test_template.tmpl');  
  
my $formular_loop = [];  
my $selected = ();  
  
# die foreach-Schleife ist nur ein Beispiel, statt dessen  
# könnte die Liste aus einer Datei/Datenbank gelesen/selektiert  
# werden  
  
foreach ( 'Audi', 'BMW', 'Ford' ) {  
   if ($argv->{Marke} eq $_) {  
      $selected = 1;  
   }  
   else {  
      $selected = 0;  
   }  
   push @$formular_loop, { value => $_, selected => $selected };  
}  
  
$template->param(formular_loop => $formular_loop);  
  
print "Content-Type: text/html\n\n", $template->output;  

Nun habe ich ein wenig geforscht und nach einem anderen Weg gefunden,
einen Eintrag als selektiert zu markieren. In der foreach-Schleife
prüfe ich jeden Wert, ob er zuvor ausgewählt wurden ist. Gibt es
hier elegantere Methoden, dies zu realisieren? Vielleicht mit
HTML::Template selbst?

Welche Frage mich sonst noch quält ist, dass in dem Archivthread
die Rede davon war, dass es eine klare Trennung von Design und
Programm geben soll. Ok.

Wenn nun statt des Formulars eine Tabelle mit einer Linkliste
ausgegeben werden soll, dann ist doch meine Schleife hinfällig,
da der Key "selected" in dem Template verwendet werden muss,
da mir ansonsten eine Fehlermeldung ausgegeben wird. Also ist man
doch bei einer Strukturänderung dazu gezwungen, auch das Skript
anzupassen. Sehe ich das falsch?

Das ist mein Template (test_template.tmpl):

  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html>  
<head>  
   <title>Test Template</title>  
   <link rel="stylesheet" type="text/css" href="/local/css/local.css">  
   <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">  
</head>  
<body>  
<form action="/local/cgi/template.cgi" method="POST">  
   <select name="Marke" size="1">  
      <TMPL_LOOP NAME="formular_loop">  
      <option value="<TMPL_VAR NAME="value">"<TMPL_IF NAME="selected"> selected</TMPL_IF>><TMPL_VAR NAME="value"></option>  
      </TMPL_LOOP>  
   </select>  
   <button type="submit">Absenden</button>  
</form>  
</body>  
</html>  

Greez,
opi

--
Selfcode: ie:( fl:( br:^ va:) ls:] fo:) rl:( n4:? ss:| de:] ch:? mo:|