$VAR1 = { '6' => { 'parent' => '0', 'title' => 'War3', 'id' => '6', 'descr' => 'I have no subcategories' }, '1' => { 'parent' => '0', 'children' => [ { 'parent' => '1', 'children' => [ { 'parent' => 3, 'children' => [ { 'parent' => 7, 'title' => 'main sub cat1 sub cat1 sub cat1', 'id' => '9', 'descr' => 'Wewt, more recursion of doom!' } ], 'title' => 'main sub cat1 sub cat1', 'id' => 7, 'descr' => 'Sub category for a sub category! wewt.' } ], 'title' => 'main sub cat1', 'id' => 3, 'descr' => 'This is a subcategory for the main column' }, { 'parent' => '1', 'title' => 'main sub cat2', 'id' => 4, 'descr' => 'This is the second subcategory for the main column' } ], 'title' => 'Main', 'id' => '1', 'descr' => 'This is the main category, used for all stuff that doesn\'t fit else where.' }, '2' => { 'parent' => '0', 'children' => [ { 'parent' => '2', 'children' => [ { 'parent' => 5, 'title' => 'd2 sub cat sub cat', 'id' => 8, 'descr' => 'Yet another sub sub category' } ], 'title' => 'Diablo subcategory', 'id' => 5, 'descr' => 'A subcategory for the diablo 2 section.' } ], 'title' => 'Diablo', 'id' => '2', 'descr' => 'This is the main diablo category' } }; ####
##
## #!/perl/bin/perl use strict; use lib 'lib'; require HTML::Template; require Categories; my $hpc = new HTML::Template(Filename=>'tmpl/Categories/per_cat.tmpl'); my $c = new Categories; my %cats = $c->get_cats; print "Content-type: text/html\n\n"; print ""; for(sort keys %cats) { my @child_data; my $fhtml; if( $cats{ $_ }->{ children } ) { for( @{ $cats{ $_ }->{ children } } ) { my @children = _recurse( $_ ); my $html; for( reverse @children ) { $hpc->param ( title => $_->{ title }, descr => $_->{ descr }, children => $html, ); $html = $hpc->output; $hpc->clear_params; } $fhtml.=$html;; } } $hpc->param ( title => $cats{ $_ }->{ title }, descr => $cats{ $_ }->{ descr }, children => $fhtml, ); print $hpc->output; $hpc->clear_params; } print ""; sub _recurse { my $child = shift; my @data; if( ref($child->{ children }) eq 'ARRAY' ) { for( @{ $_->{ children } } ) { push @data, _recurse( $_ ); } } unshift @data,$child; return @data; }