Revision af0085b8
Von Sven Schöling vor mehr als 9 Jahren hinzugefügt
SL/Menu.pm | ||
---|---|---|
12 | 12 |
$yaml_xs = eval { require YAML::XS }; |
13 | 13 |
} |
14 | 14 |
|
15 |
our %menu_cache; |
|
16 |
|
|
15 | 17 |
sub new { |
16 | 18 |
my ($package, $domain) = @_; |
17 | 19 |
|
18 |
my $path = File::Spec->catdir('menus', $domain); |
|
20 |
if (!$menu_cache{$domain}) { |
|
21 |
my $path = File::Spec->catdir('menus', $domain); |
|
19 | 22 |
|
20 |
opendir my $dir, $path or die "can't open $path: $!"; |
|
21 |
my @files = sort grep -f "$path/$_", readdir $dir; |
|
22 |
close $dir; |
|
23 |
opendir my $dir, $path or die "can't open $path: $!";
|
|
24 |
my @files = sort grep -f "$path/$_", readdir $dir;
|
|
25 |
close $dir;
|
|
23 | 26 |
|
24 |
my $nodes = []; |
|
25 |
my $nodes_by_id = {}; |
|
26 |
for my $file (@files) { |
|
27 |
my $data; |
|
28 |
if ($yaml_xs) { |
|
29 |
$data = YAML::XS::LoadFile(File::Spec->catfile($path, $file)); |
|
30 |
} else { |
|
31 |
$data = YAML::LoadFile(File::Spec->catfile($path, $file)); |
|
27 |
my $nodes = []; |
|
28 |
my $nodes_by_id = {}; |
|
29 |
for my $file (@files) { |
|
30 |
my $data; |
|
31 |
if ($yaml_xs) { |
|
32 |
$data = YAML::XS::LoadFile(File::Spec->catfile($path, $file)); |
|
33 |
} else { |
|
34 |
$data = YAML::LoadFile(File::Spec->catfile($path, $file)); |
|
35 |
} |
|
36 |
_merge($nodes, $nodes_by_id, $data); |
|
32 | 37 |
} |
33 |
_merge($nodes, $nodes_by_id, $data); |
|
34 |
} |
|
35 | 38 |
|
36 | 39 |
|
37 |
my $self = bless { |
|
38 |
nodes => $nodes, |
|
39 |
by_id => $nodes_by_id, |
|
40 |
}, $package; |
|
40 |
my $self = bless { |
|
41 |
nodes => $nodes, |
|
42 |
by_id => $nodes_by_id, |
|
43 |
}, $package; |
|
44 |
|
|
45 |
$self->build_tree; |
|
41 | 46 |
|
42 |
$self->build_tree; |
|
43 |
$self->set_access; |
|
47 |
$menu_cache{$domain} = $self; |
|
48 |
} else { |
|
49 |
$menu_cache{$domain}->clear_access; |
|
50 |
} |
|
51 |
|
|
52 |
$menu_cache{$domain}->set_access; |
|
44 | 53 |
|
45 |
return $self;
|
|
54 |
return $menu_cache{$domain};
|
|
46 | 55 |
} |
47 | 56 |
|
48 | 57 |
sub _merge { |
... | ... | |
211 | 220 |
return $::instance_conf->data->{$setting}; |
212 | 221 |
} |
213 | 222 |
|
223 |
sub clear_access { |
|
224 |
my ($self) = @_; |
|
225 |
for my $node ($self->tree_walk("all")) { |
|
226 |
delete $node->{visible}; |
|
227 |
delete $node->{visible_children}; |
|
228 |
} |
|
229 |
} |
|
230 |
|
|
214 | 231 |
sub set_access { |
215 | 232 |
my ($self) = @_; |
216 | 233 |
# 1. evaluate access for all |
Auch abrufbar als: Unified diff
Menu: Caching und access korrekt clearen