theoscar
Messages postés18Date d'inscriptionjeudi 5 mars 2009StatutMembreDernière intervention 5 mars 2009
-
24 avril 2007 à 21:25
theoscar
Messages postés18Date d'inscriptionjeudi 5 mars 2009StatutMembreDernière intervention 5 mars 2009
-
30 avril 2007 à 11:17
Bonjour à tous !
Voici un code qui affiche une image aléatoire sur une page à partir d'un dossier 'image'. Ce code fonctionne très bien mais j'aimerais que la recherche inclue aussi les sous-répertoires de 'image'. Pourriez vous m'aider?
Voici le code:
<?php
//On indique le dossier images
$chem_img = "./images";
//On ouvre le dossier images
$handle = opendir($chem_img);
//On parcoure chaque élément du dossier
while ($file = readdir($handle))
{
//Si les fichiers sont des images
if(preg_match ("!(\.jpg|\.jpeg|\.gif|\.bmp|\.png)$!i", $file))
{
$listef[] = $file;
}
}
$random_img = rand(0, count($listef)); //permet de prendre une image totalement au hasard (RANDom) parmi toutes les images trouvées.
//On calcule la largeur et la hauteur de l'image aléatoire
$size = getimagesize($chem_img."/".$listef[$random_img]);
//Largeur maximale de l'image pour la création des miniatures
$largeur_maxi = 500;
//Si la largeur dépasse la limite autorisée...
if ($size[0] > $largeur_maxi)
{
//...la nouvelle largeur est égale à la limite à ne pas dépasser
$width = $largeur_maxi;
//La largeur d'origine divisée par la largeur limitée (on obtient un chiffre qui sert à faire la même proportion pour la hauteur)
$theight = ($size[0]/$largeur_maxi);
//La hauteur originale est divisée par le chiffre obtenu précédemment afin que l'image conserve les mêmes proportions que l'originale (mais en mode vignette)
$height = ($size[1]/$theight);
}
else
{
//Sinon on garde la taille originale $width $size[0]; $height $size[1];
}
//On affiche l'image aléatoire (en respectant les standards ! :) )
echo "";
//On ferme le dossier
closedir($handle);
?>
theoscar
Messages postés18Date d'inscriptionjeudi 5 mars 2009StatutMembreDernière intervention 5 mars 2009 25 avril 2007 à 09:54
C'est pour ça que j'ai mis ça dans la rubrique PHP 'débutants', c'est parce que j'arrive pas à le mettre en forme correctement sans avoir plein d'erreurs. Google a beau être mon ami, je n'en reste pas moins un gros benet en PHP !
Si tu pouvais m'aider sur ce coup là, après ça j'ai fini mon projet ...
yoadsl
Messages postés120Date d'inscriptionmercredi 14 avril 2004StatutMembreDernière intervention22 mai 2007 26 avril 2007 à 20:48
je te conseillerais de mettre le parcours dans un autre fonction qui prend en entrée le nom du rep de départ et qui renvoie la liste des fichiers images et avant ou après ton preg_match tu utilise la fonction isdirectory ou is_directory je ne sais plus et si ça renvoit vrai ben tu appelle en récursif sur ce sous-répertoire en ajoutant le retour de ta fonction à la liste que tu crée
voilà voilà !
@+
theoscar
Messages postés18Date d'inscriptionjeudi 5 mars 2009StatutMembreDernière intervention 5 mars 2009 27 avril 2007 à 13:09
Voilà le code, mais j'ai du mal à comprendre .... concernant les messages d'erreur, j'en ai pas, j'ai juste une page blanche.
<?php
//On indique le dossier images
$chem_img = "./galerie/Photos/";
//On ouvre le dossier images
$handle = opendir($chem_img);
//pour chaque fichier et dossier
while ($fichier = readdir($handle))
{
//on ne traite pas les . et ..
if(($fichier != '.') && ($fichier != '..'))
{
//si c'est un dossier, on le lit
if (is_dir($handle.'/'.$fichier))
{
//Si les fichiers sont des images
if(preg_match ("!(\.jpg|\.jpeg|\.gif|\.bmp|\.png)$!i", $fichier))
{
$listef[] = $file;
}
}
$random_img = rand(0, count($listef)); //permet de prendre une image totalement au hasard (RANDom) parmi toutes les images trouvées.
//On calcule la largeur et la hauteur de l'image aléatoire
$size = getimagesize($chem_img."/".$listef[$random_img]);
//Largeur maximale de l'image pour la création des miniatures
$largeur_maxi = 500;
//Si la largeur dépasse la limite autorisée...
if ($size[0] > $largeur_maxi)
{
//...la nouvelle largeur est égale à la limite à ne pas dépasser
$width = $largeur_maxi;
//La largeur d'origine divisée par la largeur limitée (on obtient un chiffre qui sert à faire la même proportion pour la hauteur)
$theight = ($size[0]/$largeur_maxi);
//La hauteur originale est divisée par le chiffre obtenu précédemment afin que l'image conserve les mêmes proportions que l'originale (mais en mode vignette)
$height = ($size[1]/$theight);
}
else
{
//Sinon on garde la taille originale $width $size[0]; $height $size[1];
}
//On affiche l'image aléatoire (en respectant les standards ! :) )
echo "";
//On ferme le dossier
closedir($handle);
//fermeture du pointeur
closedir($pointeur);
?>
yoadsl
Messages postés120Date d'inscriptionmercredi 14 avril 2004StatutMembreDernière intervention22 mai 2007 30 avril 2007 à 02:21
Comme j'avais envie de me changer les idées de mon travail je me suis penché sur ton problème et voici la solution, je me suis permis de rajouter dans les dossier exclus ceux nommées miniatures vu ce que tu comptes en faire et le code est ultra-commenté pour que tu puisse comprendre ce que j'ai fait
<?
function parcours($chemin)
{
//on Crée un tableau vide
$listef=array();
//On ouvre le répertoire
$handle = opendir($chemin);
//On parcoure chaque élément du dossier
while ($file = readdir($handle))
{
//on élimine les dossiers indésirables
if(($file != '.') && ($file != '..') && ($file != 'miniatures'))
{
//Si les fichiers sont des images
if(preg_match ("!(\.jpg|\.jpeg|\.gif|\.bmp|\.png)$!i", $file))
{
//on les ajoute à la liste
$listef[] = $chemin."/".$file;
}
//si c'est un dossier
if(is_dir($chemin."/".$file))
{
//on appelle la fonction sur ce dossier et ajoute le résultat à la liste existante
$listef=array_merge($listef,parcours($chemin."/".$file));
}
}
}
//on fermer le répertoire
closedir($handle);
//on renvoie la liste de fichier obtenue
return($listef);
}
function imagerandom($chemin,$taillemax)
{
//puis on récupère les chemins de toutes les images
$listef=parcours($chemin);
//permet de prendre une image totalement au hasard (RANDom) parmi toutes les images trouvées.
$random_img = rand(0, count($listef));
//On calcule la largeur et la hauteur de l'image aléatoire
$size = getimagesize($listef[$random_img]);
//Largeur maximale de l'image pour la création des miniatures
$largeur_maxi = $taillemax;
//Si la largeur dépasse la limite autorisée...
if ($size[0] > $largeur_maxi)
{
//...la nouvelle largeur est égale à la limite à ne pas dépasser
$width = $largeur_maxi;
//La largeur d'origine divisée par la largeur limitée (on obtient un chiffre qui sert à faire la même proportion pour la hauteur)
$theight = ($size[0]/$largeur_maxi);
//La hauteur originale est divisée par le chiffre obtenu précédemment afin que l'image conserve les mêmes proportions que l'originale (mais en mode vignette)
$height = ($size[1]/$theight);
}
else
{
//Sinon on garde la taille originale $width $size[0]; $height $size[1];
}
//On affiche l'image aléatoire (en respectant les standards ! :) )
echo "";
}
yoadsl
Messages postés120Date d'inscriptionmercredi 14 avril 2004StatutMembreDernière intervention22 mai 2007 30 avril 2007 à 02:27
bon j'ai dû rajouter un espace sans faire exprès lors de mon copier-coller :
dans l'avant-dernière ligne de code :
target=\ "_blank"
il faut mettre
target="_blank"
@++
yoadsl
Messages postés120Date d'inscriptionmercredi 14 avril 2004StatutMembreDernière intervention22 mai 2007 30 avril 2007 à 02:32
lol c chiant qu'on puisse pas éditer ses messages !
encore un pour dire que si dans preference.php tu as mis des répertoires cachés n'oublie pas de les rajouter dans la ligne répertoire interdit (.,..,miniatures etc etc) sinon tes photos cachées s'afficheront aléatoirement
@+
theoscar
Messages postés18Date d'inscriptionjeudi 5 mars 2009StatutMembreDernière intervention 5 mars 2009 30 avril 2007 à 10:21
Merci pour ce super coup de main !! .... mais cela ne fonctionne pas, on dirait qu'il ne va pas chercher les sous dossiers.
Pour info, ce script est sur ma page index et va chercher les images dans les sous-dossiers de la galerie. ça donne :
la variable "$chemin=......." ne doit pas être renseignée quelque part, au moins pour donner un point de départ? ou alors c'est moi qui fait quelque vhose qui ne va pas.
yoadsl
Messages postés120Date d'inscriptionmercredi 14 avril 2004StatutMembreDernière intervention22 mai 2007 30 avril 2007 à 10:30
ben si il faut bien sûr spécifier le chemin :
l'appel de la fonction est de la forme imagerandom($chemin,$taille);
en l'occurence moi je l'appelle avec imagerandom("Photos",500);
donc d'après ce que tu dis tu devrais l'appeler avec imagerandom("galerie/Photos",500);
@+
theoscar
Messages postés18Date d'inscriptionjeudi 5 mars 2009StatutMembreDernière intervention 5 mars 2009 30 avril 2007 à 11:17
super tout fonctionne, en actualisant souvent la page pour tester, de temps en temps il ne trouve pas d'images mais je ne pense pas que cela soit un problème. Soit, j'actualise trop, soit je n'ai pas encore assez d'images dans mes dossiers. Je vais tester ça en conditions réelles.