DIR Ordner anzeigen
Timur
- php
Hallo,
mit diesem folgendem Skript lese ich den Inhalt eines Ordners aus.
<?PHP
$Pfad = "./ordner/unterordner/";
if($Verzeichniszeiger = opendir($Pfad))
{
while($Datei = readdir($Verzeichniszeiger))
{
if ($Datei != "." && $Datei != "..")
{
if(is_dir($Datei))
{
echo"<font color=\"red\">";
}
echo$Datei,
"<br>";
if(is_dir($Datei))
{
echo"</font>";
}
}
}
closedir($Verzeichniszeiger);
}
?>
Wie kann ich eine "Blätterfunktion" einbauen? Ich habe einigen Ordnern über 100 Dateien. Ich würde gerne pro Seite 25 Dateien anzeigen.
Gruß
Timur
Hi,
Wie kann ich eine "Blätterfunktion" einbauen?
welche Suchbegriffe hast Du benutzt, dass es Dir nicht gelungen ist, zu dieser Standardaufgabe zig Lösungsansätze zu finden? "Napalm"?
Cheatah
Grundlage für Zitat #1404.
Hi,
Wie kann ich eine "Blätterfunktion" einbauen?
welche Suchbegriffe hast Du benutzt, dass es Dir nicht gelungen ist, zu dieser Standardaufgabe zig Lösungsansätze zu finden? "Napalm"?
Bzgl. einer Blätterfunktion wäre "Agent Orange" vermutlich zielführender - obwohl es dann, zugegeben, wohl eher eine "Entblätterfunktion" wird.
MfG ChrisB
``Hallo,
nun habe ich mein Skript soweit, dass ich die Dateien in ein Array schreibe und mittels for-Schleife mir die Dateien anzeige.
Wie kriege ich das mit der Blätterfunktion hin? Leider hat mir das Skript von Tom gar nicht weitergeholfen.
Hier ist mein Code, den ich noch verkürzt habe...
<?PHP
$i = 0;
$dateiarray = array();
$pfad = "../../../../";
if($ordner = opendir($pfad))
{
while($datei = readdir($ordner))
{
if ($datei != "." && $datei != "..")
{
$dateiarray[$i] = $datei;
$i = $i + 1;
}
}
closedir($ordner);
}
for($i=0; $i <= 9; $i++)
{
echo "$dateiarray[$i]<br />";
}
?>
Vielen Dank und viele Grüße
Timur
Hi,
nun habe ich mein Skript soweit, dass ich die Dateien in ein Array schreibe und mittels for-Schleife mir die Dateien anzeige.
Wie kriege ich das mit der Blätterfunktion hin?
In dem du dich, das schrieb Cheatah bereits, bzgl. dieser *Standardaufgabe* informierst - und zwar so, dass du das *generelle* Vorgehen verstehst.
Dann ist es nämlich vollkommen egal, ob die Daten, die über mehrere Seiten verteilt dargestellt werden sollen, aus einer Datenbank stammen, in einem Array vorliegen, oder wie auch immer.
MfG ChrisB
Hi ChrisB,
undzwar habe ich etwas rumgecodet und folgendes kam raus:
<?PHP
$i = 0;
$dateiarray = array();
$pfad = "../../aa/bb/";
if($ordner = opendir($pfad))
{
while($datei = readdir($ordner))
{
if($datei != "." && $datei != "..")
{
$dateiarray[$i] = $datei;
$i = $i + 1;
}
}
closedir($ordner);
}
$arraymenge = count($dateiarray);
$limit = 5;
if(!$start){$start = 0;}
if($start > 0)
{
$wert = $limit - 5;
$proseite = $limit - $wert;
echo "<a href=\"b.php?start=$wert\"><< Zurück</a>";
}
if($start < $arraymenge)
{
$wert = $limit + 5;
$proseite = $limit + $wert;
echo "<a href=\"b.php?start=$wert\">Weiter >> </a>";
}
for($i = $wert; $i <= $proseite; $i++)
{
echo "$dateiarray[$i]<br />";
}
zwar habe dadurch eine Blätterfunktion, aber es ist verdammt merkwürdig. Da wird nicht der gesamte Ordnerinhalt angezeigt.
Kann einer mir helfen?
LG
Timur
Hello,
ich habe es Dir nun doch mal exemplarisch fertig gemacht udn ausprobiert.
Du musst Dir nur noch eine passende valide Seite drum herum schreiben und ein CSS dafür bauen.
<?php ### filelist_paginated.php ###
error_reporting(E_ALL);
#---- Parameter ------------------
$pfad = "C:/Programme/xampp";
$limit = 5;
#---- Scriptvariablen ------------
$_dateiarray = array();
$pfad = rtrim($pfad,'/').'/'; ## EINEN abschließenden Slash sicherstellen
if($ordner = opendir($pfad))
{
while(false!==($datei = readdir($ordner)))
{
## Anderenfalls würde auch beim Dateinamen '0' (null) abgebrochen werden
if(is_file($pfad.$datei))
{
## Damit Du Links und andere auch ausschließt.
## Wenn Du links zulässt, musst Du auf Rekursion prüfen, dann wirds erst
## richtig spanned
$_dateiarray[] = $datei;
}
}
closedir($ordner);
}
#echo "<pre>\r\n";
#echo htmlspecialchars(print_r($_dateiarray,1));
#echo "</pre>\r\n";
$page = 0;
$maxpage = intval(count($_dateiarray)/$limit);
if(isset($_GET['page']))
{
$page = intval($_GET['page']);
}
if ($page < 0) { $page = 0; }
if ($page > $maxpage) { $page = $maxpage; }
$start = $page*$limit;
$stop = $start+$limit;
echo " <ul class="filename">\r\n";
foreach($_dateiarray as $key => $val)
{
if($key >= $stop) { break; } ## Wenn Stopgrenez erreicht ist,. Schliefe abbrechen
if($key >= $start)
{
echo " <li class="filename">".htmlspecialchars($val)."</li>\r\n";
}
}
echo " </ul>\r\n";
echo " <ul class="pagelink">\r\n";
for ($i = 0; $i <= $maxpage; $i++)
{
echo " <li class="pagelink"><a href="{$_SERVER['SCRIPT_NAME']}?page=$i">".($i+1)."</a></li>\r\n";
}
echo " </ul>\r\n";
?>
Nun hoffe ich, dass Dir das weiter hilft.
Liebe Grüße aus Syburg
Tom vom Berg
Hallo Tom,
das ist wirklich sehr sehr nett von Dir. Das Skript funktioniert auch prima. Ich würde es gerne aber mit "vor" und "zurück" haben. Ist das möglich?
Gruß
Timur
Hello,
das ist wirklich sehr sehr nett von Dir. Das Skript funktioniert auch prima. Ich würde es gerne aber mit "vor" und "zurück" haben. Ist das möglich?
Klar, überlegen wir also mal, wie denn die Steuerung überhaupt funktioniert:
Das Script reagiert intern auf eine Seitennummer. Die wird als Scriptvariable $page gesetzt und davon abhängig werden alle Ausgaben berechnet.
Aber woher bekommt das Sript nun diese Wunschseitennummer?
Mögliche Wege sind
if(isset($_GET['page']))
{
$page = intval($_GET['page']);
}
woher nimmt die Seite aber die Nummern?
Die haben wir vorher als Links verpackt angeboten.
Wenn wir jetzt anstelle der aller möglichen Seitennummern also nur die für [ZURÜCK] und [WEITER] anbieten würden, dann hätten wir das erreicht, was Du haben wolltest.
Wie müssen also an der Passage
echo " <ul class="pagelink">\r\n";
for ($i = 0; $i <= $maxpage; $i++)
{
echo " <li class="pagelink"><a href="{$_SERVER['SCRIPT_NAME']}?page=$i">".($i+1)."</a></li>\r\n";
}
echo " </ul>\r\n";
arbeiten. Wie können wir nun erreichen, dass immer nur der Link _vor_ der aktuellen Seite und der Link _nach_ der aktuellen Seite generiert werden?
Wir fügen in die For-Schleife einfach eine weitere Bedingung ein:
for ($i = 0; $i <= $maxpage; $i++)
{
if($i == ($page-1) or $i == ($page + 1))
{
echo " <li class="pagelink"><a href="{$_SERVER['SCRIPT_NAME']}?page=$i">".($i+1)."</a></li>\r\n";
}
}
So! Nun haben wir nur noch zwei Links erzeugt. Es stehen aber immer noch die Nummern drin, und nicht [ZURÜCK] oder [WEITER]. Um dies zu erreichen, müssen wir die Bedingung in zwei zerlegen:
for ($i = 0; $i <= $maxpage; $i++)
{
if($i == ($page-1))
{
echo " <li class="pagelink"><a href="{$_SERVER['SCRIPT_NAME']}?page=$i">[ZURÜCK]</a></li>\r\n";
}
elseif($i == ($page + 1))
{
echo " <li class="pagelink"><a href="{$_SERVER['SCRIPT_NAME']}?page=$i">[WEITER]</a></li>\r\n";
}
}
Nun haben wir (hoffentlich, ich habe es nicht auf Fehlerfreiheit überprüft) schon mal das, was wir haben wollten. Für die beiden Texte [ZURÜCK] und [WEITER] werden nun die Links auf die passenden Seitennummern erzeugt.
Und wenn wir nun noch weiterdenken, könnten wir uns eigentlich auch die Schleife sparen...
if($page > 0)
{
echo " <li class="pagelink"><a href="{$_SERVER['SCRIPT_NAME']}?page=".($i-1)."">[ZURÜCK]</a></li>\r\n";
}
if($page < $maxpage)
{
echo " <li class="pagelink"><a href="{$_SERVER['SCRIPT_NAME']}?page=".($i+1)."">[WEITER]</a></li>\r\n";
}
Ersetzen wir die Schleife durch die obigen beiden Bedingungen, sollten wir auch das haben, was wir wollten. Achte auf die Klammerung der Therme ($i+1) und ($i-1). Sonst funktioniert es nicht, sie direkt in die teytausgabe einzubinden. PHP muss hier das Ergebnis der Berechnung in ein Literal umwandeln, bevor man es verknüpfen kann.
Viel Spaß weiterhin
PS: unter http://selfhtml.bitworks.de/snippets/directories_auslesen/readdir_&_blaettern/filelist_paginated.php habe ich noch ein bisschen weiter damit herumgespielt. Das wäre dann die nächste Stufe: Berechnung aud Ausgabe besser voneinander zu trennen...
Liebe Grüße aus Syburg
Tom vom Berg
du bist spitze...
vielen vielen vielen vielen vielen vielen dank.
Gruß
timur
soweit bin ich nun gekommen...
<?PHP
$i = 0;
$dateiarray = array();
$pfad = "../../aa/bb/";
if($ordner = opendir($pfad))
{
while($datei = readdir($ordner))
{
if($datei != "." && $datei != "..")
{
$dateiarray[$i] = $datei;
$i = $i + 1;
}
}
closedir($ordner);
}
$total = count($dateiarray);
$start = (isset($_GET['start'])) ? abs((int)$_GET['start']) : 0;
$limit = 4;
if ($start > 0)
{
$newStart = ($start - $limit < 0) ? 0 : ($start-$limit);
$zw = $newStart - $limit;
echo "<a href=".$PHP_SELF."?start=".$newStart."><< zurück</a>";
}
if ($start + $limit < $total)
{
$newStart = $start + $limit;
$zw = $newStart + $limit;
echo " <a href=".$PHP_SELF."?start=".$newStart.">vor >></a>";
}
for($a = $newStart; $a <= $zw; $a++)
{
echo "<br />$dateiarray[$a]";
}
echo"<br />";
echo"<br />";
echo"$_GET[start]";
?>
kann einer mir weiterhelfen?
Ich möchhte immer 4 Inhalte aus dem Array auslesen und anschlißend mit einer "Blätterfunktion" blättern.
Irgendwie scheint es nicht zu klappen. Probehalber habe ich im Ordner "bb" 11 Dateien abgelegt. Nun ist es komischerweise so, dass die ersten vier Dateien im Ordner nie angezeigt werden. Es wird die 5., 6., 7., 8. und 9. Datei angezeigt. Wenn ich nun auf "vor" klicke, wird die 9., 10. und 11. Datei und zwei leerzeilen angezeigt. Komischerweise gibts da dann auch noch ein "vor". Wenn ich dort auf "vor" klicke, kommt dann eine leere Seite mit "zurück" nur. Und wenn ich darauf klicke, komme ich dann ja auf die vorherige Seite mit den drei Dateien und zwei Leerzeilen, usw...
Warum?
Gruß
Timur
Hello,
{
$_dir = array();
while(false !== ($Datei = readdir($Verzeichniszeiger)))
{
$_entry = array()
$_entry['name'] = $file;
if (is_file($Datei))
{
$_entry['type'] = 'file';
{
elseif(is_dir($Datei))
{
$_entry['type'] = 'dir';
}
$_dir[] = $_entry;
}
closedir($Verzeichniszeiger);
}
echo "<pre>\r\n";
echo htmlspecialchars(print_r($_dir,1));
echo "</pre>\r\n";
?>[/code]
Bau das mal so um und lass Dir das Array ein paarmal hintereinander anzeigen.
Es sollte immer dasselbe sein, solange Du nicht zwischendurch Veränderungen am Verzeichnis vornimmst.
Wenn Du dann später die richtige Ausgabe machen willst, brauchst Du nur immer den passenden Indexbereich aus dem Array auszuschneiden. Das geht mit speziellen Arrayfunktionen, oder aber auch mit einer foreach-Schleife, bei der ein Zähler mitöuft, der mit dem Bereichsanfang und dem bereichsende verglichen wird.
Den Bereich ermittelst Du aus von
$seitennummer * $zeilen_pro_seite bis ($seitennummer + 1) * $zeilen_pro_seite
Du musst also Deinem Blätterformular eine Seitennummer beibringen. Mit submit-Buttons kannst Du die dann hoch- oder runterzälen lassen oder du benutzt parametrisierte Links.
Liebe Grüße aus Syburg
Tom vom Berg
Hello,
{
$_dir = array();while(false !== ($Datei = readdir($Verzeichniszeiger)))
{
$_entry = array()
$_entry['name'] = $file;
^
if (is_file($Datei))
^
{
$_entry['type'] = 'file';
{
elseif(is_dir($Datei))
^
{
$_entry['type'] = 'dir';
}$_dir[] = $_entry;
}
closedir($Verzeichniszeiger);
}
Da sind außerdem noch Fehler drin bezüglich des Pfades zur Datei.
Das habe ich eben übersehen...
Korrigier das also auch vorher noch.
Liebe Grüße aus Syburg
Tom vom Berg