Schrift
[thread]75[/thread]

Verschachtelte Tabellen mit HTML::Template

Leser: 1


<< |< 1 2 >| >> 14 Einträge, 2 Seiten
Ronnie
 2003-10-22 11:39
#7423 #7423
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Hallo, ich suche nach einer Möglichkeit verschachtelte Tabellen mit HTML::Template einzusetzten.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
<table>
<tr>
<td>
<table id="Mitarbeiter"> (...) </table>
</td>
</tr>
<tr>
<td>
<table id="Detailinformation"> (...) </table>
</td>
</tr>
<table>


Wenn ich es auf die rustikale Art mache kann das so aussehen:

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
54
55
#!/usr/bin/perl -w

use strict;
use warnings;
use DBI;

my ($dbh, $sth);

$dbh = DBI->connect ("DBI:mysql:host=192.168.0.1;database=myDB",
"user", "pw", {PrintError => 0, RaiseError => 1});

&fetch_ent();

$dbh->disconnect();
exit(0);

sub fetch_ent {
my $sth = $dbh->prepare (" SELECT Firma, Strasse, PLZ, Ort, EID
FROM firma
WHERE Firma LIKE 'N%'
");
$sth->execute();

while (my ($firma, $strasse, $plz, $ort, $eid) = $sth->fetchrow_array()) {
print "<tr bgcolor='#EEEEEE'><td>\n",
"<table class='blind'><tr>",
"<td>$firma</td><td>$strasse</td><td>$plz</td><td>$ort</td>",
"</tr></table>",
"</td></tr>\n",
"<tr bgcolor='#FFFFDD'><td>\n";

&fetch_contact($eid);

print "</td></tr>\n";
}
$sth->finish();
}

sub fetch_contact {

my $eid = shift @_;

my $sth = $dbh->prepare (" SELECT Name, Vorname
FROM person
WHERE EID = '$eid'
");
$sth->execute();

while (my ($nachname, $vorname) = $sth->fetchrow_array()) {
print "<table class='blind'><tr>",
"<td>$nachname</td><td>$vorname</td>",
"</tr></table>";
}
$sth->finish();
}


Gruss,
Ronnie\n\n

<!--EDIT|Ronnie|1066808661-->
Geewiz
 2003-10-22 12:52
#7424 #7424
User since
2003-09-29
69 Artikel
BenutzerIn
[Homepage] [default_avatar]
Und deine Frage war...?
Ronnie
 2003-10-22 12:57
#7425 #7425
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=Geewiz,22.10.2003, 10:52]Und deine Frage war...?[/quote]
Hallo, ich suche nach einer Möglichkeit verschachtelte Tabellen mit HTML::Template einzusetzten?
Geewiz
 2003-10-22 13:09
#7426 #7426
User since
2003-09-29
69 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Ronnie,22.10.2003, 10:57][Hallo, ich suche nach einer Möglichkeit verschachtelte Tabellen mit HTML::Template einzusetzten?[/quote]
Ja, das scheint so zu sein. Beantwortet das deine Frage?

Meine Frage lautet: Wo ist das Problem, zwei <TMPL_LOOP...> zu schachteln?
Ronnie
 2003-10-22 13:25
#7427 #7427
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=Geewiz,22.10.2003, 11:09]Meine Frage lautet: Wo ist das Problem, zwei <TMPL_LOOP...> zu schachteln?[/quote]
Das Problem ist ein Verständniss-Problem. Wahrscheinlich ist die Lösung trivial aber ich komme nicht dahinter.

Ein einzelner Loop:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
while (my ($nachname, $vorname) = $sth->fetchrow_array()) {
  my %row = (
        nachname => $nachname,
            vorname => $vorname,
          );
   push(@loop, \%row);
   }

 $sth->finish();
 my $template = HTML::Template->new(filename => 'staff2.tmpl');
 $template->param(staff_loop => \@loop);
 #print "Content-Type: text/html\n\n";
 print $template->output;


Wenn ich jetzt einen zweiten (inneren) loop möchte muss ich dann diesen als Referenz in der äußeren Datenstruktur angeben?

Code: (dl )
1
2
3
4
5
my %row = (
    nachname => $nachname,
    vorname => $vorname,
    id  => $ref_auf_innere_struktur
    );


Ist wahrscheinlich völlig falsch, wie werden denn die einzelnen Loops auseinander gehalten? Ich sehe schon ich bin wohl wieder völlig auf dem Holzweg?!

Gruss,
Ronnie\n\n

<!--EDIT|Ronnie|1066814804-->
Ronnie
 2003-10-22 13:43
#7428 #7428
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Das zugehörige Template müsste also wie folgt aussehen:

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
<TMPL_LOOP NAME="firma_loop">
<TABLE BORDER=1>
<TR>
 <TD>
  <TABLE>
    <TR>
      <TD><TMPL_VAR NAME="Firma"></TD>
      <TD><TMPL_VAR NAME="Strasse"></TD>
      <TD><TMPL_VAR NAME="PLZ"></TD>
      <TD><TMPL_VAR NAME="Ort"></TD>
    </TR>
  </TABLE>
 </TD>
</TR>
<TR>
 <TD>
 <TMPL_LOOP NAME="staff_loop">
  <TABLE>
    <TR>
       <TD><TMPL_VAR NAME="Nachname"></TD>
       <TD><TMPL_VAR NAME="Vorname"></TD>
       <TD><TMPL_VAR NAME="Telefon"></TD>
       <TD><TMPL_VAR NAME="Fax"></TD>
       <TD><TMPL_VAR NAME="Email"></TD>
    </TR>
  </TABLE>
 </TMPL_LOOP>
 </TD>
</TR>
</TABLE>
</TMPL_LOOP>


