Schrift
[thread]660[/thread]

HTML::Template Problem: Wie verschachtelte Listen darstellen?

Leser: 2


<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Cremator
 2006-01-26 16:31
#6787 #6787
User since
2003-11-26
97 Artikel
BenutzerIn
[default_avatar]
Moin!

Ich habe eine verschachtelte Liste deren Tiefe ich noch nicht im vorraus kenne (Kategoriebaum aus DB).

Diese wuerde ich gerne mittels HTML::Template anzeigen, aber TMPL_LOOPs haben ja leider nur eine Ebene.

Wenn ich das Template in der LOOP ueber TMPL_INCLUDE rekursiv einbinde wird das vermutlich in einer Endlosschleife enden, oder?

Jemand eine Idee wie sich das Problem loesen laesst?
bloonix
 2006-01-26 16:53
#6788 #6788
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=Cremator,26.01.2006, 15:31]Diese wuerde ich gerne mittels HTML::Template anzeigen, aber TMPL_LOOPs haben ja leider nur eine Ebene.[/quote]
Das kann ich nicht bestätigen oder aber ich habe dein Problem
nicht verstanden. In meinen Templates gibt es verschachelte
Loops.

test.pl
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
use strict;
use warnings;
use HTML::Template;

my $template = HTML::Template->new(filename => './test.tmpl');

my @daten = (
             {
               'var11' => 'val11',
               'var12' => [
                            {
                              'var21' => 'val21',
                              'var22' => [
                                           {
                                             'var31' => 'val31',
                                             'var32' => 'val32'
                                           }
                                         ]
                            }
                          ]
             }
           );


$template->param(LOOP => \@daten);

print $template->output();


test.tmpl
Code: (dl )
1
2
3
4
5
6
7
8
9
10
<TMPL_LOOP NAME="LOOP">
  <TMPL_VAR NAME="VAR11">
  <TMPL_LOOP NAME="VAR12">
     <TMPL_VAR NAME="VAR21">
     <TMPL_LOOP NAME="VAR22">
        <TMPL_VAR NAME="VAR31">
        <TMPL_VAR NAME="VAR32">
     </TMPL_LOOP>
  </TMPL_LOOP>
</TMPL_LOOP>


Ausgabe
Code: (dl )
1
2
3
4
5
6
7
8
9
#./test.pl

  val11
 
     val21
     
        val31
        val32
     
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Cremator
 2006-01-26 17:06
#6789 #6789
User since
2003-11-26
97 Artikel
BenutzerIn
[default_avatar]
Jaja, soweit kenne ich das auch. Mein Problem ist folgendes:

Ich lese den Kategoriebaum aus der DB aus und weiss zu diesem Zeitpunkt nicht wie tief der verschachtelt ist. Das koennen 3 Ebenen sein, aber auch 9 oder mehr.

Wenn ich mein Template so baue wie oben von Dir dargestellt muesste ich jedesmal pruefen ob ich im Template noch genuegend Ebenen drin habe um die Tiefste davon noch darstellen zu koennen. Diese "Dauerwartung" wollte ich gerne vermeiden.

Wenn ich aber mein Template "cat-tree.inc" so aufbaue:
Code: (dl )
1
2
3
4
5
6
7
<ul>
<TMPL_LOOP NAME="catLoop">
<li><TMPL_VAR NAME="catName">
<TMPL_INCLUDE NAME="cat-tree.inc">
</li>
</TMPL_LOOP>
</ul>

und das Template sich selbst rekursiv inkludiert duerfte das entweder in einer Katastrophe enden oder ich muss es mit der "max_includes" Option beim new() begrenzen. Aber damit hab ich das Problem nur ins Skript verlagert, denn ich muss immernoch checken ob die Tiefe ausreicht.

Und ich will das HTML eigentlich nicht im Skript erzeugen und dann den ganzen Baum als dicken String in eine einzelne TMPL_VAR einfuegen, denn dann kann ich mir auch das Template sparen, weil dann keine Trennung mehr zwischen Funktion und Ansicht besteht.

Hoffe jetzt ist das Problem klarer dargestellt.
bloonix
 2006-01-26 17:35
