We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 36147
    • 21 Posts
    I used to use the following snippet for random images at my revo installation which worked very well:
    <?php
    //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    //  Snippet-Name:   randomImage
    //
    //  Funktion:       Durchsucht Verzeichnisse nach Bildern 
    //                  und gibt eines davon als Zufallsbild zurück
    //
    //  Parameter:
    //  ----------
    //  &folder         Verzeichnis der Bilder;
    //                  Standardwert: assets/images/
    //
    //  &file_types     Dateiendung(en), für die Dateien/Bilder, die angezeigt werden sollen.
    //                  Standardwert: jpg,gif,png
    //                  Optionen: Kommaseparierte liste von Dateiendungen
    //
    //  &defaultImage   Pfad und Name des alternativen Bildes;
    //                  Standardwert: assets/images/testbild.jpg
    //
    //  &orientation    Ausrichtung der Bilder, welche angezeigt werden sollen;
    //                  Standardwert: leer (= alle Bilder)
    //                  Optionen: landscape, portrait
    //
    //  &recursive      gibt an ob Unterverzeichnisse einbezogen werden sollen;
    //                  Standardwert: false
    //                  Optionen: true, false
    //
    //  &depth          Anzahl der Verzeichnisebenen;
    //                  Standardwert: false (= alle Unterverzeichnisse)
    //
    //  &maxfilesize    maximal erlaubte Größe der gefundenen Dateien in kB.
    //                  Standardwert: false
    //                  Optionen: Ganzzahl
    //
    //  &minwidth       minimal erlaubte Breite in Pixeln
    //                  Standardwert: false
    //                  Optionen: Ganzzahl
    //
    //  &minheight      minimal erlaubte Höhe in Pixeln
    //                  Standardwert: false
    //                  Optionen: Ganzzahl
    //
    //  &maxwidth       maximal erlaubte Breite in Pixeln
    //                  Standardwert: false
    //                  Optionen: Ganzzahl
    //
    //  &maxheight      maximal erlaubte Höhe in Pixeln
    //                  Standardwert: false
    //                  Optionen: Ganzzahl
    //
    //  &list_files     macht eine Auflistung der gefundenen Dateien (mit Größenangaben).
    //                  Dient nur für Testzwecke
    //                  Standardwert: nicht gesetzt
    //                  Optionen: Text oder Zahl
    //
    //  $tpl            Name eine Template Chunks für die Ausgabe.
    //                  Mögliche Platzhalter:
    //                      [+src+]         Dateipfad des Bildes
    //                      [+filename+]    Dateiname
    //                      [+width+]       Breite
    //                      [+height+]      Höhe
    //
    //                  Beispiel-Chunk: 
    //                      <img src="[+src+]" width="[+width+]" height="[+height+]" alt="[+filename+]" />
    //
    //
    //  Anwendungsbeispiele:
    //      [!randomImage?folder=`assets/images/` &orientation=`landscape` &recursive=`true` &depth=`2` !]
    //      [!randomImage?
    //          &folder=`assets/images/fotos`
    //          &defaultImage=`assets/images/default.jpg`
    //          &maxfilesize=`200`
    //          &minwidth=`150`
    //          &tpl=`tplRandomImage`
    //       !]
    //
    //
    //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    
    // Optionen für den Parameter &orientation
    $orientation_opt = array('portrait','landscape');
    
    // Verzeichnis in dem die Bilder liegen
    $folder         = strlen($folder) ? trim($folder,"/*")."/" : 'assets/images/';
    
    // Dateitypen, nach denen gesucht werden soll
    $file_types     = strlen($file_types) ? $file_types : "jpg,gif,png";
    
    // Alternatives Bild
    $defaultImage   = strlen($defaultImage) ? $defaultImage : 'assets/images/testbild.jpg';
    
    // Ausrichtung: portrait = Hochformat, landscape = Querformat, leer oder andere Angabe = beide Ausrichtungen
    $orientation    = strlen($orientation) && in_array(strtolower($orientation), $orientation_opt) ? strtolower($orientation) : ''; 
    
    // Sollen Unterverzeichnisse durchsucht werden?
    $recursive      = strlen($recursive) && in_array(strtolower($recursive), array("true","1")) ? true : false;
    
    // Verzeichnistiefe
    $depth          = strlen($depth) && (intval(trim($depth)) == trim($depth)) ? intval(trim($depth)) : false; 
    
    // Größenlimit in kB
    $maxfilesize    = strlen($maxfilesize) && (intval(trim($maxfilesize)) == trim($maxfilesize)) ? intval(trim($maxfilesize))*1024 : false;
    
    // Minimale und maximale Breite und Höhe der Bilder
    $minwidth       = strlen($minwidth) && (intval(trim($minwidth)) == trim($minwidth)) ? intval(trim($minwidth)) : false;
    $minheight      = strlen($minheight) && (intval(trim($minheight)) == trim($minheight)) ? intval(trim($minheight)) : false;
    $maxwidth       = strlen($maxwidth) && (intval(trim($maxwidth)) == trim($maxwidth)) ? intval(trim($maxwidth)) : false;
    $maxheight      = strlen($maxheight) && (intval(trim($maxheight)) == trim($maxheight)) ? intval(trim($maxheight)) : false;
    
    // Template
    if (strlen($tpl)) {
        $tplChunk = $modx->getChunk($tpl);
        if ($tplChunk) $tpl = $tplChunk;
    }
    
    $images = array();
    if (!function_exists('dir_rekursiv')) {
        function dir_rekursiv(&$images, $folder, $file_types = '', $recurs = false, $depth = false, $maxfilesize = false) {
            if (!strlen($folder)) return;
            $folder = trim($folder, "/*")."/";
            // Regulärer Ausdruck für die Dateityp-Erkennung
            $ext = strlen($file_types) ? explode(",",strtolower($file_types)) : ".+";
            $ext = "/".(is_array($ext) ? "(".implode("|",$ext).")" : $ext)."/";
            if (is_dir(MODX_BASE_PATH.$folder)) {
                $handle = opendir(MODX_BASE_PATH.$folder);
                while ($file = readdir($handle)) {
                    if (!in_array($file, array(".",".."))) {
                        // Wenn Verzeichniseintrag ein Verzeichnis ist
                        if ( is_dir(MODX_BASE_PATH.$folder.$file) ) { 
                            // Sollen Unterverzechnisse durchsucht werden?
                            if ( $recurs && (($depth === false) || ($depth > 0)) )
                                // Erneuter Funktionsaufruf, um das aktuelle Verzeichnis auszulesen
                                $images = array_merge($images, dir_rekursiv($images, $folder.$file, $file_types, $recurs, ($depth > 0 ? $depth-1 : false), $maxfilesize));
                        } else {
                            // Wenn Verzeichnis-Eintrag eine Datei ist, diese ausgeben
                            $file_type = strtolower(strrchr($file, "."));
                            // Dateityp überprüfen
                            $is_image = preg_match($ext, $file_type);
                            // Leere, zu große und Thumbnail-Dateien herausfiltern
                            $filesize = filesize(MODX_BASE_PATH.$folder.$file);
                            if ( $filesize && $is_image && !strpos($file,'thumb_') && 
                                 (($maxfilesize === false) || ($maxfilesize && ($filesize < $maxfilesize))) )
                                    $images[] = $folder.$file;
                        }
                    }
                }
                closedir($handle);
            } else return "Folder ".MODX_BASE_PATH.$folder." not found!";
            return $images;
        }
    }
    
    $images = dir_rekursiv($images, $folder, $file_types, $recursive, $depth, $maxfilesize);
    
    if (!is_array($images)) return $images;
    // Herausfiltern von doppelten Einträgen
    $images = array_unique($images);
    
    if (!count($images)) return $defaultImage;
    
    // Ausrichtung prüfen
    if (strlen($orientation)) {
        // Bilderliste nach Ausrichtung filtern
        foreach ($images as $i => $img) {
            $img = MODX_BASE_PATH.$img;
            if (file_exists($img)) {
                list($width, $height) = getimagesize($img);
                if ( ((($orientation === $orientation_opt[1]) && ($width < $height)) ||
                      (($orientation === $orientation_opt[0]) && ($width > $height))) ||
                      ($minwidth && ($width < $minwidth)) || ($minheight && ($height < $minheight)) &&
                      ($maxwidth && ($width > $maxwidth)) || ($maxheight && ($height > $maxheight)) ) {
                    unset($images[$i]);
                }
            } else return "File \"{$img}\" not found!";
        }
    }
    // Liste neu sortieren
    sort($images);
    reset($images);
    
    if (!count($images)) return $defaultImage;
    
    //Zum Testen: Listet alle gefundenen Bilder
    if (strlen($list_files)) {
        echo "<ul>";
        foreach ($images as $img) {
            list($width, $height) = getimagesize(MODX_BASE_PATH.$img);
            echo "<li>{$img} ({$width}×{$height}px | ".round(filesize(MODX_BASE_PATH.$img)/1024, 2)." kB)</li>";
        }
        echo "</ul>";
    }
    // Zufallszahl ermitteln
    $num = (int) rand(0, count($images)-1);
    $output = $images[$num];
    
    // Platzhalter im Template-Chunk ersetzen
    if (strlen($tpl)) {
        list($width, $height) = getimagesize(MODX_BASE_PATH.$output);
        $ph = array();
        $ph['[+src+]']      = $output;
        $ph['[+filename+]'] = basename($output);
        $ph['[+width+]']    = $width;
        $ph['[+height+]']   = $height;
        $output = str_replace(array_keys($ph), array_values($ph), $tpl);
    }
    
    return $output;


    My revo installation is a mess after upgrading to 2.2.1 because the icons aren't showing up in the backend, which makes the configuratioon quite difficult. As nobody knows a solution for the missing icons I decided to make a clean install of Revo and to import all content. I'm testing local.

    Everything works well except the random images. I imported the chunks like the following via database import:
    <img src="[[!ZufallsbildLokal? &folder=`assets/images/catering`]]" />

    and added the snippet.

    Everything's like in the working installation but the links are broken and looking like this:
    [20:55:53.199] GET http://localhost/modx/%3Cbr%20/%3E%3Cb%3ENotice%3C/b%3E:%20%20Undefined%20variable:%20file_types%20in%20%3Cb%3E/opt/lampp/htdocs/modx/core/cache/includes/elements/modsnippet/2.include.cache.php%3C/b%3E%20on%20line%20%3Cb%3E92%3C/b%3E%3Cbr%20/%3E%3Cbr%20/%3E%3Cb%3ENotice%3C/b%3E:%20%20Undefined%20variable:%20defaultImage%20in%20%3Cb%3E/opt/lampp/htdocs/modx/core/cache/includes/elements/modsnippet/2.include.cache.php%3C/b%3E%20on%20line%20%3Cb%3E95%3C/b%3E%3Cbr%20/%3E%3Cbr%20/%3E%3Cb%3ENotice%3C/b%3E:%20%20Undefined%20variable:%20orientation%20in%20%3Cb%3E/opt/lampp/htdocs/modx/core/cache/includes/elements/modsnippet/2.include.cache.php%3C/b%3E%20on%20line%20%3Cb%3E98%3C/b%3E%3Cbr%20/%3E%3Cbr%20/%3E%3Cb%3ENotice%3C/b%3E:%20%20Undefined%20variable:%20recursive%20in%20%3Cb%3E/opt/lampp/htdocs/modx/core/cache/includes/elements/modsnippet/2.include.cache.php%3C/b%3E%20on%20line%20%3Cb%3E101%3C/b%3E%3Cbr%20/%3E%3Cbr%20/%3E%3Cb%3ENotice%3C/b%3E:%20%20Undefined%20variable:%20depth%20in%20%3Cb%3E/opt/lampp/htdocs/modx/core/cache/includes/elements/modsnippet/2.include.cache.php%3C/b%3E%20on%20line%20%3Cb%3E104%3C/b%3E%3Cbr%20/%3E%3Cbr%20/%3E%3Cb%3ENotice%3C/b%3E:%20%20Undefined%20variable:%20maxfilesize%20in%20%3Cb%3E/opt/lampp/htdocs/modx/core/cache/includes/elements/modsnippet/2.include.cache.php%3C/b%3E%20on%20line%20%3Cb%3E107%3C/b%3E%3Cbr%20/%3E%3Cbr%20/%3E%3Cb%3ENotice%3C/b%3E:%20%20Undefined%20variable:%20minwidth%20in%20%3Cb%3E/opt/lampp/htdocs/modx/core/cache/includes/elements/modsnippet/2.include.cache.php%3C/b%3E%20on%20line%20%3Cb%3E110%3C/b%3E%3Cbr%20/%3E%3Cbr%20/%3E%3Cb%3ENotice%3C/b%3E:%20%20Undefined%20variable:%20minheight%20in%20%3Cb%3E/opt/lampp/htdocs/modx/core/cache/includes/elements/modsnippet/2.include.cache.php%3C/b%3E%20on%20line%20%3Cb%3E111%3C/b%3E%3Cbr%20/%3E%3Cbr%20/%3E%3Cb%3ENotice%3C/b%3E:%20%20Undefined%20variable:%20maxwidth%20in%20%3Cb%3E/opt/lampp/htdocs/modx/core/cache/includes/elements/modsnippet/2.include.cache.php%3C/b%3E%20on%20line%20%3Cb%3E112%3C/b%3E%3Cbr%20/%3E%3Cbr%20/%3E%3Cb%3ENotice%3C/b%3E:%20%20Undefined%20variable:%20maxheight%20in%20%3Cb%3E/opt/lampp/htdocs/modx/core/cache/includes/elements/modsnippet/2.include.cache.php%3C/b%3E%20on%20line%20%3Cb%3E113%3C/b%3E%3Cbr%20/%3E%3Cbr%20/%3E%3Cb%3ENotice%3C/b%3E:%20%20Undefined%20variable:%20tpl%20in%20%3Cb%3E/opt/lampp/htdocs/modx/core/cache/includes/elements/modsnippet/2.include.cache.php%3C/b%3E%20on%20line%20%3Cb%3E116%3C/b%3E%3Cbr%20/%3E%3Cbr%20/%3E%3Cb%3ENotice%3C/b%3E:%20%20Undefined%20variable:%20list_files%20in%20%3Cb%3E/opt/lampp/htdocs/modx/core/cache/includes/elements/modsnippet/2.include.cache.php%3C/b%3E%20on%20line%20%3Cb%3E189%3C/b%3E%3Cbr%20/%3E%3Cbr%20/%3E%3Cb%3ENotice%3C/b%3E:%20%20Undefined%20variable:%20tpl%20in%20%3Cb%3E/opt/lampp/htdocs/modx/core/cache/includes/elements/modsnippet/2.include.cache.php%3C/b%3E%20on%20line%20%3Cb%3E202%3C/b%3E%3Cbr%20/%3Eassets/images/catering/catering5.jpg [HTTP/1.1 404 Not Found 1ms]
    


    Can anybody give me a hint?

    Thanks a lot