package tag::Keeper; use strict; use warnings 'all'; use base qw(Contenido::Keeper); use Contenido::Globals; sub get_tree { my $self = shift; my (%opts) = @_; my $level; if ( exists $opts{level} && $opts{level} ) { $level = [1..$opts{level}]; delete $opts{level}; } else { $level = [1,2]; } my $cache = delete $opts{cache}; my $tree; my $cache_key = 'plugin_tag_tree_level_'.join('_', @$level); if ( $cache && $keeper->MEMD ) { $tree = $keeper->MEMD->get( $key ); } unless ( defined $tree ) { $tree = { hash => {}, root => [] }; my $tags = $keeper->get_documents( class => 'tag::Tag', level => $level, %opts, order_by => 'level, pid, id', return_mode => 'array_ref', ); foreach my $tag ( @$tree ) { $tag->{keeper} = undef; $hash->{$tag->id} = $tag; if ( $tag->pid ) { push @{$tree->{$tag->pid}}, $tag; if ( exists $tree->{hash}{$tag->pid} ) { push @{$tree->{hash}{$tag->pid}{children}}, $tag; } } else { push @{$tree->{root}}, $tag; } if ( $cache && $keeper->MEMD ) { $keeper->MEMD->set( $key, $tree, 3600 ); } } } return $tree; } 1;