Killua: PHP: Nur Thumbnail anzeigen, wenn vorhanden

Hallo!

Folgende Ausgangslage:

Da gibt es 2 Bilder: "bild.jpg" und "bild_T.jpg" ("bild_T.jpg" ist das Thumbnail von "bild.jpg")

"bild.jpg" ist immer vorhanden, "bild_T.jpg" gibt es aber nicht immer.

Ein PHP Script soll nun prüfen, ob es die Thumbnail Variante mit "_T" gibt und diese anzeigen. Wenn nicht, soll eben das Originalbild gezeigt werden. Aber nur dann. Und an den letzten 3 Worten scheitere ich ...

if (file_exists("http ... bild_T.jpg")) {
      $thumbImageSRC = "http ... bild_T.jpg";
      #echo $thumbImageSRC . "<br>";
} else {
      $thumbImageSRC = "bild.jpg";
      #echo $thumbImageSRC . "<br>";
}

Wenn nun beide Bilder vorhanden sind, meint Else: echo $thumbImageSRC ist "bild.jpg" Was ja stimmt.

Nur wie bestimmt man, dass das "bild_T.jpg" Prorität hat?

  1. Moin,

    if (file_exists("http ... bild_T.jpg")) {
    

    Steht da eine http(s)-URL? Das wird nicht funktionieren, file_exists() funktioniert damit nicht – du musst hier mit Dateipfaden arbeiten.

    Gruß
    Tobias

    1. Steht da eine http(s)-URL? Das wird nicht funktionieren, file_exists() funktioniert damit nicht – du musst hier mit Dateipfaden arbeiten.

      Ja. Das aber, weil es auch mit den echten Dateipfaden genau das Gleiche war. Oder habe ich das was anderes versemmelt.

      Vllt. weil ich den Link zum Bild eigentlich mit pathinfo() hereinholte? Aber das brauche ich ja als src. (Im Beispiel habe ich es halt hartcodiert mit "http ..." notiert.)

      Wie sollte ich das Script ändern? Zuerst mit file_exists() das Vorhandensein der Datei(en) prüfen und dann den Link ausgeben?

      Irgendwie zu viel Wald und Bäume heute ...

      1. Liebe(r) Killua,

        weil es auch mit den echten Dateipfaden genau das Gleiche war.

        du willst also lokal vorhandene Bilddateien verarbeiten? Dann ist eine URL mit HTTP-Protokoll keine gute Idee. Mit file_exists() bist Du da schon richtig.

        Oder habe ich das was anderes versemmelt.

        Das ist sehr wahrscheinlich.

        Vllt. weil ich den Link zum Bild eigentlich mit pathinfo() hereinholte?

        Mit anderen Worten, Du hast das mit pathinfo() einfach mal probiert, ohne genauer zu studieren, was diese Funktion eigentlich exakt tut. Naja, anscheinend fängt jeder irgendwann so an.

        Bitte unterscheide zwischen dem Pfad eines HTTP-Requests und einem Pfad im Dateisystem! Das ist definitiv nicht das selbe!

        Aber das brauche ich ja als src.

        Da könntest Du Dich irren. Was verleitet Dich denn zu genau dieser Annahme?

        Zuerst mit file_exists() das Vorhandensein der Datei(en) prüfen und dann den Link ausgeben?

        Genau so. Der „Link“ soll wohl der Wert des src-Attributs sein? Oder was genau meinst Du jetzt mit „Link“?

        Ich erfinde mal eben kurz ein Szenario, anhand dessen Du sehen kannst, wie das mit den Pfaden so zusammenhängt. Stellen wir uns vor, Deine Dateien liegen so auf Deinem Server:

        + http_root (oder /var/www/dein-user-name oder wie auch immer)
        |
        +--+ htdocs (das Stammverzeichnis Deiner Web-Dateien)
        |  |
        |  +-- mein-script.php
        |  |
        |  +--+ Bilder
        |  |  |
        |  |  +-- bild.jpg
        |  |  |
        |  |  +-- bild_T.jpg
        

        Man kommt nun so an Deine Dateien:

        • http(s)://example.com/mein-script.php
        • http(s)://example.com/Bilder/bild.jpg
        • http(s)://example.com/Bilder/bild_T.jpg

        Im vom PHP-Script ausgegebenen HTML-Dokument müsste ein Pfad so aussehen:

        <img src="Bilder/bild_T.jpg" alt="Nasenspitze meiner süßen Katze">
        

        Das Vorhandensein dieser Datei kann in mein-script.php so aussehen:

        $bilder_dir = __DIR__.'/Bilder';
        $alle_dateien = glob($bilder_dir.'/*');
        
        foreach ($alle_dateien as $datei) {
          if (str_ends_with($datei, '.jpg')
            && !str_ends_with($datei, '_T.jpg')
          ) {
            // Vollbild erwischt!
            $thumbnail = str_replace('.jpg', '_T.jpg', $datei);
            if (file_exists($thumbnail)) {
              // Thumbnail gefunden!
            } else {
              // gibt kein passendes Thumbnail-Bild...
            }
          }
        }
        

        Den Code habe ich jetzt nicht getestet. Du schaust aber bitte sehr genau, wie ich die Pfadangaben durch die auto-magische Konstante __DIR__ erzeuge. In Deinem PHP-Script enthält diese Konstante nämlich den Pfad zum Verzeichnis, in dem Dein PHP-Script gespeichert ist. Und wenn Du weißt, wie es in seiner Umgebung aussieht, dann kannst Du entsprechend Unterverzeichnisse an diesen String anhängen (siehe $bilder_dir).

        Liebe Grüße

        Felix Riesterer

        1. Hallo Felix,

          Das Vorhandensein dieser Datei kann in mein-script.php so aussehen:

          Irgendwie bin ich heute im Widerspruchsmodus, tut mir leid.

          DIR.

          Kann man machen, wenn der Code in mein_script.php steht. Aber wenn er per Include hereingeholt wird, liefert DIR den Ordnernamen der Include-Datei, und das ist zumeist irgendwas anderes (in /vendor oder wasweißich). Ich würde da $_SERVER['DOCUMENT_ROOT'] verwenden.

          foreach

          Wieso eine Schleife über alle Bilder, um für bild.jpg zu entscheiden, ob ein Thumb da ist oder nicht? Du sagst, du hast das ungeprüft reingehackt. Ja. Du hast übersehen, dass deine Schleife den Bildnamen gar nicht verwendet. Da ist file_exists sinnvoller, glaube ich.

          Oder habe ich das was anderes versemmelt.

          Genau da müssen wir ansetzen. Ich würde sehr für "was anderes" plädieren. Abgesehen von Gunnars Einwurf, dass man besser das Thumb on-demand generiert und dafür auch besser einen eigenen Thumbs-Ordner erstellt.

          Rolf

          --
          sumpsi - posui - obstruxi
        2. Mit anderen Worten, Du hast das mit pathinfo() einfach mal probiert, ohne genauer zu studieren, was diese Funktion eigentlich exakt tut. Naja, anscheinend fängt jeder irgendwann so an.

          Naja, ich bin schon lange dabei. Doch seit die von mir betreuten Websites zu 99% WP sind, habe ich es irgendwie verlernt. Heute gehe ich alle paar Jahre mal in Codes rein.

          Bitte unterscheide zwischen dem Pfad eines HTTP-Requests und einem Pfad im Dateisystem! Das ist definitiv nicht das selbe!

          Weiß ich eh. Und ich weiß auch, das die PHP "Funktionen des Dateisystems" eben dafür sind. Doch da sich bei meinem ersten Versuch (mit echten Dateipfaden und deren Prüfungsmethoden!) auch irgendwie kein Erfolg einstellte, habe ich es dann versemmelt und Äpfel mit Birnen verglichen.

    2. Lieber tk,

      Steht da eine http(s)-URL?

      das ist sogar egal.

      musst hier mit Dateipfaden arbeiten.

      Das liegt daran, dass file_exists() einen Wrapper benötigt, der stat() unterstützt. Und wenn man dann den Links zu den Wrappern folgt, findet man auf der Seite zum HTTP-Protokoll, dass der eben keine Unterstützung für stat() hat.

      Oder lese ich das Handbuch hier falsch?

      Wenn man nur die Existenz einer Resource unter einer bestimmten URL testen will, habe ich auf Stackoverflow diese Antwort hier gefunden, die mit der PHP-Funktion get_headers() darauf prüft, ob der HTTP-Response-Code eine 200 ist, was ja bekanntlich „OK“ bedeutet. Damit nun aber nicht die ganze Datei über einen regulären GET-Request geladen wird, sondern mit einem HEAD-Request nur die Header-Daten gelesen werden, bietet das Handbuch für get_headers() ein Example #2 an, wo der relevante Teil das hier ist:

      $context = stream_context_create([
        'http' => ['method' => 'HEAD']
      ]);
      
      $headers = get_headers('http://example.com', false, $context);
      

      Es bleibt dann nur noch zu prüfen, ob im ersten Array-Element (mit dem Schlüssel 0) von $headers eine 200 und/oder ein „OK“ steht.

      Liebe Grüße

      Felix Riesterer

      1. Hallo Felix,

        die erste Frage wäre doch mal, ob diese Bilddatei im gleichen Web steht wie das PHP Script. Wenn ja, dann greift man nicht via HTTP auf sie zu, das wäre arg ungeschickt und unperformant, sondern über das lokale Filesystem.

        Das Script sieht aus als würde da ein <img src="...">-Element generiert.

        Killua meinte ja, er habe mit den "echten Dateipfaden" das gleiche Problem gehabt. Also sollte der Kram wohl auch auf einem Server liegen.

        Rolf

        --
        sumpsi - posui - obstruxi
  2. @@Killua

    Folgende Ausgangslage:

    Da gibt es 2 Bilder: "bild.jpg" und "bild_T.jpg" ("bild_T.jpg" ist das Thumbnail von "bild.jpg")

    "bild.jpg" ist immer vorhanden, "bild_T.jpg" gibt es aber nicht immer.

    Ein PHP Script soll nun prüfen, ob es die Thumbnail Variante mit "_T" gibt und diese anzeigen. Wenn nicht, soll eben das Originalbild gezeigt werden. Aber nur dann. Und an den letzten 3 Worten scheitere ich ...

    Ich denke, schon vorher. Mir scheint schon die Aufgabenstellung falsch zu sein.

    Es soll ein Thumbnail angezeigt werden. Wenn es dafür eine Variante gibt, lade die kleine Bilddatei, um zu übertragende Datenmenge zu sparen. Wenn es keine kleine Variante gibt, lade die große Bilddatei und zeige das große Bild als Thumbnail an.

    Habe ich das so richtig verstanden?

    Und da steckt der Fehler: Nutzern das Herunterladen einer großen Bilddatei aufzubürden, obwohl es nur in klein angezeigt werden soll. Der Entwickler wälzt sein Problem auf die Nutzer ab.

    Richtig wäre die Aufgabenstellung so: Wenn es eine Thumbnail-Variante gibt, dann übertrage diese. Wenn nicht, dann generiere das Thumbnail aus der großen Bilddatei, speichere sie auf dem Server und übertrage dann die kleine Variante.

    Zum Bildbearbeitung gibt es entsprechende Bibliotheken wie ImageMagick.

    Kwakoni Yiquan

    --
    Ad astra per aspera
    1. Hallo Gunnar,

      speichere sie auf dem Server

      Ein ordentlich konfigurierter Server erlaubt einem PHP Web keinen Schreibzugriff in seinen eigenen Ordner. Für Thumbs könnte man eine Ausnahme machen, dann sollten die aber in einem Thumbs-Ordner liegen, auf den man Sonderrechte einräumt, und nicht als bild_T.jpg im gleichen Ordner liegen.

      Rolf

      --
      sumpsi - posui - obstruxi
    2. Richtig wäre die Aufgabenstellung so: Wenn es eine Thumbnail-Variante gibt, dann übertrage diese. Wenn nicht, dann generiere das Thumbnail aus der großen Bilddatei, speichere sie auf dem Server und übertrage dann die kleine Variante.

      Klar. Aber: Im Falle Bludit werden diese Thumbnails eh generiert. Nur waren diese aufgrund eines querschießenden Plugins nur selten vorhanden und an völlig anderer Stelle als beabsichtigt. (Details dazu s. hier)

      Daher wollte ich wenigstens ggf. selbst manuell erstellte Vorschaubilder hochladen und diese mittels des Scripts ansprechen. Und falls der Betreiber keine weiteren Bildinstanzen hochgeladen hat, dann soll halt das Original verwendet werden. (Letzteres ist ohnehin Bludit-Standard, es gibt dzt. kein Theme, welches nicht die skalierten Originale darstellt.)

      Da sich nun aber herausstellte, dass die Bludit Kern-Funktionen brav Thumbnails erstellen und mittels einer einfachen Funktion im Theme anzeigen können, habe ich das nun so geändert. (was aber nur solange funkt, solange der Betreiber das Plugin "Media+") nicht aktiviert - ab da ist das halbe Bildhandling im Eimer.

      Zum Bildbearbeitung gibt es entsprechende Bibliotheken wie [ImageMagick]

      Ich kenne die imagecreate() Sachen noch von früher, wo ich noch regelmäßig PHP gecodet habe.

      Doch wie gesagt: Ich wollte das System Bludit (samt dem sehr simplen, aber funktionierenden Bildhandling) nicht neu erfinden.

      Fazit: Mein Script muss ich nun nicht mehr perfektionieren (was es lt. Rolf noch nötig hätte) - denn es ist unnötig. Das wusste ich nur vorher nicht ...

  3. Hallo Killua,

    Nur wie bestimmt man, dass das "bild_T.jpg" Prorität hat?

    So, wie Du es programmiert hast. Du fragst ab, ob das Thumb existiert, und wenn ja, gibst Du seinen Dateinamen aus. Andernfalls das Vollbild. Damit ist die Priorität gegeben.

    Wenn das nicht passiert, hast Du irgendeinen anderen Fehler drin, den du finden und korrigieren solltest.

    Mal angenommen, das Script wird über https://example.org/test.php aufgerufen und die Bilder sind unter https://example.org/images zu finden, dann sollte es definitiv so funktionieren:

    if (file_exists("images/bild_T.jpg")) {
       $thumbImageSRC = "images/bild_T.jpg";
    }
    else {
       $thumbImageSRC = "images/bild.jpg";
    }
    

    Der ELSE-Teil kann den THEN-Teil nicht überschreiben.

    Wenn PHP-Script und Bilder relativ zueinander anders liegen, musst Du den Abfragepfad ggf. anders erzeugen. Normalerweise ist beim Abruf einer PHP Seite der aktuelle Ordner immer der, in dem das abgerufene PHP-Script liegt. Von dort können Includes aus anderen Ordnern geholt werden, aber der aktuelle Ordner, also der, von dem aus Du die file_exists Abfrage machen musst, bleibt gleich.

    Wenn mit Rewrites gearbeitet wird oder Du PHP Scripte aus unterschiedlichen Ordnern abrufst, kannst Du auch über $_SERVER['DOCUMENT_ROOT'] den Ordner ermitteln, auf den https://example.org/ zeigt.

    Bist Du sicher, dass der richtige Dateiname abgefragt wird? Die Dateien Bild_T.jpg und bild_T.jpg sind unter Unix bekanntlich unterschiedlich.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Ich hab's geschafft!

      Grob gesagt ging es so:

      Zuerst die Datei-Pfade der beiden Bilder gesucht und geprüft, ob auch das Bild mit "_T" im Dateinamen vorhanden ist.^

      Wenn ein Thumbnail existiert, dann soll dessen http ... Link, Quelle, URL ? als img src da sein. Ansonsten das (von Bludit ohnehin per Funktion $page->CoverImage() gelieferte) Bild eben als src rein.

      Der genaue Code ist halt auch mit KONSTANTEN aus dem Basisprogramm (Bludit) versehen. Diese wollte ich Faulpelz berücksichtigen, um nicht alles mit Server-Variablen machen zu brauchen.

      <?php
      //  $page->coverImage() = die Bludit Funktion für's Beitragsbild
      if ($page->coverImage()) :
         #echo $page->coverImage();
      // http://xampp/bludittestsite/bl-content/uploads/bilder/bild.jpg
      
      // Originalbild Datei checken
      $coverImagePfad = PATH_UPLOADS . "bilder\\" . basename($page->coverImage());
         #echo "Originalbild Datei: " . $coverImagePfad ."<br><br>";
      // D:\xampp\bludittestsite\bl-content\uploads\bilder\bild.jpg
      
      // Thumbnail Datei (Originalbild + mit "_T" am Dateinamen) bauen
      $CoverImagePfadParts = pathinfo($coverImagePfad);
      $thumbCoverImage = $CoverImagePfadParts['dirname'] . "\\" . $CoverImagePfadParts['filename'] . "_T." . $CoverImagePfadParts['extension'];
         #echo "Thumbnail Datei: " . $thumbCoverImage . "<br><br>";
      // D:\xampp\bludittestsite\bl-content\uploads\bilder\bild_T.jpg
      
      // Thumbnail Datei-Pfad zu Bild-Link/URL machen
      $thumbCoverImagePfadParts = pathinfo($thumbCoverImage);
      $thumbCoverImageSRCURL = DOMAIN_UPLOADS . "bilder/" . $thumbCoverImagePfadParts['filename'] . "." . $thumbCoverImagePfadParts['extension'];
         #echo "Aktive Bild-SRC: " . $thumbCoverImageSRCURL . "<br>";
      // http://xampp/bludittestsite/bl-content/uploads/bilder/bild_T.jpg
      
      // Existiert die weiter oben gebaute Thumbnail Datei?
      // Wenn ja, nimm die zuvor gebaute Thumbnail-URL als Quelle
      if (file_exists($thumbCoverImage)) {
            $thumbCoverImageSRC = $thumbCoverImageSRCURL;
            #echo "Aktive Bild-SRC: " . $thumbCoverImageSRC . "<br>";
      // Wenn nicht, nimm das Bludit Standardbild-URL als Quelle:
      } else {
            $thumbCoverImageSRC = $page->coverImage();
            #echo "Aktive Bild-SRC: " . $thumbCoverImageSRC . "<br>";
      }
      ?>
                                       <figure class="cover-image size-medium is-resized">
                                          <a href="<?php echo $page->permalink(); ?>" rel="bookmark">
                                             <img src="<?php echo $thumbCoverImageSRC; ?>" alt="<?php echo $page->title(); ?>" title="<?php echo $page->title(); ?>" width="100%" height="100%">
                                          </a>
                                       </figure>
      <?php endif ?>
      

      Vllt. nicht elegant, aber es funkt!

      Danke an alle, der entscheidende Hinweis war, dass man Äpfel nicht mit Birnen, also Links, URLs oder wie das heißt, so nicht mit den PHP Funktionen für Datei-Pfade vergleichen kann. Oder so ...

      Danke nochmals und Gute N8!

      1. Hallo Killua,

        die coverImage-Funktion liefert Dir die Bild-URL aus Sicht des Browsers? Probier's mal mit coverImage(false). Soweit ich das sehe, ist das der "$absolute" Parameter und sein Defaultwert ist true. Und true bewirkt lediglich, dass der Filename durch das Voranstellen von DOMAIN_UPLOADS verschmutzt wird.

        Die Bludit-Doku ist - wie so oft bei OpenSource - absolut grottig. Eine systematische Dokumentation der Bludit-Klassen und ihrer Methoden? Fehlanzeige. Wie sagte ein Arbeitskollege mal: Der Sourcecode ist meine Doku. Hm. Ja.

        Ich weiß jetzt nicht, wie Du dein Bludit eingestellt hast (und ich weiß auch nichts über Bludit, ich bingse mir das gerade alles zusammen), es scheint aber, als würde DOMAIN_UPLOADS nicht auf den Bilderordner zeigen, sondern eins drüber, auf .../bl-content/uploads. Du würdest von coverImage(false) also 'bilder\bild.jpg' bekommen (oder 'bilder/bild.jpg', je nach Plattform).

        Warnung
        Bludit unterstützt auch externe Coverbilder. In diesem Fall bekommst Du von coverImage die URL dieses Bildes und keinen lokalen Pfad, egal ob Du true oder false als Argument übergibst! Dein Code kommt mit diesem Fall nicht zurecht. Meiner auch nicht…
        Achtung
        Im Bludit-Sourcecode finde ich auch eine Methode thumbCoverImage - löst die vielleicht dein Problem grundsätzlich? Hier scheint aber ein anderes Konzept vorzuliegen als Du verwendest. Die Bludit-Methode stellt dem Bildnamen ein DOMAIN_UPLOADS_THUMBNAILS voran, d.h. Bludit scheint einen eigenen Order für Thumbs vorzusehen. Wenn dieses Konzept dort existiert, warum willst Du es durch ein eigenes ersetzen? Wenn Du Bludit-Thumbs bisher nicht beachtet hast, schau Dir das erstmal an, bevor Du mit deinem _T Weg weitermachst.
        Achtung
        Von der Verwendung von "\\" in einem Dateipfad ist dringend abzuraten. Das \ ist Windows-spezfisch. PHP definiert eine Konstante DIRECTORY_SEPARATOR, die für DOS-Abkömmlinge ein '' und für den Rest der Welt ein '/' enthält. Bludit definiert darüber hinaus DS als Abkürzung dafür (siehe init.php). Andererseits kannst Du in Windows schon seit längerem \ und / gleichermaßen verwenden (in der CMD Shell musst Du den Dateinamen dann aber in Anführungszeichen setzen). Also nimm DIRECTORY_SEPARATOR oder /, in Bludit auch DS, aber niemals \

        Schreibe Dir eventuell zum Kombinieren von Pfaden eine Helperfunktion merge_path oder so, die das Problem von doppelten Pfadtrennzeichen löst. Das Thema wurde bei stackoverflow fleißig diskutiert.

        Es ist auch nicht wirklich nützlich, immer mit vollen Pfaden zu arbeiten. Ich nehme an, dass Dir $page->coverImage(false) "bilder/bild.jpg" liefert. Oder "bild.png". Oder "bilder/bild.gif" - wer weiß. Vielleicht sogar "bilder/bild.xy.png". Mit pathinfo() trennst Du das sauber in Pfad, Name und Extension.

        Damit hast Du die Komponenten die Du brauchst. Die Einzelteile des Bildnamens brauchst Du nur für die Konstruktion des Thumb-Namens (und wie gesagt: Bludit hat ein eigenes Thumbnail-Verzeichnis, wenn Du dieses Konzept nutzt, können Bild und Thumb gleich heißen und alles wird noch einfacher). Das ständige Zerlegen und Wiederzusammenbauen des Dateinamens brauchst Du überhaupt nicht.

        Und statt <?php echo $blabla; ?> nimmt man <?= $blabla ?> - wieso schreibe ich das eigentlich JEDEM?

        Damit wird der Code deutlich kompakter:

        if ($page->coverImage()):
           $coverImage = $page->coverImage(false);
           $cip = pathinfo($coverImage);
           $thumbImage = $cip['dirname'] . DS . $cip['filename'] . "_T." . $cip['extension'];
        
           if (file_exists(PATH_UPLOADS . DS . $localThumbImage)) {
              $httpThumbImage = HTML_PATH_UPLOADS . '/' . $thumbImage;
           } 
           else {
              $httpThumbImage = HTML_PATH_UPLOADS . '/' . $coverImage;
           }
        ?>
             <figure...>
               <a href="<?= $page->permalink() ?> rel="bookmark">
                 <img src="<?= $httpThumbImage ?>" alt="<?= $page->title() ?>" title="<?= $page->title() ?>">
               </a>
             </figure>
        <?php
        endif;
        

        Ich habe HTML_PATH_UPLOADS verwendet und nicht DOMAIN_PATH_UPLOADS, weil die Domain im Bildpfad nicht nötig ist. Falls Du auf das Bludit-Konzept für die Thumbnail-Ablage umsteigst, schau Dir init.php genauer an, da stehen alle verfügbaren Konstanten drin.

        width und height in % würde ich nicht ans img Element hängen. Hier gehört - wenn überhaupt - die intrinsische Größe des Bildes hin, damit der Browser den Platz dafür reservieren könnte. Die Anpassung an die Größe des Elternelements gehört ins CSS.

        Ich habe auf Verkürzungen wie "$cip[filename]_T.$cip[extension]" verzichtet, weil Du kein Freund davon zu sein scheinst. Aber Variablenparsing in Strings solltest Du Dir wirklich anschauen, das kann Code deutlich kompakter und lesbarer machen. Definierte Konstanten wie DS kann man darin aber nicht verwenden.

        Die Ermittlung des Thumb-Pfades könnte man auch in eine Funktion auslagern und so die ganzen Temp-Variablen aus dem globalen Namensraum heraushalten.

        if ($page->coverImage(false)):
        ?>
           <figure...>
             <a href="<?= $page->permalink() ?> rel="bookmark">
               <img src="<?= getThumbPath($page) ?>" alt="<?= $page->title() ?>" title="<?= $page->title() ?>">
             </a>
           </figure>
        <?php
        endif;
        
        ...
        
        function getThumbPath($page) {
           $coverImage = $page->coverImage(false);
           $cip = pathinfo($coverImage);
           $thumbImage = $cip['dirname'] . DS . $cip['filename'] . "_T." . $cip['extension'];
        
           if (file_exists(PATH_UPLOADS . DS . $localThumbImage)) {
              return HTML_PATH_UPLOADS . '/' . $thumbImage;
           } 
           else {
              return HTML_PATH_UPLOADS . '/' . $coverImage;
           }
        }
        

        Rolf

        --
        sumpsi - posui - obstruxi
        1. die coverImage-Funktion liefert Dir die Bild-URL aus Sicht des Browsers?

          Ja

          dass der Filename durch das Voranstellen von DOMAIN_UPLOADS verschmutzt wird.

          Das war keine Absicht, das war erst später, zwecks zurück übersetzen auf die Bild-URL, für src. Nicht wegen der vorigen Prüfung, ob die Datei da ist. Da habe ich eh PATH_UPLOADS drin.

          Die Bludit-Doku ist - wie so oft bei OpenSource - absolut grottig.

          So isses oft ...

          Der Sourcecode ist meine Doku. Hm. Ja.

          Ja, eh. Wenn der gut dokumentiert ist, warum nicht? Wie man an meinem "Werk" sieht, dokumentiere ich gerne im Code. Was aber keine erweiterten Extra-Notizen ersetzt.

          (und ich weiß auch nichts über Bludit, ich bingse mir das gerade alles zusammen),

          Wow, so viel werde ich nie darüber wissen. Es macht mir nur Spaß, mal ein eigenes Theme für dieses schnelle, leichte WP-light zu basteln. Dazu schaue ich alle Urlaubszeiten mal rein und bastle weiter. Oder wenn ich vom WP Update-Wahn wieder mal ange... bin.

          es scheint aber, als würde DOMAIN_UPLOADS nicht auf den Bilderordner zeigen, sondern eins drüber, auf .../bl-content/uploads.

          Ja.

          Und hier beginnt es, dass ich einiges berichtigen muss.

          Denn: Das ganze Script ist völlig unnötig gewesen! Auch wenn es (mal am XAMPP) funktioniert: Es wäre scheinbar nur dann nötig, wenn das Bludit Plugin "Media+" aktiv ist!

          Dann, und scheinbar nur dann werden die Bludit Bildhandling Funktionen derart verkorkst, dass man nur mit solchen Verrenkungen an ein (manuell (!) zu erstellendes) Thumbnail herankommt.

          So, und da "Media+" ohnehin nur mit Hilfe von Bludit Mod Edi (Danke!) und einigen eigenen Anpassungen zum laufen gebracht werden konnte, frag ich mich jetzt: War es das wert? So hoch ist der Komfortgewinn durch "Media+" auch wieder nicht, das man sich dafür die Ordner/Datei-Struktur komplett verhaut und das nur wegen dem Plugin die Thumbnails nicht mit den Kern-Funktionen erzeugt und angesprochen werden können.

          Also: Ohne "Media+" kommt man natürlich ganz einfach mit $page->thumbCoverImage() an die automatisch erstellten Thumbnails heran. Mit dem Plugin ... naja, wie gesagt, scheinbar nur mit solchen Konstrukten

          : Bludit unterstützt auch externe Coverbilder. In diesem Fall bekommst Du von coverImage die URL dieses Bildes und keinen lokalen Pfad,

          Ich weiß. Und sorry, dass ich nochmal auf "Media+" zurückkomme: Aber genau wenn das Plugin aktiv ist - kommt es automatisch zu "externen" Bild-URLs! Und nur dann! Und damit beginnen die Probleme ...

          Dein Code kommt mit diesem Fall nicht zurecht.

          Eben diese ...

          Achtung
          Im Bludit-Sourcecode finde ich auch eine Methode thumbCoverImage - löst die vielleicht dein Problem grundsätzlich?

          Ja, wie oben schon erwähnt, fand ich diese (gut versteckte und von keinem mir bekannten Theme genutzte) Funktion. Und die gibt mir genau das was ich will: Das Thumbnail! (Aber eben nur, wenn das besagte Plugin deaktiv ist)

          Bludit scheint einen eigenen Order für Thumbs vorzusehen. Wenn dieses Konzept dort existiert, warum willst Du es durch ein eigenes ersetzen?

          Eben, weil dieses Konzept durch "Media+" ausser Kraft gesetzt wird. (was ich bisher nicht wusste)

          ...schau Dir das erstmal an, bevor Du mit deinem _T Weg weitermachst.

          Dieser Weg ist eh nur nötig, wenn man das Plugin einsetzt. Was ich zu 99% nicht mehr tun werde.


          : Von der Verwendung von "\\" in einem Dateipfad ist dringend abzuraten.

          Danke, das hatte ich irgendwo verdrängt, vergessen.

          Es ist auch nicht wirklich nützlich, immer mit vollen Pfaden zu arbeiten.

          Hmm, oke ...

          Das ständige Zerlegen und Wiederzusammenbauen des Dateinamens brauchst Du überhaupt nicht.

          Eh nicht. Habe nun ein neues Projekt aufgesetzt, ohne das hier 99x genannte Medien-Plugin und siehe da: Alles geht von selbst. Und mit der oben erwähnten $page->thumbCoverImage() ist so ein Theme in einer Sekunde auf die Verwendung von Thumbnails umgebaut. (statt in Stunden, wie bei meiner Lösung)

          Und statt <?php echo $blabla; ?> nimmt man <?= $blabla ?> - wieso schreibe ich das eigentlich JEDEM?

          Mir hast du es noch nicht geschrieben 😉 Aber hier ist es halt so, dass das meist so im Code steht. Und aus Bequemlichkeit machte ich halt so weiter. Aber ich werde es mir merken, es gefällt mir auch besser.

          [init.php]

          Da habe ich die alle her

          width und height in % würde ich nicht ans img Element hängen.

          Klar! Das stand schon da und kommt noch weg. (keine Ahnung mehr, aus welchen Theme ich das habe - habe ja sicher 5 Themes verwurstet, die Rosinen rausgepickt und bastle irgendwann mein eigenes Theme daraus)

          Hier gehört - wenn überhaupt - die intrinsische Größe des Bildes hin, damit der Browser den Platz dafür reservieren könnte.

          Klingt nachvollziehbar

          Die Ermittlung des Thumb-Pfades könnte man auch in eine Funktion auslagern und so die ganzen Temp-Variablen aus dem globalen Namensraum heraushalten.

          Nicht nur das, wenn diese Konstruktion wirklich nötig ist, hätte ich das ganze auch noch gerne in ein Plugin verwandelt. So aber, wäre es maximal ein Addon zum Plugin "Media+", um dessen verkorkstes Bildhändling zu korrigieren.

          Ab hier weiß ich nicht so recht, was es genau bedeutet. Ich schaue mir das aber noch mehrmals an und versuche es zu verstehen.

          Ich habe auf Verkürzungen wie "$cip[filename]_T.$cip[extension]" verzichtet, weil Du kein Freund davon zu sein scheinst.

          Aber Variablenparsing in Strings solltest Du Dir wirklich anschauen ...

          Danke!