justinmassiot
9/11/2015 - 6:08 PM

[2010 - Sono SGDF] Get random pictures

List all pictures of a folder and get some that are recent, and some that are less recent. The number of shown pictures are configurable.

<?php
// example use: [!imagesAléatoires? &nombre=`5` &baseDir=`assets_/galleries/` &partRecentes=`40` &partSemiRecentes=`20` !]

/* *************************************************************************** /
//  version 3.0 , 21/09/2010 : ajout d'un ordre d'archivage (deux niveaux d'images récentes).
//  version 2.3 , 21/09/2010 : débogage amélioré, 2 bugs de récupération d'image corrigés (image unique dans année courante + années > 2009).
//  version 2.2 : déboguée, complétée, optimisée, protégée !
/ *************************************************************************** */


$startTime = microtime(true);


// ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** //
// paramètres du snippet
// ***** ***** ***** ***** ***** ***** //

// nombre d'images à montrer
$nbrImages = (isset($nombre))? (int)$nombre : 4;
if ($nbrImages > 5) $nbrImages = 5; // interdiction de montrer plus de 5 images
// nombre d'images des deux dernières années scolaires à montrer (en pourcentage)
$partRecentes = (isset($partRecentes))? (int)$partRecentes : 40;
if ($partRecentes < 0) $partRecentes = 0; // valeurs négatives interdites
else if ($partRecentes > 100) $partRecentes = 100; // valeur max = 100%
$partSemiRecentes = (isset($partSemiRecentes))? (int)$partSemiRecentes : 20;
if ($partSemiRecentes < 0) $partSemiRecentes = 0; // valeurs négatives interdites
else if ($partSemiRecentes > 100) $partSemiRecentes = 100; // cvaleur max = 100%
if ( ($partRecentes + $partSemiRecentes) > 100 ) $partSemiRecentes = 100 - $partRecentes; // priorité aux images les plus récentes en cas de dépassement
// nombre d'années parmi lesquelles rechercher
$nombreAnnees = (isset($$nombreAnnees))? (int)$nombreAnnees : 4;

// ---------- ---------- //

// répertoire source parent pour la recherche des images
$baseDir = (isset($baseDir))? $baseDir : "assets_/galleries/";
if (substr($baseDir, 0, 1) == '/') $baseDir = substr($baseDir, 1, strlen($baseDir));
if (substr($baseDir, strlen($baseDir)-1, strlen($baseDir)) != '/') $baseDir .= '/';

// ---------- ---------- //

define("DEBUG_IMAGES_ALEATOIRES", false);

// ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** //


// ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** //
// snippet core
// ***** ***** ***** ***** ***** ***** //

$nbrImagesRecentes = round( $nbrImages * ($partRecentes / 100) );
$nbrImagesSemiRecentes = round( $nbrImages * ($partSemiRecentes / 100) );
$nbrImagesArchives = $nbrImages - ($nbrImagesRecentes + $nbrImagesSemiRecentes);
$anneeFin = (date("m-d") >= "09-15")? date("Y")+1 : date("Y");
$anneeScolaireCourante = ($anneeFin-1)."-".$anneeFin;
$anneeScolairePassee = ($anneeFin-2)."-".($anneeFin-1);
if (DEBUG_IMAGES_ALEATOIRES) {
    echo "PARAMETRES :<br />\n";
    echo "nombre d'images recentes (annee scolaire en cours) : ".$nbrImagesRecentes."<br />\n";
    echo "nombre d'images semi-recentes (annee scolaire precedente) : ".$nbrImagesSemiRecentes."<br />\n";
    echo "nombre d'images anciennes : ".$nbrImagesArchives."<br />\n";
    echo "annee scolaire actuelle : ".$anneeScolaireCourante."<br />\n";
    echo "annee scolaire precedente : ".$anneeScolairePassee."<br />\n";
    echo "<br />\n";
}

// construction de la liste des dossiers sources, par année
$dossiersSources = array();
$i = ($partRecentes != 0)? $anneeFin : $anneeFin-1; // aucune photo récente à afficher, il faut donc rechercher indifféremment dans tous les dossiers
if (DEBUG_IMAGES_ALEATOIRES) echo $i."<br />\n";
while ($i > $anneeFin-$nombreAnnees) {
	$dossiersSources[] = ($i-1)."-".$i;
	$i--;
}
if (DEBUG_IMAGES_ALEATOIRES) echo nl2br( str_replace(' ' , "&nbsp;" , print_r($dossiersSources, true) ) );

// ---------- ---------- //

$recolteImages = array(
                        "anneeCourante" => array(),
                        "anneePassee" => array(),
                        "archiveImages" => array()
                    );
//echo nl2br( str_replace(' ' , "&nbsp;" , print_r($recolteImages, true) ) );

$i = 0;

