Timur: DIR Ordner anzeigen

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

  1. 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

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. 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

      --
      Light travels faster than sound - that's why most people appear bright until you hear them speak.
      1. ``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

        1. 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

          --
          Light travels faster than sound - that's why most people appear bright until you hear them speak.
          1. 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

            1. 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);
              }

              for debug use

              #echo "<pre>\r\n";
              #echo htmlspecialchars(print_r($_dateiarray,1));
              #echo "</pre>\r\n";

              Präventiv anzuzeigende Seite auf 0 setzen

              $page = 0;

              ausrechnen, welches die höchstmögliche Seitennummer ist

              $maxpage = intval(count($_dateiarray)/$limit);

              Wenn per GET eine Seitennummer übermittelt wurde, diese benutzten

              if(isset($_GET['page']))
                {
                    $page = intval($_GET['page']);
                }

              Die erlaubten Grenzen überprüfen

              if ($page < 0)        { $page = 0; }
                if ($page > $maxpage) { $page = $maxpage; }

              Start- und Stopgrenze ermitteln

              $start = $page*$limit;
              $stop  = $start+$limit;

              Ausgabe durchführen

              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";

              Links aufbauen

              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

              --
              Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
              1. 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

                1. 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

                  • über Parameter im Link  (GET)
                  • über einen-POST-Parameter, wenn per Formular gearbeitet wird

                  Wenn per GET eine Seitennummer übermittelt wurde, diese benutzten

                  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

                  Links aufbauen

                  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

                  --
                  Nur selber lernen macht schlau
                  http://bergpost.annerschbarrich.de
                  1. du bist spitze...

                    vielen vielen vielen vielen vielen vielen dank.

                    Gruß
                    timur

            2. 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.">&lt;&lt; zurück</a>";  
              }  
                
              if ($start + $limit < $total)  
              {  
                $newStart = $start + $limit;  
                $zw = $newStart + $limit;  
                echo " <a href=".$PHP_SELF."?start=".$newStart.">vor &gt;&gt;</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

  2. 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

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. 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

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de