#6790 #6790
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Warum konsolidierst du die Ebenen nicht?
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
pq
 2006-01-26 17:46
#6791 #6791
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
also ich verstehe nicht, warum du nicht rekursive includes machst.
hast du denn wirklich keine vorstellung von einem maximal-wert?
immerhin soll es eine html-seite werden, die sicher auch lesbar sein soll.
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
Strat
 2006-01-26 18:04
#6792 #6792
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
wenn du sowas wirklich im templating system machen willst, bleibt IMHO nur eins, das auch Code im Template zulaesst (z.B: Text::Template alias Template-Toolkit, Mason, ...).

bei HTML::Template haette ich wenig hemmungen, im template einfach zu sagen:
[html]
<!-- TMPL VAR NAME=meineListe -->
[/html]
und in perl dann die liste irgendwie in einem string zusammenbaue und dann mit
Code: (dl )
$template->param(meineListe => $myList)

als string uebergebe.

das durchbricht zwar die strikte trennung von logik und layout, laesst aber beide teile um einiges uebersichtlicher, als sowohl in perl als auch im template klimmzuege zu machen, um es irgendwie rekursiv doch hinzubekommen.\n\n

<!--EDIT|Strat|1138291517-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Cremator
 2006-01-26 18:06
#6793 #6793
User since
2003-11-26
97 Artikel
BenutzerIn
[default_avatar]
Leider hab ich keine Vorgabe fuer einen Maximalwert..

Aber ich glaub ich hab eine Loesung... Template-Rekursion in Iteration umwandeln und Datenstruktur anpassen. Statt

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$var = [
{
'cat_id' => 1,
'cat_name' => 'Foo',
'cat_sub' => {
'cat_id' => 2,
'cat_name' => 'Bar',
'cat_sub' => []
}
},
{
'cat_id' => 3,
'cat_name' => 'Buz',
'cat_sub' => []
}
]

einfach
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
$var = [
{
'cat_id' => 1,
'cat_name' => 'Foo',
'inc' => undef,
'dec' => undef,
},
{
'cat_id' => undef,
'cat_name' => undef,
'inc' => 1,
'dec' => undef,
},
{
'cat_id' => 2,
'cat_name' => 'Bar',
'inc' => undef,
'dec' => undef,
},
{
'cat_id' => undef,
'cat_name' => undef,
'inc' => undef,
'dec' => 1,
},
{
'cat_id' => 3,
'cat_name' => 'Buz',
'inc' => undef,
'dec' => undef,
},
]

Und als Template dann:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<ul>
<TMPL_LOOP NAME="catLoop">

<TMPL_IF NAME="inc">
<ul>
</TMPL_IF>

<TMPL_IF NAME="cat_id">
<li><input type="checkbox" name="cat" id="c<TMPL_VAR NAME="cat_id">" value="<TMPL_VAR NAME="cat_id">" />
<label for="c<TMPL_VAR NAME="cat_id">"><TMPL_VAR NAME="cat_name"></label>
</TMPL_IF>

<TMPL_IF NAME="dec">
</ul></li>
<TMPL_ELSE>
</li>
</TMPL_IF>

</TMPL_LOOP>
</ul>


Edit: Typos und Template angepasst.\n\n

<!--EDIT|Cremator|1138301737-->
Strat
 2006-01-26 18:42
#6794 #6794
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
das sieht gut und gut lesbar aus.
achte nur darauf, dass (im Konstruktor) 'max_includes' hoch genug gesetzt ist (standardmaessig ist da bei 10 stufen von includes ende)
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Cremator
 2006-01-26 18:47
#6795 #6795
User since
2003-11-26
97 Artikel
BenutzerIn
[default_avatar]
Nu brauch ich ja nix mehr zu inkludieren.. :D
Strat
 2006-01-26 18:53
#6796 #6796
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
da wollte ich mal was hilfreiches von mir geben... hmmm, du koenntest nicht zufaellig schnell mal eine frage stellen, zu der meine letzte antwort passt? ;-)\n\n

<!--EDIT|Strat|1138294406-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2006-01-26 16:31.