Schrift
[thread]6819[/thread]

Verzeichnisbaum: Flaches Array mehrdimensional printen (Seite 2)



<< |< 1 2 >| >> 14 Einträge, 2 Seiten
root
 2005-04-04 00:53
#52979 #52979
User since
2003-08-15
120 Artikel
BenutzerIn
[default_avatar]
Oaaaah!!! Brettgut! Krass!

Es sieht sehr nach Perl aus :-)
Es ist mir die aller liebste Sprache, aber ein bisschen cryptisch ist fremder Code schon :-)

Code: (dl )
1
2
3
4
5
6
7
8
9
10
         if( $tree->{'items'}->{$key}->{'dir'} ) {
            print ' ' x ($SHIFTWIDTH * $indent),
                  "['", $key, ", null,\n";
            build_js_code( $tree->{'items'}->{$key}, $indent + 1);
            print ' ' x ($SHIFTWIDTH * $indent),
                  "],\n";
        } else {
            print ' ' x  ($SHIFTWIDTH * $indent),
                  "['", $key, "', '", $tree->{'items'}->{$key}->{'data'}->{'id'}, "'],\n";
        }


Hab noch ein paar schließende Klammer eingebaut und alles ist perfekt!!!

Vielen Dank!!! Du weißt gar nicht wie sehr du mir geholfen hast! Fett!!!\n\n

<!--EDIT|root|1112561642-->
root
 2005-04-04 01:39
#52980 #52980
User since
2003-08-15
120 Artikel
BenutzerIn
[default_avatar]
Es funktioniert auch im echten Projekt!!! Obergeil!!!
Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanke

:p
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!
root
 2005-07-19 22:35
#52982 #52982
User since
2003-08-15
120 Artikel
BenutzerIn
[default_avatar]
Ich konnte das Problem eingrenzen aber noch nicht so recht lösen.
Problem ist die Hashstruktur, es gibt nur eine Datei in den Unterverzeichnissen, weil der key das Verzeicnis ist, also wird die Info für die erste Datei im Unterverzeichnis durch die zweite überschrieben...

Nun?

Code: (dl )
1
2
3
4
5
6
7
8
     if($sub && $sub ne '') {
print "$path ist ein Verzeichnis\n";
print "(über)schreibe den key ".$super."\n";
$subtree->{'items'}->{$super} = process_data($sub, $row_data, {'dir' => 1}); #original
} else {
print "$path ist eine Datei\n";
$subtree->{'items'}->{$super} = {'file' => 1, 'data' => $row_data };
}
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2005-03-26 12:20.