// ouverture du répertoire source
if ($rootHandle = @opendir($baseDir)) {

    chdir($baseDir);
    // scan des sous-répertoires "années"
    while (false !== ($rootContent = readdir($rootHandle))) {
        if (DEBUG_IMAGES_ALEATOIRES) echo $rootContent."<br />\n";
        if ( $rootContent == $anneeScolaireCourante or in_array($rootContent, $dossiersSources) ) {
        
            // ouverture du répertoire "année"
            if ($yearFolderHandle = @opendir($rootContent)) {
                chdir($rootContent);
                // scan du répertoire "année"
                while (false !== ($yearFolderContent = readdir($yearFolderHandle))) {
                    if (DEBUG_IMAGES_ALEATOIRES) echo ">>> ".$yearFolderContent."<br />\n";
                    if (is_dir($yearFolderContent) and $yearFolderContent != "." and $yearFolderContent != ".." and $yearFolderContent != ".htaccess") {
                        
                        // ouverture du répertoire "évènement"
                        if ($eventFolderHandle = @opendir($yearFolderContent)) {
                            chdir($yearFolderContent);
                            // scan du répertoire "évènement"
                            while (false !== ($eventFolderContent = readdir($eventFolderHandle))) {
                                if (DEBUG_IMAGES_ALEATOIRES) echo ">>> >>> ".$eventFolderContent."<br />\n";
                                if (is_dir($eventFolderContent) and $eventFolderContent != "." and $eventFolderContent != ".." and $eventFolderContent != ".htaccess") {
                            
                                    if ($eventFolderContent == "thumbs") { // répertoire de miniatures photos
                                        // ouverture du répertoire des miniatures
                                        if ($thumbFolderHandle = @opendir($eventFolderContent)) {
                                            chdir($eventFolderContent);
                                            // scan du répertoire de miniatures
                                            while (false !== ($thumbFolderContent = readdir($thumbFolderHandle))) {
                                                if (DEBUG_IMAGES_ALEATOIRES) echo ">>> >>> >>> ".$thumbFolderContent."<br />\n";
                                                if (is_file($thumbFolderContent) and $thumbFolderContent != "." and $thumbFolderContent != ".." and $thumbFolderContent != ".htaccess") {
                                                    if ($partRecentes != 0 and $rootContent == $anneeScolaireCourante) { // correspond au répertoire de l'année en cours
                                                        $recolteImages["anneeCourante"][$i]["thumbnail"] = $baseDir.$rootContent.'/'.$yearFolderContent."/thumbs/".$thumbFolderContent;
                                                        $recolteImages["anneeCourante"][$i]["container"] = urlencode($rootContent.'/'.$yearFolderContent) . '&focus=' . $thumbFolderContent;
                                                    }
                                                    else if ($partSemiRecentes != 0 and $rootContent == $anneeScolairePassee) { // correspond au répertoire de l'année précédente
                                                        $recolteImages["anneePassee"][$i]["thumbnail"] = $baseDir.$rootContent.'/'.$yearFolderContent."/thumbs/".$thumbFolderContent;
                                                        $recolteImages["anneePassee"][$i]["container"] = urlencode($rootContent.'/'.$yearFolderContent) . '&focus=' . $thumbFolderContent;
                                                    }
                                                    else {
                                                        $recolteImages["archiveImages"][$i]["thumbnail"] = $baseDir.$rootContent.'/'.$yearFolderContent."/thumbs/".$thumbFolderContent;
                                                        $recolteImages["archiveImages"][$i]["container"] = urlencode($rootContent.'/'.$yearFolderContent) . '&focus=' . $thumbFolderContent;
                                                    }
                                                    $i++;
                                                } // end if
                                            } // end while
                                            chdir("..");
                                        } // end if
                                        else $randImages[] = "impossible d'ouvrir le répertoire '".$eventFolderContent."'\n";
                                    } // end if
                                        
                                } // end if
                            } // end while
                            chdir("..");
                        } // end if
                        else $randImages[] = "impossible d'ouvrir le répertoire '".$yearFolderContent."'\n";
                        
                    } // end if
                } // end while
                chdir("..");
            } // end if
            else $randImages[] = "impossible d'ouvrir le répertoire '".$rootContent."'\n";
            
        } // end if
    } // end while
    chdir("..");
}
else $randImages[] = "impossible d'ouvrir le dossier sources des images\n";
if (DEBUG_IMAGES_ALEATOIRES) echo "<br /><br />\n" . nl2br( str_replace(' ' , "&nbsp;" , print_r($recolteImages, true) ) );

// ---------- ---------- //

