Menu(3) User Contributed Perl Documentation Menu(3)
NNNNAAAAMMMMEEEE
HTML::Widgets::Menu - Builds an HTML menu
SSSSYYYYNNNNOOOOPPPPSSSSIIIISSSS
use HTML::Widgets::Menu;
my $main=HTML::Widgets::Menu->new(
home => "/users/frankie/",
format => {
default=>{
# default format options #
},
0=>{
#level 0 format options#
}
# more levels
},
menu=> [
item1=>{
url=>"url for item 1",
menu=>[
item1_1=>'url for item 1_1'
]
},
item2=>"url for item 2"
# more items
],
# this is experimental
allowed => sub {
my ($url)=shift;
my $user=$r->connection->user();
return 1 unless defined $user;
return ($user eq "frankie" && $url =~/^intranet/);
}
);
print "
$menu->title
",
print "$menu->path
",
print $menu->html;
DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
This module will help you build a menu for your HTML site.
You can use with CGI or any mod_perl module. I use it from
HTML::Mason. Every time you request to show a menu it
will return the HTML tags. It's smart enough it will
highlight the current active items.
You can see an example of this here:
http://www.etsetb.upc.es/~frankie
2000-09-28 perl v5.5.30 1
Menu(3) User Contributed Perl Documentation Menu(3)
This software is more mature that latest version. It works
fine for me and is used in production sites. The very
first version was almost unusable if you didn't had very
strict rules for creating the menu, now it's much improved
and useful. Tell me if you like it or not.
You can send me patches, bugs or suggestions.
This software is provided as is and you're using it at
your own risk. You agree to use it with the same license
of perl itself.
Drawing a menu is a matter of :
the items of the menu
the format you want it to have
You also must supply the home directory for all the web
you want to add this menu.
IIIITTTTEEEEMMMMSSSS
The items is a list.
For example, a simple menu could be:
my @menu=(
homepage =>'.',
"my links" =>"links.html"
);
You can add depth to the menu:
my @menu=(
homepage => '.',
"my links" => {
url=>"links/",
menu=>[
perl =>"perl_link.html",
"movies I like"=>'movies.html'
],
about=>"about.html"
);
For every level you add instead of the url you must supply
a reference to a hash with the url and the submenu. Now
you can get this menu printed in html easily and get the
list of active items.
my
$main=HTML::Widgets::Menu->new(menu=>\@menu,home=>"/users/frankie/");
print $main->_h_t_m_l_(_); # this renders the html my
@active_items= @{$main->active}; # list of active items
2000-09-28 perl v5.5.30 2
Menu(3) User Contributed Perl Documentation Menu(3)
If the url of the item is only the name of a directory
(the final / is not necessary), the path is added to the
submenu. For the example above you must write the files:
index.html
links/index.html
links/perl_link.thml
links/movies.html
about.html
The format is the way you tell how to show the items of
the menu It's a hash where you define the options. There
should be a default entry and numbered entries for every
level, starting with 0.
Options available (with defaults):
max_depth => 1,
# max number of depth shown if items are not
active
start => '', #html to put at the start of the level
end => '', #html to add at the end of the level
font=>'',
active_item_start => '',
active_item_end => '',
inactive_item_start => '',
inactive_item_end => '',
text_placeholder => '',
# example :
# ------ ------
link_args=>'',
# put javascript options here or other args
# for the 8, # pixels for the indentation
auto_br => 1, # Adds a
at the end of every line [default 1]
Example: my %format={
default=>{
max_depth=>2,
font=>"\n",
active_item_start=>"",
active_item_end=>"\n",
indent=>20
},
0=>{
inactive_item_start=>"",
inactive_item_end=>"",
text_placeholder=>".gif\".gif>",
link_args=>"onmouseover='javascript thingie'",
},
1=>{
indent=>10
} };
2000-09-28 perl v5.5.30 3
Menu(3) User Contributed Perl Documentation Menu(3)
Try it like this:
my $main=HTML::Widgets::Menu->new(format=>\%format
menu=>\@menu,
home=>"/users/frankie");
When you want to request the html that shows the menu you
must call the html method. It will build it using home,
format and menu. The final links will always be related to
the current URL.
The pixel indentation is done using the url
/img/point.gif.
If you define an active format with an image like this:
active_item_start=> ' '
this WIDTH is added to the indentation so it looks pretty
cool in the screen:
not active
another url
=> this is the active
another one
The other items have been indented the width of the image,
in addition to the indent tag in the format.
The activation of the items work automagically reading the
environment variable provided by the web server:
$ENV{REQUEST_URI}
AAAAccccttttiiiivvvveeee IIIItttteeeemmmmssss
The active method returns a usefull thing: the active
items of the menu. In the former example if the user is in
the url: "movies.html" it will return a reference to a
list like this: "my_links"=>"links" "movies I
like "=>"links/movies.html"
What can I do with the active items ?
once the menu is built you can retrieve its active items
this way:
$menu->active;
This method returns an array with the items and links this
way:
item1 , link1 , item2, link2
You can use it to build a title or path like this:
2000-09-28 perl v5.5.30 4
Menu(3) User Contributed Perl Documentation Menu(3)
print $menu->html; # that builds the menu
my $title="Main Title";
my $path="";
my $item;
foreach (@{$menu->active}) {
$item=$_ and next unless defined $item;
$title.=" - $item";
$path.="/" if length $path;
$path.="$item";
undef $item;
}
# now I have a title and path variables
PPPPLLLLEEEEAAAASSSSEEEE
Please, tell me you're using it. I'll accept requests, comments,
suggestions, bug patches.
AAAAUUUUTTTTHHHHOOOORRRR
Francesc Guasch-Ortiz frankie@etsetb.upc.es
SSSSEEEEEEEE AAAALLLLSSSSOOOO
_p_e_r_l(1). mod_perl
2000-09-28 perl v5.5.30 5