Thread Verzeichnisbaum: Flaches Array mehrdimensional printen (13 answers)
Opened by root at 2005-03-26 12:20

root
 2005-07-18 11:02
#52981 #52981
User since
2003-08-15
120 Artikel
BenutzerIn
[default_avatar]
Leider werden in Unterverzeichnissen Dateien verschluckt, es gibt nur eine Datei pro Unterverzeichnis.

In process_data() ist noch alles iO da laufen alle Dateien brav durch. Das Problem tritt scheinbar in build_js_code() auf. Dort werden in meinem print nur noch eine Datei je Unterverzeichnis ausgegeben.

Dieses Problem tritt auch mit dem originalcode von oben auf.

Im root Verzeichnis läuft alles super. Verstehe ich nicht ganz, ist doch die gleiche Funktion nur aus sich selbst aufgerufen.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
sub orangeFile_explorer{
my ($hinweis) = @_;
# Dateien auslesen
my ($anzahl, %files) = orangeFile_datenlesen();
if($anzahl > 0){
$template{'file_anzahl'} = $anzahl." Dateien gefunden";
}else{
$template{'file_anzahl'} = "keine Dateien gefunden";
}

# Tree aufbauen #######################
our $SHIFTWIDTH = 4;
my $tree;
foreach(keys %files) { # jede Datenzeile
#print "Bearbeite Datei $_<br>\n";
$tree = process_data($_, $files{$_}, $tree); # verarbeiten und Baum hinzufuegen
}

my @js_tree; # Enthält den Baum in seiner Form für das JS
my $cnt=0; # Nur für debugging
sub process_data {
my($path, $row_data, $tree) = @_;

$tree = {'type' => 'dir'} unless $tree;

$path =~ s:^[\\/]::;

my($super, $sub) = split /[\/\\]/, $path, 2;

if($sub && $sub ne '') {
print "$path ist ein Verzeichnis<br>\n";
$tree->{'items'}->{$super} = process_data($sub, $row_data, {'dir' => 1});
} else {
print "$cnt. $path ist eine Datei<br>\n"; # HIER SIND ALLE DATEIEN!
$cnt++;
$tree->{'items'}->{$super} = {'file' => 1, 'data' => $row_data };
}

return $tree;
}

sub build_js_code {
my $tree = shift;
my $indent = shift || 1;
foreach my $key (sort {return $a cmp $b if $tree->{'items'}->{$a}->{'dir'}

&& $tree->{'items'}->{$b}->{'dir'};

return $a cmp $b if $tree->{'items'}->{$a}->{'file'}

&& $tree->{'items'}->{$b}->{'file'};

return $tree->{'items'}->{$a}->{'dir'} ? -1 : 1;}

keys %{ $tree->{'items'} } ) {

print "$key ist da<br>\n"; # HIER HABEN DIE UNTERVERZEICHNISSE NUR NOCH EINE DATEI.
if( $tree->{'items'}->{$key}->{'dir'} ) {
push @js_tree, ' ' x ($SHIFTWIDTH * $indent), "['", $key, "', null,\n"; # rekursiv
build_js_code( $tree->{'items'}->{$key}, $indent + 1);

push @js_tree, ' ' x ($SHIFTWIDTH * $indent), "],\n";
} else {
# Link zusammenbauen:
my $link = "?app=file&session_id=$template{'session_id'}&vertrag_id=$template{'vertrag_id'}&action=orangeFile_showfile&file_id=".$tree->{'items'}->{$key}->{'data'}->{'file_id'};
push @js_tree, ' ' x ($SHIFTWIDTH * $indent), "['", $key, "', '", $link , "'],\n"; # $key plus Link um Datei aufzurufen.
}
}

}

#######################################

# JavaScript im Dateihead für den Tree aufbauen
$template{'jshead'} .= "<script language=\"JavaScript\" src=\"../js/tree.js\"></script>\n";
$template{'jshead'} .= "<script language=\"JavaScript\" src=\"../js/tree_tpl.js\"></script>\n";
$template{'jshead'} .= "<script language=\"JavaScript\" type=\"text/javascript\">\n".
"var TREE_ITEMS = [\n".
" ['orangeFile', null,\n";
build_js_code($tree);

$template{'jshead'} .= join "", @js_tree;
$template{'jshead'} .= " ],\n".
" ];\n".
"</script>\n\n";

return("file", "explorer", $hinweis);
}


Vielen Dank für eure Hilfe!

View full thread Verzeichnisbaum: Flaches Array mehrdimensional printen