Man sieht also das sich der innere Loop immer auf den äußeren bezieht. Meine Frage ist also konkret: "Wie muss mein Perl-Code zum Füllen des Templates aussehen?"\n\n

<!--EDIT|Ronnie|1066815846-->
ronald
 2003-10-22 13:44
#7429 #7429
User since
2003-08-15
76 Artikel
BenutzerIn
[default_avatar]
Beim Aufbauen der Datenstruktur habe ich auch immer Probleme.

Deshalb hier (m)ein Testprogramm:

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
#!/usr/bin/perl -w
use strict;
use HTML::Template;

# open the html template
my $tt = <<USAGE
Start
<TMPL_LOOP AUSSEN>
 Loop Nummer <TMPL_VAR NUMMER>:
 <TMPL_LOOP INNEN>
    innerer Loop <TMPL_VAR LETTER>
 </TMPL_LOOP>
</TMPL_LOOP>
Ende
USAGE
   ;
my $template = HTML::Template->new(scalarref => \$tt,
#   option => 'value',
#   die_on_bad_params => 0,
  );

$template->param(AUSSEN => [ { NUMMER => 1,
      INNEN => [
{ LETTER => 'a1' },
{ LETTER => 'b1' },
]
  },
    { NUMMER => 2,
      INNEN => [
{ LETTER => 'a2' },
{ LETTER => 'b2' },
]
  },
    ]
);

print $template->output;


Die Ausgabe ist
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Start

 Loop Nummer 1:
 
    innerer Loop a1
 
    innerer Loop b1
 

 Loop Nummer 2:
 
    innerer Loop a2
 
    innerer Loop b2
 

Ende


Prinzipiell geht es also.

Ich mache es immer so, dass ich mir einen einzigen Hash aufbaue, den ich dann an die param-Methode übergebe. Diesen Hash kann mir dann mit Data::Dumper anschauen um zu prüfen, ob die Struktur stimmt.
Geewiz
 2003-10-22 13:46
#7430 #7430
User since
2003-09-29
69 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Ronnie,22.10.2003, 11:25]Wenn ich jetzt einen zweiten (inneren) loop möchte muss ich dann diesen als Referenz in der äußeren Datenstruktur angeben?[/quote]
Das hättest du doch auch gleich fragen können. Die kurze Antwort ist "Ja.". Die lange Antwort:

Aus der Doku:


Quote
<TMPL_LOOP>s within <TMPL_LOOP>s are fine and work as you would expect. If the syntax for the param() call has you stumped, here's an example of a param call with one nested loop:

Code: (dl )
1
2
3
4
5
6
7
8
9
  $template->param(LOOP => [
{ name => 'Bobby',
nicknames => [
{ name => 'the big bad wolf' },
{ name => 'He-Man' },
],
},
],
);


Basically, each <TMPL_LOOP> gets an array reference. Inside the array are any number of hash references. These hashes contain the name=>value pairs for a single pass over the loop template.


Das heisst, du baust ein Array auf, das hashrefs auf die Firmendaten enthält. Soweit bist du schon. Nun kommt zu den Firmendaten dann jeweils auch eine Referenz auf ein Array mit den jeweiligen Personendaten hinzu.
Ronnie
 2003-10-22 14:04
#7431 #7431
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Euch beiden vielen Dank! Das Beispiel von Ronald hilft mir deutlich weiter. In der Doku habe ich es wohl beim überfliegen übersehen.

Gruss,
Ronnie
Ronnie
 2003-10-22 14:49
#7432 #7432
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Das ganze nochmal im fertigen Zustand:

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/usr/bin/perl -w

use strict;
use warnings;
use DBI;
use HTML::Template;

my ($dbh, $sth);
my @firma_loop;
my @contact_loop;

$dbh = DBI->connect ("DBI:mysql:host=192.168.0.1;database=myDB",
"user", "pw", {PrintError => 0, RaiseError => 1});

&fetch_ent();

$dbh->disconnect();
exit(0);

sub fetch_ent {
my $sth = $dbh->prepare (" SELECT Firma, Strasse, PLZ, Ort, EID
FROM firma
WHERE Firma LIKE 'N%'
");
$sth->execute();

while (my ($firma, $strasse, $plz, $ort, $eid) = $sth->fetchrow_array()) {
my @inner_loop = &fetch_contact($eid);
my %row = (
firma => $firma,
strasse => $strasse,
plz => $plz,
ort => $ort,
contact_loop => \@inner_loop
);
push(@firma_loop, \%row);
}
$sth->finish();

my $template = HTML::Template->new(filename => 'customer2.tmpl');
$template->param(firma_loop => \@firma_loop);
#print "Content-Type: text/html\n\n";
print $template->output;
}

sub fetch_contact {

my $eid = shift @_;
my @contact_loop;
my $sth = $dbh->prepare (" SELECT Name, Vorname, Telefon, Fax, Email
FROM person
WHERE EID = '$eid'
");
$sth->execute();

while (my ($nachname, $vorname, $telefon, $fax, $email) = $sth->fetchrow_array()) {
my %row = (
nachname => $nachname,
vorname => $vorname,
telefon => $telefon,
fax => $fax,
email => $email
);

push(@contact_loop, \%row);
}
$sth->finish();
return @contact_loop;
}


Wie kann ich im Hash direkt den Rückgabewert der Funktion &fetch_contact() referenzieren?

Code: (dl )
1
2
3
4
5
6
7
8
my @inner_loop = &fetch_contact($eid);
my %row = (
firma => $firma,
strasse => $strasse,
plz => $plz,
ort => $ort,
contact_loop => \@inner_loop
);


Gruss,
Ronnie
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2003-10-22 11:39.