Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Bilderausgabe mit Blätterfunktion ohne DB

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Bilderausgabe mit Blätterfunktion ohne DB

    Hallo zusammen,

    eine Blätterfunktion zu bauen ist weniger ein Problem, wenn man die Datenbank dazu hat und das Limit in den Query mit einbauen kann. Nun aber zu meinem Problem.

    Ein auf dem Server vorhandenes Bilderverzeichnis weist mehr als 200 Bilder auf, es können je nachdem auch mal wieder mehr, mal wieder weniger werden.

    Mit folgendem Code kann ich diese auch ohne Probleme auslesen und darstellen.

    PHP-Code:
    $verzeichnis openDir("images");
    $i 1;
    while (
    $file readDir($verzeichnis)){
        if (
    $file != "." && $file != "..") {
            echo 
    '<td>
                    <a href="images/'
    .$file.'">
                      <img src="images_klein/'
    .$file.'" title="Bild" />
                    </a>
                  </td>'
    ;
        }
        
    // Wenn $i auf x hochgezählt, fängt die nächste Zeile an
        
    echo ($i == 0) ? '</tr><tr>' '';
        
    $i++;
    }
    closeDir($verzeichnis); 
    Dabei beende ich jede Zeile nach dem vierten Bild und beginne eine neue Zeile.

    Nun möchte ich aber wie schon beschrieben eine Blätterfunktion mit einbauen, da ich ungern mehr als 25 Bilder pro Seite anzeigen lasse und die Performance darunter leidet.

    Was würdet Ihr mir raten, wie ich weiter vorgehen soll, wenn ich es rein in PHP abbilden möchte?

    LG
    Delirius

  • #2
    Die Bilder im Verzeichnis als sortiert betrachten (etwa per Einlesen der Pfade mit glob) und dann wie in einer entsprechenden SQL-Query auch mit Limits (etwa über GET-Parameter) arbeiten und etwa nur n Bilder ab dem x-ten darstellen.

    Kommentar


    • #3
      Alternative:

      SQLite oder XML generieren die einen Index deiner Bilder repräsentieren, quasi die Dateien und Sortierungen ohne großen Aufwand "limitierbar" machen. Die Thumbnails könnten bei dem Indexing auch automatisch generiert und gecached werden ( statt das bild einzubinden würdest du ein php script als bildpfad zurückgeben welches den Cache handhabt und das jeweilige Bild generiert / lädt ). Zur Bildverifizierung bietet sich md5_file() an. Vorteil hier wäre das du neben dem Bildhash natürlich auch zusätzliche Bildinformationen wie Copyright, Größe / Auflösung, Typ, Titel oder sonstwas mitspeichern könntest, mitunter auch wie oft das Bild schon mal abgerufen wurde. Es wäre erweiterbar.

      Zumindest wäre das eine Möglichkeit vorrausschauend zu arbeiten statt nur ein Verzeichnis auszulesen um daraus einer Tabelle zu bauen, die eigentlich nichts weiter als (wahrscheinlich) wenig bis nichts aussagene zusammenhanglose Bilder darstellt.

      Kommentar


      • #4
        Bilderausgabe mit Blätterfunktion ohne DB

        Danke an mermshaus und tr0y für die Denkanstöße.

        @ tr0y

        Ich bezweifle keineswegs das dein vorgeschlagener Weg sicher mehr Sinn macht, aber aktuell bin ich noch zu sehr Anfänger, um zu verstehen wie man das genau angeht, welche Bibliotheken ich dafür benötige usw. Dafür muss ich noch einiges lernen und da ich auch gerne verstehe, was ich schreibe, versuche ich mich erstmal an einfachen Dingen.

        Deine Tipps hab´ ich mir aber bereits notiert und werde mich zu gegebener Zeit damit beschäftigen.

        Ich hab´s jetzt vorerst mit Arrays probiert und das hat ganz gut geklappt. Der Code anbei.

        Würde mich freuen, wenn ihr aufgefallene Fehler benennen und Verbesserungsvorschläge machen könntet.

        Danke vorab.

        PHP-Code:
        // Abfrage auf welcher Seite man ist
          
        $seite $_GET["seite"];

        // Wenn man keine Seite angegeben hat, ist man automatisch auf Seite 1
          
        if(!isset($seite)){
             
        $seite '1';
          }

        // Array aufbauen
          
        $files = array();
        // Verzeichnis benennen
          
        $v "images";
        // Verzeichnis öffnen
          
        $dir openDir($v);

        // Schleife laufen lassen, um die Bilder in das definierte Array zu schreiben
        // Dabei prüfen, ob die Dateinamen reguläre Dateien sind
          
        while ($file readDir($dir)){
              if (
        $file != "." && $file != ".." && is_file($v."/".$file)) {
                  
        $files[] = $file;
              }
          }
        // Verzeichnis schliessen
          
        closeDir($dir);
        // Anzahl der Dateien im Verzeichnis zählen
          
        $count count($files);
        // Einträge pro Seite: Hier 25 pro Seite
          
        $max 25;
        // Ausrechnen wo die Zählung der maximalen Anzahl der Bilder beginnt
          
        $start $seite $max $max;
        // Errechnen wieviele Seiten es geben wird
          
        $seiten $count $max;

        // Ausgabe der Links zu den Seiten
          
        for($a 0$a $seiten$a++){
             
        $b $a 1;
             
        // Wenn der User sich auf dieser Seite befindet, keinen Link ausgeben
             
        if($seite == $b){
                echo 
        '<div><b>'.$b.'</b></div>';
             } else {
                echo 
        '<div><a href="example.php?seite='.$b.'">'.$b.'</a></div>';
             }
          }

        // Anzahl der Bilder aus Array ausschneiden
        // $max -> maximale Anzahl
        // $start -> Beginn der Zählung
        // $files -> Verzeichnis aus dem die Dateien angezeigt werden sollen
          
        $output array_slice($files$start$max);

        // Schleife laufen lassen, um die gewünschte Anzahl an Bildern
        // darzustellen und nach jedem fünftem Bild eine neue Zeile beginnen
          
        echo "<table><tr>";
          
        $i 1;
          foreach(
        $output as $pics){
              echo 
        '<td>
                      <a href="images/'
        .$pics.'">
                        <img src="images_klein/'
        .$pics.'" alt="Bild" />
                      </a>
                    </td>'
        ;
              echo (
        $i == 0) ? '</tr><tr>' '';
          
        $i++;
          }
          echo 
        "</tr></table>"
        LG
        Delirius

        Kommentar


        • #5
          Im Prinzip gehst du schon richtig vor, auch das du durchweg kommentierst ist zu loben. Allerdings verkompliziert sich deine Logik hier und da weil du entweder die theoretische mathematische Seite nicht durchweg kennst oder den "PHP Wortschatz", genau den jeweiligen Befehl zur Realisierung von komplexeren arithmetischen Funktionen.

          Fangen wir mal Step-By-Step an. Das erste was du benötigst ( der Logik nach ) ist eine Menge an Dateinamen aus denen du dann Bilder inkl. Links generieren kannst. Man könnte jetzt hergehen und ganz simple Logik abbilden: "Verzeichnis öffnen", "Jeden Eintrag vergleichen ob...", "Wenn ... wert an Array anfügen", "Verzeichnis schließen". Machen wir auch, versprochen, nur einfacher als die Logik es sagt, noch einfacher unzwar mit [man]glob[/man]:
          PHP-Code:
          // verzeichnis XY auslesen ( komplett )
          $dirContent glob('xy/*');

          // array definieren das die Dateinamen enthält
          $images = array();

          // Verzeichnisstruktur filtern:
          foreach ( $dirContent as $item ) {
             if ( 
          is_file($item) ) $images[] = $item;

          Die hier abgebildete Logik sagt aus: "Lese Verzeichnis XY ein" & "Filter nur dateien heraus und füge sie an Array $images an".

          Im nächsten Schritt würdest du jetzt folgende Logik abbilden und anhand von Berechnungsschritten der Division und der Multiplikation herausfinden wo genau denn der aktuelle Zeiger so sein könnte. Die Logik ist ansich richtig, aber warum nicht eine Logik anwenden die genau das wiedergibt das du willst "Erzeuge Seiten-Abbilder zur Darstellung":
          PHP-Code:
          // Bilder als Seiten arrangieren

          // bestimme maximale Bilder-Anzahl pro Seite:
          $imagePerPage 25;

          // Erzeuge Daten-Array und Zeiger
          $imagePages = array();
          $imagePositionOnCurrentPage 1;
          $imagePage 1;

          foreach ( 
          $images as $bild ) {
             if ( 
          $imagePositionOnCurrentPage $imagePerPage ) {
                
          $imagePositionOnCurrentPage 1;
                
          $imagePage++; // wert um 1 erhöhen
             
          }

             
          $imagePages[$imagePage][] = $bild;

             
          $imagePositionOnCurrentPage++; // wert um 1 erhöhen
          }

          // Variablen verwerfen die wir auf keinen fall benötigen:
          unset($bild$imagePositionOnCurrentPage$imagePage); 
          Wir haben nun aus einem Großen Array mit allen Bildern ein Array erzeugt das Seiten enthält, jede Seite enthält wiederum ein Array mit maximal $imagePerPage * 1 Einträge. Es war dabei nicht nötig sich an der maximalen Anzahl an verfügbarer Dateien innerhalb eines Verzeichnisses zu orientieren, wir wendeten eine Einfachere Logik an: "Erzeuge aus einem Datenbestand von allen verfügbaren Dateinamen eines Arrays" oder kurz "EACH". Das geht prima mit [man]foreach[/man].

          Soweit so gut, nun erzeugen wir den HTML-Code der dazu nötig ist das Darzustellen was wir darstellen wollen. Ich arbeite hier ausnahmsweise mal nicht mit einem "Template" sondern konkatiniere die Strings wie du ( aneinanderketten von Strings = konkatinieren ) und gebe sie einzeln aus. Vorher bestimmen wir anhand des Array-Indexes "seite" des superglobalen Arrays "_GET", welche Seite denn da gerade dargestellt werden soll indem wir seine Existenz im $imagePages-Array prüfen. Ich muss hier aus dem übergebenen String aus $_GET['seite'] einen Integer erzeugen, da der Array-Indexer des Arrays $imagePages Integerwerte nutzt:
          PHP-Code:
          // aktuelle Seite auslesen und als integer speichern
          $pageToDisplay intval($_GET['seite']);

          // prüfen ob angefragte Seite existiert
          if ( isset($imagePages[$pageToDisplay]) ) {
             
          // seite existiert, gib sie aus:
             // -- Seite Navigation --
             
             // minimale und maximale Seitenzahl bestimmen
             
          $maxPageCount count ($imagePages);
             
          $minPageCount 1;

             
          // erzeuge ein Array mit seitenzahlen zwischen min und max
             
          $pages range($minPageCount$maxPageCount);

             
          // erzeuge html der navigation
             
          foreach ( $pages as $currentPage ) {
                
          // a - tag ausgeben:
                
          echo '<a href="example.php?seite='.strval($currentPage).'">';
                
          // zeige aktuelle seite mit einer rechteckigen öffnenden und schließenden Klammer
                
          if ( $currentPage == $pageToDisplay ) echo "[ ".$currentPage." ]";
                else echo 
          $currentPage;
                
          // schließe a - tag
                
          echo "</a>";
             }

             
          // -- Bilder-Tabelle --
             // Tabellen Grundgerüst:
             
          echo '<table>';

             
          // maximale Spalten mit Bilder:
             
          $maxColCount 5;

             
          // zeiger
             
          $curColCount 1;

             
          // Tabellen inhalt:
             
          foreach ( $imagePages[$pageToDisplay] as $imageOfCurrentPage ) {
                
          // liegt der aktuelle Spalten-Wert über dem maximalen Spalten-Wert setze ihn zurück:
                
          if ( $curColCount $maxColCount $curColCount 1;

                
          // falls das die erste Spalte ist, füge <tr> an:
                
          if ( $curColCount == ) echo '<tr>';

                
          // füge bild ein:
                
          echo '<td><a href="xy/'.$imageOfCurrentPage.'">
                      <img src="xy_thumbnails/'
          .$imageOfCurrentPage.'" alt="'.$imageOfCurrentPage.'" />
                    </a></td>'
          ;

                
          // falls das die erste spalte ist, füge </tr> an:
                
          if ( $curColCount == ) echo '</tr>';

                
          $curColCount++; // Spalten-Wert um 1 erhöhen
             
          }

             
          // table - tag schließen
             
          echo '</table>';
          }
          else {
             
          // seite existiert nicht, gib einen fehler aus:
             
          echo "Das 11. Gebot lautet: Du sollst nicht fummeln an Fremden Website-URLs!";

          Ich hab hier aus Gründen der selbstinitiative und der Förderung deines Logikverständnisses nicht mit einem Modula gearbeitet. Das ganze auf eine Modula-Funktion umzustellen stelle ich dir als Aufgabe. Es ist relativ einfach wenn man sich strikt daran hält simple Logik abzubilden und es nicht versucht verkompliziert abzubilden.

          Wie du siehst verwende ich in der eigentlichen Logik nur mathematische Funktionen und "tuhe xy für alles in..."-Funktionen. Ich bilde absolut simple logik ab, es erleichtet ungemein die Lesbarkeit wenn man "direkte" Logik sieht. Für deinen Fall mehr als genug. Für 10000de Dateien warscheinlich nicht ganz so performant.

          Was du hier vorfindest ist:
          - Addition
          - Multiplikation
          - WENN ... DANN ... Abfragen
          - RANGE Erzeugung

          Oder Kurz: Einfacher Logik abgebildet mit den Werkzeugen der Basics aus Mathematik und PHP.

          Weil einfach, einfach, einfach ist.

          Bin für jede Frage offen.

          P.S.: Ich hab hier auch explizit weggelassen die superglobale _GET auf existenz von "seite" zu prüfen, auch das soll deine Aufgabe sein, eine ähnliche Situation gibt es schon im Code bei der du "spicken" kannst, vergess dabei nicht: Simple Logik, verwenden du musst, junger Padawan.

          Kommentar


          • #6
            Bilderausgabe mit Blätterfunktion ohne DB

            Zitat von tr0y
            Allerdings verkompliziert sich deine Logik hier und da weil du entweder die theoretische mathematische Seite nicht durchweg kennst oder den "PHP Wortschatz", genau den jeweiligen Befehl zur Realisierung von komplexeren arithmetischen Funktionen.
            Leider beides

            Zu deinen mehr als ausführlichen Kommentaren und dem aufgeführten Code kann ich einfach nur danke sagen.

            Deinen ersten Abschnitt hab´ ich gleich auf Anhieb verstanden, da macht alles durchaus Sinn...anhand dessen seh´ ich auch gleich, was du mit
            Zitat von tr0y
            verkompliziert sich deine Logik hier und da
            meinst.

            Ich werd´ die einzelnen Schritte morgen in Ruhe durchgehen, "mein" Ergebnis werde ich dann wieder hier posten.

            Kommentar

            Lädt...
            X