package CGI::Ex::Recipes::Template::Menu; use utf8; use warnings; use strict; #use CGI::Ex::Dump qw(debug dex_warn); our $VERSION = '0.02'; sub load { # called as Menu->load($context) my ( $class, $context ) = @_; #we may do other things beside just returning the class name if we need. return $class; # returns 'Menu' } sub new { # called as Menu->new($context) my ( $class, $context, @params ) = @_; bless { _CONTEXT => $context, _PARAMS => $params[0], }, $class; # returns blessed Menu object } sub run { my ( $self, @args ) = @_; if ( $args[0] == 'default_map' ) { return 'hi '; } return $self->{_CONTEXT}->stash->get('app'); } #================METHODS CALLABLE FROM OUTSIDE================ #lists only item in the current category $id sub list_item { my $self = shift; my $item = shift || die('please provide a recipe item.') . $!; my $app = $self->{app} ||= $self->get('app'); my $cgix = $app->cgix; my $out; my $cache_key = 'list_item_' . $item->{id} . ( $app->is_authed ? 1 : '' ); #try cache support if( $out = $app->cache->get($cache_key) ){ return $out; } if ( $self->{'recurse_level'} >= $self->{'_PARAMS'}{recurse} ) { return $cgix->li( { class => 'recipes', style => 'color:red' }, 'Max recursion reached. ' . 'If you want more: USE menu = Menu(recurse => 10000);' ); } if ( $item->{is_category} ) { $self->{'recurse_level'}++;#ТОДО:make it work foreach my $list_item ( @{ $app->recipes( [qw(id pid is_category title)], { pid => $item->{id}, id => { '!=', $item->{id} }, }, ['sortorder'] ) } ) { $out .= $self->list_item($list_item); } $out = $cgix->li( { class => 'recipes' }, ( $app->is_authed ? $cgix->a( { class => 'delete right', href => $app->script_name . '/delete/' . $item->{id} }, 'delete' ) . $cgix->a( { class => 'edit right', href => $app->script_name . '/edit/' . $item->{id} }, 'edit' ) . $cgix->a( { class => 'add right', href => $app->script_name . '/add/' . $item->{id} }, 'add here' ) : '' ) . $cgix->a( { href => $app->script_name . '/view/' . $item->{id} }, $item->{title} ) ) . ( $out ? $cgix->ul( { class => 'recipes' }, $out ) : '' ); } else { $out = $cgix->li( { class => 'recipes' }, ( $app->is_authed ? $cgix->a( { class => 'delete right', href => $app->script_name . '/delete/' . $item->{id} . '/pid/'. $item->{pid} }, 'delete' ) . $cgix->a( { class => 'edit right', href => $app->script_name . '/edit/' . $item->{id} }, 'edit' ) . $cgix->a( { class => 'add right', href => $app->script_name . '/add/' . $item->{pid} . '/after/' . $item->{id} }, 'add after' ) : '' ) . $cgix->a( { href => $app->script_name . '/view/' . $item->{id} }, $item->{title} ) ); } #try cache support $app->cache->set($cache_key, $out); return $out; } #called in default.tthtml. #lists all categorie under $id and items within them sub recipes_map { my $self = shift; my $id = shift || 0; #id from which to start. must be a category id or 0(Top) my $out = ''; # we will push HTML here $self->{'recurse_level'} = 0; my $app = $self->{app} ||= $self->get('app'); my $cache_key = 'recipes_map_'. $id . ( $app->is_authed ? 1 : '' ); #try cache support if( $out = $app->cache->get($cache_key) ){ return $out; } foreach my $item ( @{ $app->recipes( undef, { pid => $id } ) } ) { $out .= $self->list_item($item); } my $cgix = $app->cgix; $out = $cgix->ul( { class => 'recipes' }, $cgix->li( { class => 'recipes' }, ( $app->is_authed ? $cgix->a( { class => 'add right', href => $app->script_name . '/add/' }, 'add' ) . ' ' : '' ) ) . $out ); #try cache support $app->cache->set($cache_key, $out); return $out; } #====================METHODS USED INTERNALLY================== #shows controls for add,edit,delete if user is_authed sub controls { } sub context { $_[0]->{_CONTEXT} } sub stash { $_[0]->{_CONTEXT}->stash } sub get { shift->stash->get(@_) } sub set { shift->stash->set(@_) } 1; # End of CGI::Ex::Recipes::Template::Menu __END__ =head1 NAME CGI::Ex::Recipes::Template::Menu - Implements all sorts of menus for the application =head1 VERSION Version 0.02 =head1 SYNOPSIS [%# in some template altought it may be loaded first in the pre_process.tthtml %] [% menu = USE Menu %] [% menu.recipes_map(0) %] ... =head1 METHODS =head2 recipes_map Called in default.tthtml. Lists all categorie under $id and items within them. =head2 list_item Lists an item in the current category $id =head1 AUTHOR Красимир Беров, C<< >> =head1 ACKNOWLEDGEMENTS =head1 COPYRIGHT & LICENSE Copyright 2007 Красимир Беров, all rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut