Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision af0085b8

Von Sven Schöling vor fast 9 Jahren hinzugefügt

  • ID af0085b83ecb257679c8c64324521f9515ae76b8
  • Vorgänger fb974d9c
  • Nachfolger bf7f935d

Menu: Caching und access korrekt clearen

Unterschiede anzeigen:

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