PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verzeichnisbrowser und Zurück-Funktion



munkmill
30-03-2004, 21:20
Hallo an alle,

ich habe ein Skript geschrieben, welches alle Einträge eines per $_GET übergebenen Verzeichnisses in ein Array liest und Unterverzeichnisse als Links ausgibt. Diese kann man dann wieder anklicken und das Skript wird rekursiv erneut aufgerufen, listet dann also das Unterverzeichnis auf.
Soweit, so gut. Das Problem ist die "Zurück"-Funktion. Es soll einen Link geben, der in jedem Unterverzeichnis wieder in die nächsthöhere Ebene führt.
Nun habe ich jedem Verzeichnis per $_GET seinen Vorgänger mitgegeben. Allerdings weiss ich nicht, wie ich den Zurück-Link definieren soll, da der ja zum einen das Skript mit dem Vorgänger erneut aufruft, aber auch dessen Vorgänger benötigt (für mehrmals Zurück).

Vielleicht hat ja einer ne Idee?!?! Vielen Dank für jede Hilfe, Jan


<?php

// $cur_path = Aktueller Pfad
// $go_path = Pfad, zu dem gesprungen wird (vorwaerts)
// $ret_path = Pfad, der Vorgaenger ist

// Basispfad
define ("BASE_PATH", $_GET['base_path']);

// Liest alle Eintraege des uebergebenen Pfades in ein Array,
// gibt dieses zurueck
function fillarray($path)
{
$entry_array = array();

if (is_dir($path))
{
$handle = @opendir($path);

while (($part = @readdir($handle)) == true)
{
clearstatcache();

if ($part != "." && $part != "..")
{
$entry_array[] = $part;
} // if
} // while

if ($handle == true)
{
closedir($handle);
} // if

natsort ($entry_array);
return $entry_array;
} // if ..
else
{
return false;
} // .. else
} // fillarray($path)


// Zeigt alle Eintraege im Array an, rekursiver Aufruf bei Unterverzeichnissen
function showentries()
{
// Pfad gesetzt => uebergeben
if (isset($_GET['go_path']))
{
$cur_path = $_GET['go_path'];
}
else
{
$cur_path = "";
}

// Array fuer Verzeichnis-Eintraege
$entry_array = fillarray(BASE_PATH."/".$cur_path);

// Zurueck-Pfad
$ret_path = $_GET['ret_path'];

// Uebergebener Pfad leer => Basis-Pfad
if ($cur_path == "")
{
echo "<a href=\"t.htm\">Home<br /> <br /></a>";
}
// Sonst => Zurueck-Link anzeigen
else
{
echo "<a href=\"".$_SERVER['PHP_SELF']."?base_path=".BASE_PATH."&go_path=".$ret_path."&ret_path=\">Zurueck</a><br /> <br />";
}

// Jeden Eintrag anzeigen
foreach ($entry_array as $entry)
{
// Dateien
if (is_file(BASE_PATH."/".$cur_path."/".$entry))
{
echo $entry;
echo "<br />";
}

// Unterverzeichnisse => rekursiver Aufruf
elseif (is_dir(BASE_PATH."/".$cur_path."/".$entry))
{
$go_path = $cur_path."/".$entry;

echo "<a href=\"".$_SERVER['PHP_SELF']."?base_path=".BASE_PATH."&go_path=".$go_path."&ret_path=".$cur_path."\">
$entry<br />
</a>
";
}
} // foreach
} // showentries()

// Hauptfunktion aufrufen
showentries();

?>

sixfriends
31-03-2004, 13:27
Hab mir deinen Code jetzt zwar nicht komplett durchgelesen, aber auf das nächst höhere Verzeichnis kannst du üblicherweise über den Pfad

unterverzeichnis/../

zugreifen.

munkmill
31-03-2004, 17:14
Ok, vielen Dank zunächst. Das klappt soweit. Allerdings gibt es nun ein neues Problem (eher ein schwerer Schönheitsfehler).

Wenn ich, sagen wir im Verzeichnis /home/jan/Ebene1/Ebene2 bin, dann sieht zunächst der $_GET-Parameter genauso aus. Wenn ich dann jedoch bis zum / zurückgehe, dann sieht der $_GET-Parameter folgendermaßen aus: "/home/jan/Ebene1/Ebene2/ ../ ../ ../ ../" Das ist natürlich nicht so fein, weil ja auch ein gröberes Sicherheitsproblem (der Wurzelpfad wird inzwischen aus einer Konfigurations-Datei gelesen).

Gibt es eine Möglichkeit, den $_GET-Parameter zu säubern, ohne die Funktion einzuschränken?

Viele Grüße, Jan

munkmill
31-03-2004, 19:43
Ich hab mich nun nochmal drangesetzt...
Das Problem mit den $_GET-Pfaden ist weder schön, noch irgendwie erwünscht.

Also bin ich wieder darauf zurück, per GET das Vater-Verzeichnis zu übergeben. Das klappt auch soweit, aber der "Vater" weiß nicht, wer sein Vater ist.

Man könnte die ganze Geschichte ja als Baum aufbauen, aber ich verliere ja alles, wenn ich auf den Link klicke, da das Skript dann erneut aufgerufen wird.

Hat denn keiner ne Idee? :(

Jan

undefined
31-03-2004, 19:45
Mit Session arbeiten, ist die beste Lösung ;)

munkmill
31-03-2004, 19:51
Hm, also per Session das Array speichern?

Ich wollte eigentlich von der Cookie-Variante weg...

Jan

sixfriends
01-04-2004, 01:56
Wie wär es dann damit ($upOneLevel ist Linkziel beim Klicken auf ../):
Wenn deine Pfadangabe nicht mit einem / endet (z.B. /home/jan/Ebene1/Ebene2):

$array = explode("/", $pfad);
array_pop($array);
$upOneLevel = implode("/", $array);
Wenn sie es doch tut (z.B. /home/jan/Ebene1/Ebene2/):

$array = explode("/", $pfad);
array_pop($array);array_pop($array);
$upOneLevel = implode("/", $array)."/";
Ist momentan das geschmeidigste, was mir einfällt. :D

sixfriends

munkmill
01-04-2004, 13:24
Hehe :)

die Idee ist ja super, ich hatte auch schon an sowas gearbeitet, allerdings Stringfunktionen benutzt...

Mal schauen, ob das alles so klappt => ich melde mich zurück, sobald ich ein Ergebnis habe :)

Viele Grüße, Jan



sixfriends: Du bist mein persönlicher Held :D Das funktioniert wunderbar! Ich daaaanke Dir!