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

Arrays an Templates übergeben: Arrays an Templates übergeben



<< |< 1 2 >| >> 20 Einträge, 2 Seiten
pug
 2006-02-02 13:05
#29606 #29606
User since
2005-08-17
91 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,
ich habe noch einiges zu tun in meinem "Web-Datenbanken-Projekt".
Jetzt versuche ich gerade einen Datensatz aus der Datenbank zu lesen, dieser Satz kommt in ein Array und wird dem Template übergeben.

Ich zeigs mal:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$result = $dbh->prepare ( "SELECT  katname from kategorie" ) or die "Vorbereitung nicht durchfuehrbar!\n";

$result->execute() or die "Abfrage nicht ausfuehrbar -kategorie!\n";

while ( $zeile = $result->fetchrow_arrayref )
{
push ( @kategorien, $zeile->[0] );
}
$result->finish();

$tmpl = new HTML::Template ( filename => TMPL_FILE );

$tmpl->param ( vorname => $vorname,
nachname => $nachname,
kategorien => \@kategorien );

print $tmpl->output;

Also das mit der Datenbank funktioniert das habe ich vorher mit purem CGI gemacht und da hats funktioniert. Jetzt möchte ich aus diesen "Kategorie-Namen" ein Pill-Down-Menü machen.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<HTML>

<HEAD>
<TITLE> Persoenliche Startseite von <TMPL_VAR NAME="vorname"> <TMPL_VAR NAME="nachname"> </TITLE>
</HEAD>

<BODY BGCOLOR="yellow">
<BR>
<HR>
<H3> Herzlich Willkommen <TMPL_VAR NAME="vorname"> <TMPL_VAR NAME="nachname"> </H3>
<BR>
<BR>
<BR>
<SELECT NAME="kategorien" SIZE="1">
<TMPL_LOOP NAME="kategorien">
<OPTION><TMPL_VAR NAME="kategorien"></OPTION>
</TMPL_LOOP>
</SELECT>
</BODY>

</HTML>


Aber ich bekomme nur das:
Quote
Software error:

HTML::Template->output() : fatal error in loop output : HTML::Template : Attempt to get nonexistent parameter 'debbisch' - this parameter name doesn't match any declarations in the template file : (die_on_bad_params set => 1) at /usr/share/perl5/HTML/Template.pm line 2905
at /usr/lib/cgi-bin/neue_auktion.cgi line 64


Debbisch ( hessisch Teppich ) ist der Name des ersten Strings im Array.

Was habe ich übersehen ?

Gruss Christian
Ein Betriebssystem sie zu knechten, sie alle zu finden, Ins Dunkel zu treiben und ewig zu binden.

William Gates III
renee
 2006-02-02 13:29
#29607 #29607
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du musst wie bei allen Variablen den Namen als Schluessel in einem Hashref benutzen...

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$result = $dbh->prepare ( "SELECT  katname from kategorie" ) or die "Vorbereitung nicht durchfuehrbar!\n";

$result->execute() or die "Abfrage nicht ausfuehrbar -kategorie!\n";

while ( $zeile = $result->fetchrow_arrayref )
{
# !!! Hier musst Du ein Hashref pushen... Name des TMPL_VAR als Schluessel !!!
push ( @kategorien,{kategorien => $zeile->[0]} );
}
$result->finish();

$tmpl = new HTML::Template ( filename => TMPL_FILE );

$tmpl->param ( vorname => $vorname,
nachname => $nachname,
kategorien => \@kategorien );

print $tmpl->output;
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pq
 2006-02-02 13:39
#29608 #29608
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
keine ahnung, wieso nun gerade dieser fehler kommt, aber
Code: (dl )
1
2
3
<TMPL_LOOP NAME="kategorien">
<OPTION><TMPL_VAR NAME="kategorien"></OPTION>
</TMPL_LOOP>

