NAME
CatalystX::Menu::Suckerfish - Generate HTML UL for a CSS-enhanced Suckerfish menu
SYNOPSIS
package MyApp::Controller::Whatever;
sub someaction :Local
:MenuPath('Electronics/Computers')
:MenuTitle('Computers')
{ ... }
sub begin :Private {
my ($self, $c) = @_;
my $menu = CatalystX::Menu::Suckerfish->new(
context => $c,
ul_id => 'navmenu', # <ul id="navmenu"> ... </ul>
ul_class => 'sf-menu', # <ul id="navmenu" class="sf-menu"> ... </ul>
text_container => { # wrap plain text nodes in this HTML element
element => 'span', # so that styles can be applied if desired.
attrs => {
class => 'myspan',
},
},
top_order => [qw(Home * About)], # Put Home and About on the ends,
# everything else in-between
filter => sub { # Filter out actions we don't want in menu
my ($c, %actions) = @_;
return
map {$_, $actions{$_}}
grep {$actions{$_}->can_visit($c)}
grep {UNIVERSAL::isa($actions{$_}, 'Catalyst::Action::Role::ACL')}
keys %actions;
},
add_nodes => [ # add a menu node manually
{
menupath => '/Bargains',
menutitle => 'Cheap stuff',
uri => '/products/cheap',
},
],
);
$c->session->{navmenu} = $menu->output;
# include the UL element in your Template: [% c.session.navmenu %]
}
# include any desired styles (CSS) for the UL element in your markup
DESCRIPTION
Builds nested HTML UL element with links to your Catalyst application's public actions for use as a Suckerfish or Superfish menu.
Suckerfish menus: http://www.alistapart.com/articles/dropdowns Superfish jQuery menu plugin: http://users.tpg.com.au/j_birch/plugins/superfish/
METHODS
new( $tree, %params )
Takes a menu tree produced by Catalyst::Controller::Menutree (CatalystX::MenuTree) and a list of key/value parameter pairs.
Params
-
Required (no validation)
Names the action attribute that contains the menu path:
menupath_attr => 'MenuPath' # and in your controller: sub foobar :Local :MenuPath(/Foo/Bar) :MenuTitle('Foobar and stuff') { ... }
Only actions with the menupath_attr attribute are processed. This attribute's value determines where the action's menu item is placed in the menu structure (HTML UL).
Depending on the attribute values collected from the processed actions, there may be menu items containing only text. If you want a link to a landing page, for example, instead of text, include an action for the landing page with the appropriate MenuPath attribute in your controller, or add an entry manually with the add_nodes parameter.
-
Optional
The menutitle_attr attribute will be used to add the HTML title attribute to each list item. This should result in a balloon text with the title when the pointing device hovers over each list item.
- ul_id
-
The ID attribute to be applied to the outer HTML UL element.
- ul_class
-
The class attribute to be applied to the outer HTML UL element.
- ul_container
-
Specifies an HTML element (typically a DIV) in which to enclose the UL element.
- text_container
-
Specifies an HTML element (typically a SPAN) in which to enclose menu items which don't include A elements. This makes it possible to apply similar styles to both plain text and A elements for consistent appearance.
- top_order
-
A list of top level menu item labels. Menu items are sorted alphabetically by default. top_order allows you to specify the order of one or more items. The asterisk (*) inserts any menu items not listed in top_order.
- add_nodes
-
Optional
A reference to an array of hash references. See the "SYNOPSIS".
output
Return HTML UL markup.
INTERNAL METHODS
_get_top_level_order()
Return hash keys for top level menu items. Order is determined by the top_order param. Items not explicitly referenced in the top_order param are sorted lexically and inserted where the asterisk (*) appears in the top_order param string.
_gen_menu($self, $h, $tree)
Recursively construct a (possibly) nested HTML UL element.
$h is an HTML::Element object. $tree is a node in the tree created in the parent class.
AUTHOR
David P.C. Wollmann <converter42@gmail.com>
BUGS
This is brand new code, so use at your own risk.
COPYRIGHT & LICENSE
Copyright 2009 by David P.C. Wollmann
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.