Bernd: Bilder auf mehrere Seite aufteilen

Hallo,

ist es möglich auch ohne Datenbank Bilder auf mehrere Seite automatisch zu verteilen? Derzeit werden knapp 800 Bilder ausgelesen, dieses ruiniert mir gerade das Design.

Würde gerne pro Seite immer um die 30 Bilder haben und unten dann 1 | 2 | 3 usw…

<section class="pictures">
	<?php
	$ordner = "weihnachtsfeier/big";
	$alledateien = scandir($ordner);           
	 
	foreach ($alledateien as $datei) {
	 
		$dateiinfo = pathinfo($ordner."/".$datei); 
		
		if ($datei != "." && $datei != ".."  && $datei != "_notes" && $bildinfo['basename'] != "Thumbs.db") { 
	 
		//Bildtypen sammeln
		$bildtypen= array("jpg", "jpeg", "png");
		
		//Dateien nach Typ prüfen, in dem Fall nach Endungen für Bilder filtern
		if(in_array($dateiinfo['extension'],$bildtypen))
	{
	?>
		<a href="big-picture.php?bild=<?php echo $dateiinfo['basename']; ?>">
			<img src="weihnachtsfeier/_generate/big/<?php echo scaleImage($dateiinfo['basename'], h262.w366);?>">

		</a>
	<?php } }} ?>
	</section>
  1. Vom Dachboden zum Umbauen:

    <?php
    #Simulieren des Klicks:
    $_GET['page']=4;
    
    $pagination = new PicturesInPages ( './' );
    $pagination -> showPics();
    echo "\n<br><br>\n";
    $pagination -> showLinks();
    
    echo "\n<br><br>\nDEBUG:\n<pre>\n";
    print_r( $pagination );
    echo "\n\n";
    
    
    class PicturesInPages {
    	  public $arAllPics;
    	  public $maxImagesPerSite = 5;
    	  public $ImageTypes = '*.jpg *.jpeg *.png *.svg *.gif';
    	  public $ImageCount = 0;
    	  public $LastPage   = 0;
    	  public $page = 1;
      
    	function __construct( $directory ) {
    
    		# Lesen der Bilder unter Linux:
    		/*
    		foreach ( explode( "\n", `ls $directory -> $this -> ImageTypes` ) as $filename );
    			$this -> arAllPics[] = $filename;
    		}
    		#*/
    	   
    		#Simulieren der Bilder:
    		#/*
    		$this -> arAllPics = [];
    		for ( $i=1; $i<=18; $i++ ) {
    		   $this -> arAllPics[] = sprintf('%05s', $i);
    		}
    		#*/
    
    		$this -> ImageCount = count( $this -> arAllPics );
    		$this -> LastPage = ceil ( $this -> ImageCount / $this -> maxImagesPerSite );
    
    		if ( 
    			  isset( $_GET['page' ] )
    			  && (int)$_GET['page']
    			  && (int)$_GET['page'] <= $this -> LastPage
    		) { 
    		   $this -> page = $_GET['page'];
    		}
    	}
    		
    	function showPics() {
    
    		$iFirstImage = ( $this -> page - 1) * $this -> maxImagesPerSite;
    		$iLastImage  = ( $iFirstImage + $this -> maxImagesPerSite);
    		if ( $iLastImage >= $this -> ImageCount ) {
    			$iLastImage = $this -> ImageCount;
    		}
    
    		for ( $i = $iFirstImage; $i < $iLastImage; $i++)	{
    			echo "$i: " . $this -> arAllPics[$i] . "<br>\n";
    		}
        }
        
        
        function showLinks() {
    		$arr = [];
    		for ( $i = 1; $i <= $this -> LastPage; $i++ ) {
    			if ( $i != $this -> page ) {
    				$arr[] = "<a href=\"?page=$i\">$i</a>";
    			} else {
    				$arr[] = "<span class=\"aktuell\">$i</span>";
    			}
    		}
    		echo implode(' | ', $arr );
        }
        
    }
    
    1. Hallo,

      danke für dein Script. Dieses hat ja mit meinem überhaupt keine Ähnlichkeit mehr und ist um das xFache komplizierter. Schade, ich könnte mein einfaches Script erweitern. Deines ist mir ehrlich gesagt zu kompliziert.

      1. danke für dein Script.

        Bitte.

        Dieses hat ja mit meinem überhaupt keine Ähnlichkeit mehr

        Ja. Und?

        und ist um das xFache komplizierter.

        Naja. Muss wohl...

        Schade, ich könnte mein einfaches Script erweitern. Deines ist mir ehrlich gesagt zu kompliziert.

        Nicht alles, was kompliziert aussieht, ist es bei näherem Hinsehen immer noch. Oder wie der Schlosser sagt: "Wenn das dicke Eisen krumm werden soll, dann muss man tüchtig hämmern!"

        Du wolltest doch ein bestimmtes Resultat. Ich hab Dir schon mal den 500-Gramm-Hammer hingelegt. Es gibt da ganz andere Kaliber. Such mal nach

        Pagination Pics PHP

      2. Du musst nur den Part

        #Lesen der Bilder unter Linux:
        

        vielleicht anpassen, auf jeden Fall anschalten und den Part unter

        #Simulieren der Bilder:
        

        abschalten oder löschen.

        Und natürlich die echos bei den Ausgabefunktionen anhand Deiner Wünsche gestalten sowie die Anzahl der Bilder pro Seite konfigurieren.

        Das ist weder kompliziert noch viel Arbeit.

        1. <?php echo scaleImage($dateiinfo['basename'], h262.w366);?>
          

          Das ist Mist.

          Erstens wird das Bild beim Abruf skaliert - das ist "teuer" (Frisst sinnlos Leistung auf dem Server). Du solltest zumindest einen Cache haben. Ok ... den könnte die nicht gezeigte Funktion scaleImage bieten und nutzen. Allerdings glaube ich nicht daran, weil diese insgesamt recht fragwürdigen Charakters - Murks - ist.

          Zweitens gibt es eine Methode namens scaleImage des Imagick-Objektes.

          Drittens übergibst Du Deiner Funktion scaleImage einen String für den Dateiname und dann h262.w366. Und das ist Vielfach-Murks im allerbesten Sinn:

          Drittens A:

          h262.w366 könnte eine Konstante sein. Kann es aber nicht, weil der Punkt darin ist. Es können zwei concatenierte Konstanten sein (weil der Punkt darin ist) also ( Wert von h262 . Wert von w366 ) - Aber ich vermute, dass es auch so nicht ist. Es sollen wohl eher zwei Strings sein. Was dann die Verknüpfung (durch den Punkt) soll steht in den Sternen.

          Wenn ich also Deinen fehlerhaften Code in folgendem Mini-Skript konzentriere:

          <?php
          function scaleImage( $a, $b ) {
            echo "\n";
          }
          
          scaleImage('foo', h262.w366 );
          

          erhalte ich folgerichtig::

          PHP Warning:  Use of undefined constant h262 - assumed 'h262' (this will throw an Error in a future version of PHP) in /tmp/test.php on line 6
          PHP Warning:  Use of undefined constant w366 - assumed 'w366' (this will throw an Error in a future version of PHP) in /tmp/test.php on line 6
          

          Fazit aus Drittens A: Dein Skript wird irgendein PHP-Update nicht überleben. Und ist deshalb Murks. Es sei denn natürlich man will testen, ob man durch das Füllen des Error-Logs den Server zum Stillstand bringen kann. Ich kann bestätigen, dass das geht, denn hab einen wegen vergleichbaren Mists (eine Log-Datei füllte die Festplatte vollständig) stehenden Server schon "repariert".

          Drittens B:

          Wer zum Teufel übergibt an eine Funktion, die zwei Zahlen und zwei boleansche Werte zur Bestimmung der Skalierungsmethode braucht, einen (auch noch falsch notierten!) String aus dem dann wieder die eigentlichen Informationen teuer und fehlerträchtig "herausgelutscht" werden müssen?

          Aber mein Zeug ist "zu kompliziert"...

          Richtig macht man das, wenn man einen Ordner für Thumnails hat, darin die verkleinerten Bilder. Die können beim Upload oder beim ersten Abruf genau einmal erzeugt und ab dann ohne große Umstände als statische Ressource ausgeliefert werden. Dass kann sogar ein als 404er-Error-Ressource in der .htaccess definiertes Skript im/für das Verzeichnis tun (genauer: versuchen.) "It's so simpel and strong..."

          1. Lass es einfach gut sein! Deine ständigen Bemerkungen die nichts sagend sind gehen mir ehrlich gesagt auf die Nerven.

            Du weißt weder woher die Bilder kommen, redest aber von einem Upload, noch weißt du was ich damit vorhabe.

            Streite du dich lieber mit irgendwelchen Gerichten weiter rum und behaupte weiter, Richter können nichts aber lass mich einfach in Ruhe, denn es wurde danach von mir nicht gefragt.

            1. Deine ständigen Bemerkungen die nichts sagend sind

              Wenn Du kolportierst, dass meine obigen Bemerkungen für Dich "nichts sagend" seien, dann demonstrierst Du das Erreichen der höchsten, gemäß dem Peter-Prinzip für Dich möglichen Karrierestufe. Wie alt bist Du eigentlich?

              Streite du dich lieber mit irgendwelchen Gerichten weiter rum und behaupte weiter, Richter können nichts

              Das ist Unsinn. Denn ich sage: "Zu viele Richter erledigen ihren Job auf rechtswidrig-schlampige und voreingenommene Art und Weise." Und wenn ich - als Rechtslaie - in einem Verfahren vor dem LG Kassel gleich vier Richter erfolgreich wegen der "Besorgnis der Voreingenommenheit" ablehne, dann ist das eine Hausnummer bis zu der die weit überwiegende Anzahl der studierten (sogar promovierten) und zugelassen Anwälte in ihrem ganzen Berufsleben nicht vordringt. Das zeigt: Ich habe bei meinem Streiten a) nicht Unrecht und bin b) erfolgreich. Dein Versuch an einer Herabwürdigung meines unter allen relevanten Aspekten richtigen Verhaltens geht also in Leere.

              Ergo empfehle ich Dir wärmstens die Gelegenheit zu nutzen, meine Kritik an dem Skript ernst zu nehmen und, wenn Du Fragen dazu hast, diese zu stellen - statt "persönlich" zu werden, was Dich vorhersehbar noch viel mehr scheitern lässt.

              1. Hallo Jörg,

                mein Minus. Eine persönliche Attacke persönlich zu beantworten verbessert den Diskussionsstil nicht.

                Rolf

                --
                sumpsi - posui - clusi
                1. Eine persönliche Attacke persönlich zu beantworten verbessert den Diskussionsstil nicht.

                  Ja. Offensichtlich ist es besser, das anderen zu überlassen.

            2. Hallo Bernd,

              Du hast mich noch nie maulen gehört. (Bernd, 21.12.2018 10:53)

              Wenn Du nicht verstehst, was Jörg meint, ist es deswegen noch nicht inhaltsleer. Ihm ein „lass es einfach“ vor den Kopf zu knallen ist auch nicht wirklich die gute Reaktion, er investiert viel Zeit in dich.

              Er hat eine Merkwürdigkeit in deinem Code aufgezeigt und diskutiert, hinter der ein schwer wiegendes Performanceproblem stecken kann. Thumbnails muss man cachen, sonst kannst Du einen Popcornhandel aufmachen und das auf dem Server rösten.

              Wenn scaleImage eine cachende Hülle um Imagick oder ein anderes Bildertool ist, dann ist ja alles gut, dann war diese Sorge unberechtigt. Was es mit h262.w366 auf sich hat wird dadurch aber nicht klarer. Sind das mit define() erzeugte Konstanten? Oder vergessene Anführungszeichen?

              Übrigens hat er nicht von "Upload" geredet, sondern von "Upload oder erster Abruf". Mit der Bedeutung: bei passender Gelegenheit.

              Rolf

              --
              sumpsi - posui - clusi
              1. Hallo,

                Was es mit h262.w366 auf sich hat wird dadurch aber nicht klarer. Sind das mit define() erzeugte Konstanten?

                Nein h262 = Höhe 262px und w366 = Beite 366px

                1. Nein h262 = Höhe 262px und w366 = Beite 366px

                  Dann solltest Du der Funktion (und wohl auch der Quelle) in dem genau von mir beschriebenen und von Rolf B. verdeutlichtem Umfang vertrauen.

                  Zu den Größen hab ich noch einen Hinweis:

                  Auf hoch auflösenden Bildschirmen könnte das Resultat "ungewohnt" aussehen, weil deren Benutzer Ihre Geräte so einstellen, dass ein Bildpixel auf mehrere Bildschirmpixel verteilt wird. Und die Resultate der also notwendigen Vergrößerung der Thumbnails im Browser sind fragwürdig - denn die Browserhersteller wollen das möglichst schnell machen weil Schnelligkeit ein beworbenes Merkmal ist.

                  Mach die thumbnails einfach "doppelt" (524x732px) groß und gebe die Darstellungsgröße (<img style="width: 262px; height: 366px" ...) mit an. Die damit verbundene Erhöhung der Dateigrößen sollte sogar aus meiner, von (Ehr-)Geiz geprägten, Sicht vertretbar sein. Wenn Deine Ausgangsfotos keine Einheitsgröße haben, dann muss die resultierende Höhe und Breite auch mit ermittelt werden. ImageMagick kann das. Alternative: Passe die Grafiken, die nicht alles ausfüllen, in ein leeres Bild mit transparentem Hintergrund mittig ein. ImageMagick kann auch das.

                  Tipp: Schreib diese Daten bei der Erzeugung serialisiert (json würde ich im Hinblick auf die mögliche 1:1-Verwendung in JS nehmen) in eine Datei "bildname.png.meta.json" (im gleichen Ordner) und lese diese also einfach mit aus.

                  Dann wäre da noch was:

                  • 30 ist durch 10, 6, 5, 3, 2, 1 "teilbar". Macht 6 mögliche Teiler.
                  • 24 ist durch 12, 8, 5, 4, 3, 2, 1 "teilbar". Macht 7 mögliche Teiler.
                  • 20 Ist durch 10, 5, 4, 2, 1 "teilbar". Macht 5 mögliche Teiler.

                  24 wäre im Hinblick auf die mögliche Anpassung an Bildschirmbreiten mein Favorit bei der Festlegung der Anzahl der Bilder pro Seite.

                  1. @@ursus contionabundo

                    weil Schnelligkeit ein beworbenes Merkmal ist.

                    Mach die thumbnails einfach "doppelt" (524x732px) groß und gebe die Darstellungsgröße (<img style="width: 262px; height: 366px" ...) mit an. Die damit verbundene Erhöhung der Dateigrößen sollte sogar aus meiner, von (Ehr-)Geiz geprägten, Sicht vertretbar sein.

                    Wenn man dabei die Kompression hoch einstellt, ja. Das kann man tun, weil die Artefakte durch die Verkleinerung ja kaum sichtbar sind. ☞ Retina revolution

                    Oder man erstellt Thumbnails in zwei (oder mehr?) verschiedenen Größen und lässt den Browser auswählen, welche er jeweils lädt. ☞ Responsive images

                    LLAP 🖖

                    --
                    „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
  2. Hallo,

    ist es möglich auch ohne Datenbank Bilder auf mehrere Seite automatisch zu verteilen?

    Wie machst Du es denn mit Datenbank?

    MfG