sieht nicht nach etwas aus, was du willst. du machst ne schleife über
'kategorien' (das array beinhaltet strings) und willst innerhalb der
schleife auf den parameter 'kategorien' zugreifen.
vielleicht willst du lieber mal CPAN:HTML::Template::Compiled ausprobieren. damit geht sowas:
Code: (dl )
1
2
3
<TMPL_LOOP NAME="kategorien">
<OPTION><TMPL_VAR NAME="_"></OPTION>
</TMPL_LOOP>


außerdem sollte eine html-option auch immer einen value haben.\n\n

<!--EDIT|pq|1138880418-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
pq
 2006-02-02 13:42
#29609 #29609
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=renee,02.02.2006, 12:29]
Code: (dl )
   push ( @kategorien,{kategorien => $zeile->[0]} ); 
[/quote]
das finde ich aber unschön, 'kategorien' als schlüssen für eine kategorie
zu nehmen. sollte dann besser die einzahl sein. aber ich würde eh HTC
empfehlen, dann kann man sich diese umständlichkeiten sparen =)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
pug
 2006-02-02 13:44
#29610 #29610
User since
2005-08-17
91 Artikel
BenutzerIn
[default_avatar]
Da bin ich jetzt etwas ratlos. Ich habe ja nur ein Array eine Auflistung von Strings, welche Namen kann man denen denn geben? Das variert ja auch in der Anzahl.

Gruss Christian
Ein Betriebssystem sie zu knechten, sie alle zu finden, Ins Dunkel zu treiben und ewig zu binden.

William Gates III
renee
 2006-02-02 13:48
#29611 #29611
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Gib dem TMPL_VAR irgendeinen namen. Welcher ist voellig unerheblich. Kannste auch "schnurzelhub" nennen. Auf jeden Fall musst Du das dann als Schluessel in der Hashref benutzen (siehe mein Code)... (oder CPAN:HTML::Template::Compiled benutzen).

Vielleicht hilft Dir auch http://perl.renee-baecker.de/HTML_Template.pdf und http://perl.renee-baecker.de/HTML_TemplateII.pdf weiter...

@pq: Du musst mir verzeihen, aber noch bin ich komplett in H::T drin und nicht H::T::C. Dort kenne ich noch nicht alle Features auswendig... Und ob es schoen aussieht oder nicht ist ja im Prinzip nicht wichtig - wenn es richtig ist ;)
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pug
 2006-02-17 16:37
#29612 #29612
User since
2005-08-17
91 Artikel
BenutzerIn
[default_avatar]
Sorry Renee daß ich erst jetzt antworte, aber ich war durch andere Aufgaben unterbrochen.

Das Problem bei Deiner Lösung ist, daß man den Hash ja erst mal erzeugen muss. Ich bekomme aber eine Liste die man nicht zu einem Hash umformen kann. Eine Idee wäre ja jeweils 2 Skalare zu einem Schlüssel, Werte-Paar zusammenzusetzen. Aber dann wird in der Auswahlliste wohl nur jedes zweite Element dargestellt, entweder nur die Schlüssel oder nur die Werte!
Zur Erinnerung: ich möchte ein Pull-Down-menü erstellen, in dem alle Werte aus meinem Array zur Auswahl stehen! Wenn ich jetzt z.B.einen statischen Schlüssel erzeuge ( habe ich gerade mal probiert, obwohl es klar war daß das keine Lösung ist ) dann wird genau auch nur ein Schlüssel-Werte-Paar erzeugt, das aber immer wieder überschrieben wird. Anders erklärt, ich habe eine Schleife erzeugt, die aus meinem Array liest, und bei jedem Durchlauf den aktuellen Wert als Wert in das Schlüssel-Wert-Paar einsetzt. Aber am Ende hatte ich genau ein Paar und nicht mehrere mit dem gleichen Schlüssel.

Oder wie hast Du das gedacht?

