kostenloser Webspace werbefrei: lima-city


Dateien limitiert auslesen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    geocaching-dermoench

    geocaching-dermoench hat kostenlosen Webspace.

    Hallo alle zusammen,

    Ich arbeite zur Zeit an einem Script für eine Bildergalerie, der alle 20 Bilder die Seite umbricht.
    (Also quasi Seite 2 und 3 ... automatisch erstellt...)
    Die Seiten werden soweit auch automatisch mit folgendenm Script erstellt:

    $images = array();
    $dir = "images/";
    $handle = opendir($dir);
    
    while(($daten = readdir($handle)) !== false)
    {
       if(preg_match("/\.(jpe?g|gif|png)$/", $daten))
       {
          $images[] = $daten;
       }
    }
    closedir($handle);
    
    $_all = count($images);
    $pages = ceil($_all / 20);
    
    for($i = 1; $i <= $pages; $i++)
    {  
       echo "<a href=\"/dir/dir/dir/?tk=$i\">$i</a><br />\n";
    }


    Nun wäre es aber von Vorteil, wenn der über die übermittelte $_GET - Variable Wert die Stelle der ausgelesenen Bilder bestimmt.
    Sprich, wenn $tk = 1 ist, sollen die Bilder 0 - 20 ausgelesen werden, wenn $tk = 2 ist, sollen die Bilder 21 - 41 ausgelesen werden usw.

    Mein erstes Problem ist dabei, wie ich diese Bilder auf diese Weise limitiert auslesen kann.
    Außerdem wäre es nicht schlecht, wenn der PHP - Script sich die nötigen Seiten selbst ausliest, dass ich nicht für jede neue Unterseite eine neue else if() - Schleife schreiben muss.

    Am besten wäre es, wenn ich die Bilder nur noch in den Ordner hochladen könnte und die Seite den Rest komplett selbst macht.

    Ich hoffe, man kann das irgendwie realisieren...
    mfG

    Mönch
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Gib deinem Script das Verzeichnis indem deine Bilder liegen

    Lass es rekursiv den Inhalt des verzeichnisses ermitteln und die einzelnen Pfade auf ein Array legen

    Ermittle den größten Index des Arrays

    Dividiere den größten Index deines Arrays -1 durch die Anzahl der Elemente pro Seite und runde das Ergebnis auf die nächste ganze Zahl auf.

    Nimm die so ermittelte Anzahl der Seiten -1 als Obergrenze der Zählvariable der 1. Schleife, und die Anzahl der Elemente von Startwert = 0 (1. Array Element) bis Bildanzahl pro Seite - 1 für die 2. Schleife (innerhalb der 1.) und erstelle deine 1. Seite.

    Setzte Startwert für die 2. Schleife nachdem sie das erste mal durchlaufen wurde auf ihren Endwert des 1. Durchlaufs + 1, die 2. und jede weitere Seite wird nun mit den jeweils nächsten Bildern erstellt bis keine Bilder mehr übrig sind und alle Seiten erstellt wurden

    Wie du die Seiten dann einbindest musst du dir noch überlegen, ich würde sie als HTML Dateien speichern und im Hauptscript schauen wie viele HTML Dateien es nach dem Muster des verwendeten Dateinamens gibt, und Links auf jede Datei erzeugen damit man durch die Seiten blättern kann, und die erste datei in einem iFrame oder sowas einbinden damit man beim aufrufen der Galerie sofort Bilder zu sehen bekommt.

    Das ausführen der Aktualisierung würde ich dann manuell über eine .htacess geschützte Admin Seite aufrufen wenn neue Bilder eingefügt wurden, da würden sich dann auch alle Paramenter (Bilder pro Seite, Quellverzeichnis der Bilder, Basisname der HTML Dateien usw. übergeben lassen) Das hat den Vorteil das deine Galerie nur neu aufgebaut wird wenn es tatsächlich gewünscht ist und nicht bei jedem Aufruf, solltest du das dynamisch wünschen dann solltest du am Anfang das Alte Array sichern und nach erstellen der neuen Inhaltsliste die beiden Arrays vergleichen, wenn diese sich nicht verändert haben kann man die Aktualisierung abbrechen, das entlastet den Server und beschleunigt den Seitenaufbau.



    Beitrag zuletzt geändert: 19.2.2012 12:20:09 von fatfox
  4. Autor dieses Themas

    geocaching-dermoench

    geocaching-dermoench hat kostenlosen Webspace.

    Hall & danke für deine schnelle Antwort!!

    Wenn ich den Text jetzt richtig interpretiert habe, sollte der Hauptteil (mit den beiden Schleifen) so aussehen:
    for($i = 0; $i <= $pages - 1; $i++)
        {
           $start = 0;
           $file = "gallery_". $start .".html";
           $handle = fopen($file, "x+");
          
           for($v = 0; $v <= 19; $v++)
           {
             fwrite($handle, "<img src=\"images/". $images[$i] ."\" class=\"thm\" />"; 
           }
    
           fclose($handle);
           $start = $v + 1;
        }

    oder?!

    mfG Mönch
  5. So in etwa habe ich mir das gedacht, ja, am besten sieht man es natürlich dann wenn man es probiert :-)

    edit: bei genauerer Betrachtung hast du glaube ich den falschen Index verwendet um das Bild auszuwählen (i) es müsste aber der index der 2. Schleife (v) sein denn so bekommst du immer das selbe Bild auf einer Seite.

    Die Obergrenze für v darf nicht hart codiert sein, weil sie sich ja beim 2. und jeden weiteren Durchlauf mit verändern muss wenn man es so angibt wie du das tust. was auch noch fehlt ist das Bestücken des Arrays für die Bilder, aber das ist von der Sache ja erstmal noch nicht funktionsrelevant.

    Beitrag zuletzt geändert: 19.2.2012 15:55:46 von fatfox
  6. Autor dieses Themas

    geocaching-dermoench

    geocaching-dermoench hat kostenlosen Webspace.

    Hallo,

    Nach ein wenig hin und her mit der richtigen URL der Bilder hat das soweit geklappt mit dem iFrame!
    Danke, ohne deine Hilfe säße ich wohl jetzt noch...

    Mit der Zeit, die gestern Abend noch so verging, habe ich aber auch einen Script erstellt,
    bei dem das ganze Ohne iFrame geht:
    <?php
    
    class Gallery
    {
       public $start;
       public $dir;
       public $limit;
       public $images = array();
       public $_all;
       public $pages;
       private $counter = array();
         
       public function __construct($st, $dir, $limit)
       {
          $this->start = $st;
          $this->dir = $dir;
          $this->limit = $limit;
       }
       
       public function readContent()
       {
          if(!is_dir($this->dir))
          {
             echo  "{$this->dir} ist kein Verzeichnis!";
             return false;
          }
          else
          {
             $handle = opendir($this->dir);
             
             while($daten = readdir($handle))
             {
                if(preg_match("/\.(jpe?g|gif|png)$/", $daten))
                {
                   $this->images[] = $daten;
                }
             }
             closedir($handle);
          }
       }
       
       public function countElements()
       {
          $_all = count($this->images);
          $pages = ceil($_all / $this->limit);
          $this->_all = $_all;
          $this->pages = $pages;
          return $_all;
       } 
       
       public function getImages($tag_start, $tag_end)
       {
          $end = $this->start + ($this->limit - 1);
          
          for($v = $this->start; $v <= $end; $v++)
          {
             if($end > $this->_all)
             {
                $end = $this->_all - 1;
             }
             
             echo $tag_start . $this->images[$v] . $tag_end;
          }
       }
       
       public function getPages($tag_start, $tag_close, $tag_end)
       {
         for($c = 0; $c <= $this->_all; $c = $c + $this->limit)
         {
            $this->counter[] = $c;
         }
         
         for($i = 0; $i <= $this->pages - 1; $i++)
         {  
            $echo = $i + 1;
         
            echo $tag_start . $this->counter[$i] . $tag_close . $echo . $tag_end;
         } 
       }
    }
       
    ?>


    Die Galerie wird dann als Objekt gespeichert und erstelt:
    <div>
    <?php
    
    require("gallery.php");
    
    if(isset($_GET['st']))
    {
       $gallery = new Gallery($_GET['st'], "images/", 1);
       $gallery->readContent();
       $count_all = $gallery->countElements();
       echo $count_all ." Bilder <br /><br />\n";
       
       $gallery->getImages("<img src=\"", "\" width=\"100\" height=\"75\" style=\"float: left; margin: 10px;\"/>\n");
       echo "</div><br /><br /><br /><br /><br />\n";
       $gallery->getPages("<a href=\"http://localhost/Tests/gallery_h.php?st=", "\">", "</a>  ");
    }
    else
    {
       echo "Die Galerie kann nicht angezeigt werden, da der Startparameter fehlt!";
    }
    
    ?>


    Funktionieren tut sie aber eigentlich nach demselben Prinzip... :)
    Danke!!

    mfG Mönch
  7. Hallo

    wie wäre es mit glob() und array_chunk()

    finde ich einfacher

    // ----- Bilder aus Ordner in Array 
    $images = glob("images/{*.jpg,*.gif,*.png}", GLOB_BRACE);
    $proseite = 20; // --- Ausgabe pro Seite 
    
    // ----- Seiten Navigation
    $img_all = count($images);
    $pages = ceil($pages / $proseite);
    
    for($i = 1; $i <= $pages; $i++) {  
       echo "<a href=\"/dir/dir/dir/?tk=$i\">$i</a><br />\n";
    }
    
    // ----- Image-Array in Teildaten splitten 
    $teildaten = array_chunk($images,$proseite); 
    
    
    // ----- Teildaten Index = aktuelle Seite -1 (minus eins) 
    if (!empty($_GET['tk'])) { 
       $runtk = ( $_GET['tk'] - 1 ); 
    }
    else { 
       $runtk = 0; 
    }
    
    // ----- Ausgabe-Array je nach Seite zuweisen 
    $showdata = $teildaten[$runtk];
    
    // ----- Ausgabe
    foreach($showdata as key => $item) { 
       $num = ($key+1); 
       echo "<br /> Nr: ".$num." <br /> <img src=\"".$item."\" border=\"0\" /> <br /><br /> \n"; 
    } 
    
    // --- ist doch ganz einfach :)


    auf Seite:1 ist der index von $teildaten = 0 ... Bilder 01 bis 20
    auf Seite:2 ist der index von $teildaten = 1 ... Bilder 21 bis 40
    auf Seite:3 ist der index von $teildaten = 2 ... Bilder 41 bis 60
    usw.



    Beitrag zuletzt geändert: 20.2.2012 17:50:52 von gameticker
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!