[wellwell-devel] [SCM] Interchange wellwell catalog branch, master, updated. 9d725d76a0e0717b6fa0a926047b4b9f69b68113
Stefan Hornburg
racke at rt.icdevgroup.org
Wed Mar 31 09:59:02 UTC 2010
via 9d725d76a0e0717b6fa0a926047b4b9f69b68113 (commit)
from 498b05ab0cf5db5bcac9167ea2967cf22b4b8db3 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 9d725d76a0e0717b6fa0a926047b4b9f69b68113
Author: Stefan Hornburg (Racke) <racke at linuxia.de>
Date: Wed Mar 31 11:58:17 2010 +0200
sort hierarchical menus and assign level to each entry
-----------------------------------------------------------------------
Summary of changes and diff:
lib/WellWell/Menu.pm | 79 +++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 72 insertions(+), 7 deletions(-)
diff --git a/lib/WellWell/Menu.pm b/lib/WellWell/Menu.pm
index 93a4607..98231ee 100644
--- a/lib/WellWell/Menu.pm
+++ b/lib/WellWell/Menu.pm
@@ -33,7 +33,7 @@ Vend::Config::parse_tag('UserTag', 'menu_display MapRoutine WellWell::Menu::disp
sub display {
my ($name, $opt) = @_;
my ($set, @entries, $name_qtd, @fields, $fstr, $base_url, $selected);
- my ($db_menus);
+ my ($db_menus, $tree);
if ($opt->{ref}) {
$set = $opt->{ref};
@@ -52,7 +52,7 @@ sub display {
for (@$set) {
next if $_->{permission} && ! Vend::Tags->acl('check', $_->{permission});
-
+ $tree ||= $_->{parent};
push(@entries, $_);
}
@@ -65,20 +65,25 @@ sub display {
}
}
- return build_entries(\@entries, $opt);
+ return build_entries(\@entries, $opt, $tree);
}
sub build_entries {
- my ($entries_ref, $opt) = @_;
+ my ($entries_ref, $opt, $tree) = @_;
my (@out, $ref, $base_url, $uri, $form, $selected);
-
+
if ($opt->{selected}) {
$base_url = $Vend::Session->{last_url};
$base_url =~ s%^/%%;
}
+
+ if ($tree) {
+ $entries_ref = sort_tree_entries($entries_ref);
+ }
+
for (my $i = 0; $i < @$entries_ref; $i++) {
$ref = $entries_ref->[$i];
-
+
if ($ref->{url}) {
if ($opt->{selected}) {
if (index($base_url, $ref->{url}) == 0) {
@@ -103,8 +108,68 @@ sub build_entries {
$out[$i] = qq{<li>$ref->{name}</li>};
}
}
-
+
return q{<ul>} . join('', @out) . q{</ul>};
}
+sub sort_tree_entries {
+ my $entries_ref = shift;
+ my ($ref, @parents);
+ my %menu_tree = ();
+ my $tree_ref = [];
+
+ # first pass to establish tree relationships
+ for (my $i = 0; $i < @$entries_ref; $i++) {
+ $ref = $entries_ref->[$i];
+
+ if ($ref->{parent} > 0) {
+ # this is a descendant, register it with the parent
+ push @{$menu_tree{$ref->{parent}}}, $ref;
+ } else {
+ # top level item
+ push (@parents, $ref);
+
+ unless (exists $menu_tree{$ref->{code}}) {
+ $menu_tree{$ref->{code}} = [];
+ }
+ }
+ }
+
+ # second pass to order tree entries
+ my (%seen, @children, @nodes, @levels);
+
+ for (my $i = 0; $i < @parents; $i++) {
+ $ref = $parents[$i];
+ $ref->{level} = 1;
+ $seen{$ref->{code}} = 1;
+ push(@$tree_ref, $ref);
+
+ @children = @{$menu_tree{$ref->{code}}};
+ @levels = ((2) x scalar(@children));
+
+ @nodes = @children;
+
+ while ($ref = shift(@nodes)) {
+ $ref->{level} = shift(@levels);
+
+ if (exists $seen{$ref->{code}}) {
+ ::logError("Circular dependency in menu.");
+ next;
+ }
+
+ $seen{$ref->{code}} = 1;
+ push(@$tree_ref, $ref);
+
+ # add descendants to the stack
+ if (exists $menu_tree{$ref->{code}}) {
+ @children = @{$menu_tree{$ref->{code}}};
+ push(@levels, (($ref->{level} + 1) x scalar(@children)));
+ push(@nodes, @children);
+ }
+ }
+ }
+
+ return $tree_ref;
+}
+
1;
hooks/post-receive
--
Interchange wellwell catalog
More information about the wellwell-devel
mailing list