Autor |
Nachricht |
bluespoon
Threadersteller
Dabei seit: 10.11.2006
Ort: Hannover
Alter: 41
Geschlecht:
|
Verfasst So 11.07.2010 23:12
Titel Dateimanager/Ordnerstruktur mit PHP/MySQL |
|
|
Moin
Ich hab' hier grad ein echt kniffliges Problem - denke ich zumindest. Also … ich hab' ein Script gebaut,
in dem der User eine Art Dateimanager zur Verfügung stehen hat. Nun kann er dort verschiedene
Verzeichnisse anlegen. Soweit ist alles prima. Nun gibt es aber ein Select, in welchem der User
schnell zischen den einzelnen Verzeichnissen hin und her springen soll.
Mein erster Aufbau war einfach eine Abfrage nach allen Verzeichnissen zu der aktuellen User ID.
Nun wollte ich aber eine Struktur Wie diese hier haben:
Hauptverzeichnis
- Unterverzeichnis 1
- Unterverzeichnis 2
- - Unter-Unterverzeichnis 1
- - Unter-Unterverzeichnis 2
- Unterverzeichnis 3
Der User kann übrigens so viele Ebenen erstellen, wie er lustig ist.
Zuerst der Aufbau meiner MySQL Tabelle 'user_directories':
Identifiziert werden die Verzeichnisse über die 'directory_id'. Die 'parent_directory_number' eines Verzeichnisses
ist also die 'directory_id' des übergeordneten. Und nun meine Abfrage. Alles unwichtige hab' ich rausgenommen …
Code: | $query = "SELECT * FROM user_directories WHERE user_id = " . $user_id . " AND parent_directory_number = 0 ORDER BY directory_name ASC";
$result = my_sql::my_sql_query($query);
while($directory = my_sql::my_sql_fetch_obj($result))
{
$directory_box .= "\t\t\t\t\t\t" . '<option value="' . $directory->directory_id . '">- ' . $directory->directory_name . '</option>' . "\n";
$query_2 = "SELECT * FROM user_directories WHERE user_id = " . $user_id . " AND parent_directory_number = " . $directory->directory_id . " ORDER BY directory_name ASC";
$result_2 = my_sql::my_sql_query($query_2);
while($directory_2 = my_sql::my_sql_fetch_obj($result_2))
{
$directory_box .= "\t\t\t\t\t\t" . '<option value="' . $directory_2->directory_id . '">- - ' . $directory_2->directory_name . '</option>' . "\n";
$l++;
}
$l++;
} |
Edit: Ohne Highlightning schlecht zu lesen. Hier ist noch ein Screen:
Das liefert mir nun folgendes Ergebnis:
Damit bin ich eig. zufrieden. Aber was, wenn der User nun noch eine dritte und vierte Ebene
an Verzeichnissen aufbaut. Also meinetwegen …
Hauptverzeichnis
- Unterverzeichnis 1
- Unterverzeichnis 2
- - Unter-Unterverzeichnis 1
- - - Unter-Unter-Unterverzeichnis 1
- - - - Unter-Unter-Unter-Unterverzeichnis 1
- - Unter-Unterverzeichnis 2
- Unterverzeichnis 3
Ich kann doch net auf gut Glück 20 Schleifen ineinander packen … wo liegt denn jetzt mein
Denkfehler? Komme nämlich auf keine vernünftige Lösung hier Wenn an der Struktur
oder meinem Code noch was unklar ist, einfach fragen.
Mein Ansatz ist die äußere Schleife mit der ID 0 wie oben (das Hauptverzeichnis) und
anschließend EINE Schleife, die so lange "Kindschleifen" aufbaut, bis zu einem übergeordneten
Verzeichnis kein Unterverzeichnis mehr gefunden wird. Na ja … zu dem Ansatz fällt mir aber
beim Besten Willen keine Lösung ein :/
Danke und LG,
Patrick
Zuletzt bearbeitet von bluespoon am So 11.07.2010 23:17, insgesamt 1-mal bearbeitet
|
|
|
|
|
bacon
Dabei seit: 24.10.2007
Ort: -
Alter: -
Geschlecht: -
|
Verfasst Mo 12.07.2010 07:51
Titel
|
|
|
Stichwort Rekursion:
http://de.wikipedia.org/wiki/Rekursion
Ist aber nicht die ideale Lösung, um Hierarchien in einer relationalen Datenbank zu durchlaufen, da ja pro Schleifendurchlauf n Queries abgesetzt werden, was schlicht ein Performancemangel ist. Besser ein Datenmodell, dass eine iterative Lösung erlaubt (NestedSets bspw, http://www.klempert.de/nested_sets/); oder alternativ ein Caching des kompletten Baums im Speicher/Dateisystem.
|
|
|
|
|
Anzeige
|
|
|
bluespoon
Threadersteller
Dabei seit: 10.11.2006
Ort: Hannover
Alter: 41
Geschlecht:
|
Verfasst Mo 12.07.2010 12:11
Titel
|
|
|
Hi,
dank Dir Das Cachen der Daten erscheint mir sinnvoll. Auch meine bisherige Funktion um den aktuellen
Pfad auszugeben ist eher suboptimal. Die Ausgabe ist zwar korrekt ... aber hier muss ich schließlich auch
nur in eine Richtung (nach oben) gehen und keie Abzweigungen in der "Ordnerstruktur" nehmen.
Code: | function current_path($user_id, $current_directory)
{
$path = '';
$i = 1;
if($current_directory == 0 || $current_directory == '0') $directory_data = false;
else $directory_data = true;
while($directory_data == true)
{
$query = "SELECT * FROM user_directories WHERE user_id = " . $user_id . " AND directory_id = " . $current_directory;
$result = my_sql::my_sql_query($query);
$directory = my_sql::my_sql_fetch_obj($result);
if($i > 3) $path = ' / ... ' . $path;
else $path = ' / <a href="#" onclick="return navigate_to_directory(' . $directory->directory_id . ');">' . $directory->directory_name . '</a>' . $path;
$i++;
$current_directory = $directory->parent_directory_number;
if($current_directory == 0 || $current_directory == '0' || $i > 4) $directory_data = false;
}
$main_dir = '<a href="#" onclick="return navigate_to_directory(0);">Hauptverzeichnis</a>';
return $main_dir . $path;
} |
Ausgabe: Hauptverzeichnis /Dir / Subdir
Oder eben: Hauptverzeichnis / ... / Dir / Subdir / Subdir
Wird zwar nur max viermal durchlaufen, sind aber trotzdem jedes Mal unnötige Abfragen. Und an der Baumstruktur
der User Verzeichnisse ändert sich ja nichts - bis ein Verzeichnis gelöscht, verschoben, umbenannt oder erstellt wird.
Also ... werde ich mir heute Abend mal ansehen. Besten Dank
LG Patrick
|
|
|
|
|
zweitaccount
Dabei seit: 25.01.2008
Ort: -
Alter: -
Geschlecht: -
|
Verfasst Di 13.07.2010 10:12
Titel
|
|
|
Hi,
eine andere Möglichkeit wäre es, alles mit einem query zu holen
und dann in etwa so auszugeben:
Code: | <?php
function outPrintItems($items=false,$start=0,$level=0){
if(!$items || !is_array($items)) return;
$level++;
foreach($items[$start] as $key => $item) {
echo '<option value="'.$item['directory_id'].'" style="margin-left:'.(10*$level-10).'px">';
echo $item['directory_name'].'['.$item['directory_id'].']';
echo '</option>';
if(isset($items[$key]) && is_array($items[$key])) {
outPrintItems($items,$key,$level);
}
}
$level--;
}
$result = mysql_query("SELECT * FROM user_directories WHERE user_id = '1' ORDER BY directory_name");
$items = array();
while($row = mysql_fetch_array($result)) {
if(!isset($items[$row['parent_directory_number']])) $items[$row['parent_directory_number']] = array();
$items[$row['parent_directory_number']][$row['directory_id']] = $row;
}
?>
<form action="#" method="post">
<fieldset>
<select name="dropdown">
<?=outPrintItems($items);?>
</select>
</fieldset>
</form> |
So könntest du beliebig viele 'Unterordner' darstellen.
Grüße
zweitaccount
Btw: Google Chrome stellt gar kein margin-left in <option> dar
sehe ich gerade. Müsstest Du dir was anderes einfallen lassen...
|
|
|
|
|
|
|
|
Ähnliche Themen |
[Suche] Dateimanager mit Mitgliederverwaltung
Ordnerstruktur ausdrucken
winzip 8.0 > ordnerstruktur erhalten?
[Typo3] Designvorlage - Ordnerstruktur importieren
Ordnerstruktur für Projekte innerhalb eines Unternehmens
Ordnerstruktur von Website anzeigen ohne FTP-Programm
|
|