Andere Frage, gibt es die Mailing-Liste unter htmltmpl-subscribe@lists.vm.com eigentlich noch. Ich habe von meinem Mailserver nur eine Fehlermeldung bekommen, als ich mich anmelden wollte.


Gruss Christian\n\n

<!--EDIT|pug|1140187161-->
Ein Betriebssystem sie zu knechten, sie alle zu finden, Ins Dunkel zu treiben und ewig zu binden.

William Gates III
pq
 2006-02-17 16:53
#29613 #29613
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=pug,17.02.2006, 15:37]Das Problem bei Deiner Lösung ist, daß man den Hash ja erst mal erzeugen muss.[/quote]
ok, wo ist das problem?
Quote
Ich bekomme aber eine Liste die man nicht zu einem Hash umformen kann.

wieso nicht?
Quote
Eine Idee wäre ja jeweils 2 Skalare zu einem Schlüssel, Werte-Paar zusammenzusetzen. Aber dann wird in der Auswahlliste wohl nur jedes zweite Element dargestellt, entweder nur die Schlüssel oder nur die Werte!

du kannst wie gesagt HTC nehmen, da hast du das problem nicht. ich
will hier nicht werbung machen für HTC in der form, es ist besser als alles
andere. nur, es passt genau auf dein problem. ich hatte ja beispiel-
code geschrieben, hast du den ausprobiert?
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
pug
 2006-02-17 17:07
#29614 #29614
User since
2005-08-17
91 Artikel
BenutzerIn
[default_avatar]
Mit HTC meinst Du HTML::Template::Compiled ?
Ein Betriebssystem sie zu knechten, sie alle zu finden, Ins Dunkel zu treiben und ewig zu binden.

William Gates III
pug
 2006-02-17 18:37
#29615 #29615
User since
2005-08-17
91 Artikel
BenutzerIn
[default_avatar]
OK, ich habe folgendes verbrochen:
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
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use DBI;
use CGI::Carp qw ( fatalsToBrowser );
use HTML::Template::Compiled;

use constant TMPL_FILE => "$ENV{DOCUMENT_ROOT}/db/templates/neue_auktion.tmpl";
...
...
# hier wird eine Datenbank geöffnet und die Rückgabe in "result" gepeichert.

$result->execute() or die "Abfrage nicht ausfuehrbar -kategorie!\n";

while ( $zeile = $result->fetchrow_arrayref )
{
push ( @kategorien, $zeile->[0] );
}

$result->finish();

$tmpl = new HTML::Template::Compiled ( filename => TMPL_FILE );

$tmpl->param ( vorname => $vorname,
nachname => $nachname,
kategorien => \@kategorien );

print $tmpl->output;

$dbh->disconnect();
exit;


Das Template siht jetzt so aus:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<HTML>

<HEAD>
<TITLE> Persoenliche Startseite von <TMPL_VAR NAME="vorname"> <TMPL_VAR NAME="nachname"> </TITLE>
</HEAD>

<BODY BGCOLOR="yellow">
<BR>
<HR>
<H3> Herzlich Willkommen <TMPL_VAR NAME="vorname"> <TMPL_VAR NAME="nachname"> </H3>
<BR>
<BR>
<BR>
<SELECT NAME="kategorien" SIZE="1">
<TMPL_LOOP NAME="kategorien">
<OPTION><TMPL_VAR NAME="_"></OPTION>
</TMPL_LOOP>
</SELECT>
</BODY>

</HTML>


Aber vom Server bekomme ich diese Meldung:
Quote
[Fri Feb 17 17:22:57 2006] [error] [client 127.0.0.1] malformed header from script. Bad header=<HTML>: /usr/lib/cgi-bin/neue_auktion.cgi


Gruss Christian
Ein Betriebssystem sie zu knechten, sie alle zu finden, Ins Dunkel zu treiben und ewig zu binden.

William Gates III
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



View all threads created 2006-02-02 13:05.