if ($partRecentes != 0 or $partSemiRecentes != 0) {
    // tirage aléatoire des images parmi les 3 tableaux différents

    $randKeysRecentes = array();
    $randKeysSemiRecentes = array();

    // pour l'année en cours
    if ($partRecentes != 0) {
        if (empty($recolteImages["anneeCourante"])) {
            // cas n°1 : il n'y a pas encore d'image pour l'année en cours
            if (DEBUG_IMAGES_ALEATOIRES) echo "aucune image pour l'année en cours<br />\n";
            $nbrImagesSemiRecentes += $nbrImagesRecentes; // les images devront être prises dans les années antérieures
            $nbrImagesRecentes = 0;
        }
        else {
            // cas par défaut : il existe au moins une image pour l'année en cours
            $nbrTrouveesRecentes = count($recolteImages["anneeCourante"]);
            if ( $nbrTrouveesRecentes < $nbrImagesRecentes ) {
                // il n'y a pas assez d'images (moins que demandé)
                if (DEBUG_IMAGES_ALEATOIRES) echo "pas assez d'images pour l'année en cours<br />\n";
                // ATTENTION : array_rand ne renvoie pas un tableau mais un nombre dans le cas où $nbrTrouveesRecentes==1
                if ($nbrTrouveesRecentes > 1) $randKeysRecentes = array_rand($recolteImages["anneeCourante"], $nbrTrouveesRecentes);
                else $randKeysRecentes = array(0);
                // donc on augmente le nombre d'images à prendre parmi les images de l'année passée
                $nbrImagesSemiRecentes += $nbrImagesRecentes - $nbrTrouveesRecentes;
                $nbrImagesRecentes = $nbrTrouveesRecentes;
            }
            else {
                // tout est ok
                if ($nbrImagesRecentes > 1) $randKeysRecentes = array_rand($recolteImages["anneeCourante"], $nbrImagesRecentes);
                else $randKeysRecentes = array(0);
            }
        }
    } // fin des images de l'année en cours

    // pour l'année précédente
    if ($partSemiRecentes != 0) {
        if (empty($recolteImages["anneePassee"])) {
            // cas n°1 : il n'y a pas d'image pour l'année précédente
            if (DEBUG_IMAGES_ALEATOIRES) echo "aucune image pour l'année précédente<br />\n";
            $nbrImagesArchives = $nbrImages - $nbrImagesRecentes; // les images devront être prises dans les archives!
        }
        else {
            // cas par défaut : il existe au moins une image pour l'année précédente
            $nbrTrouveesSemiRecentes = count($recolteImages["anneePassee"]);
            if ( $nbrTrouveesSemiRecentes < $nbrImagesSemiRecentes ) {
                // il n'y a pas assez d'images (moins que demandé)
                if (DEBUG_IMAGES_ALEATOIRES) echo "pas assez d'images pour l'année précédente<br />\n";
                // ATTENTION : array_rand ne renvoie pas un tableau mais un nombre dans le cas où $nbrTrouveesSemiRecentes==1
                if ($nbrTrouveesSemiRecentes > 1) $randKeysSemiRecentes = array_rand($recolteImages["anneePassee"], $nbrTrouveesSemiRecentes);
                else $randKeysSemiRecentes = array(0);
                // donc on augmente le nombre d'images à prendre parmi les images de l'année passée
                $nbrImagesArchives += $nbrImagesSemiRecentes - $nbrTrouveesSemiRecentes;
            }
            else {
                // tout est ok
                $randKeysSemiRecentes = array_rand($recolteImages["anneePassee"], $nbrImagesSemiRecentes);
            }
        }
    } // fin des images de l'année précédente

    // pour les années antérieures
    // sélection des images anciennes (en fonction du nombre de récentes déjà sélectionné)
    if ($nbrImagesArchives > 1) $randKeysArchives = array_rand($recolteImages["archiveImages"], $nbrImagesArchives);
    else if ($nbrImagesArchives == 1) $randKeysArchives = array(0);
    else $randKeysArchives = array();
    // fin des années antérieures

    // regroupement des index récoltés
    $randImages = array_merge( (array)$randKeysRecentes, (array)$randKeysSemiRecentes, (array)$randKeysArchives );
}
else {
    if ($nbrImagesArchives > 1) $randImages = array_rand($recolteImages["archiveImages"], $nbrImagesArchives);
    else $randImages = array(0);
}
if (DEBUG_IMAGES_ALEATOIRES) echo "<br /><br />IMAGES SELECTIONNEES :<br />\n";
if (DEBUG_IMAGES_ALEATOIRES) echo nl2br( str_replace(' ' , "&nbsp;" , print_r($randImages, true) ) );
// combinaison des 2 tableaux
// ATTENTION : ne pas utiliser array_merge(), qui ré-indexe les clés (alors que les dossiers ne sont pas forcéments lus dans le bon ordre, donc l'ordre serait erroné)
$arrayImages = $recolteImages["anneeCourante"] + $recolteImages["anneePassee"] + $recolteImages["archiveImages"];

// ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** //


// affichage final
if (is_array($randImages)) {
    foreach ($randImages as $imgKey) {
        echo "<a href=\"[~8~]?folder=" . $arrayImages[$imgKey]["container"] . "\"><img src=\"[(base_url)]" . $arrayImages[$imgKey]["thumbnail"] . "\" alt=\"" . $arrayImages[$imgKey]["thumbnail"] . "\" title=\"\" /></a>\n";
    }
}
else {
    echo "pas d'image\n";
}


$endTime = microtime(true);
if (DEBUG_IMAGES_ALEATOIRES) echo "<br /><br />temps d'exécution total : ".round($endTime-$startTime, 4)." secondes";

return;