Afficher la première photo d'un dossier

Eléphant du PHP | 160 Messages

03 juil. 2006, 01:59

Bonjour,
J'ai ce code qui m'affiche le contenu d'un dossier :
if ($voir == 1) {
$rep = "../abonnes/images/".$id."/";
$numimage = 1;		  
$dir = opendir($rep); 
while ($f = readdir($dir)) {
   if(is_file($rep.$f)) {
      echo "<div class=\"flottante\">";
	  echo "<div><a href=\"ajout_photo.php?voir=1&vignette=1&newname=".$f."&id=".$id."&numero=".$numimage++."\"><img src=\"../abonnes/images/".$id."/".$f."\" width=\"120\" height=\"120\" border=0></a></div>";
	  echo "<div class=\"fd-gris_fonce\">".$f."</div>";
	  echo "</div>";
   }
} 
}
else 
{
	echo "&nbsp;";
	}
Mais j'aimerais avoir la possibilité de faire en sorte qu'il m'affiche seulement la première image. J'ai essayé d'enlever la boucle mais ça ne marche pas.
Si quelqu'un peut m'aider,
Merci
Modifié en dernier par jpsartre le 03 juil. 2006, 11:14, modifié 1 fois.

Mammouth du PHP | 19672 Messages

03 juil. 2006, 07:36

Procède autrement. De la manière dont tu t'y prends, la première condition ne bloquera pas le nombre de tours de boucles. Proposition:
<?php
$rep = "../abonnes/images/".$id."/";
$numimage = 1;
$dir = opendir($rep);
/* On crée un compteur */
$i = 1;
while ($f = readdir($dir))
{
    if(is_file($rep.$f))
    {
        /* On vérifie le compteur, s'il dépasse le maximum souhaité, on quitte la boucle */
        if($i > 1)
        {
            break;
        }
        else
        {
            echo "<div class=\"flottante\">";
            echo "<div><a href=\"ajout_photo.php?voir=1&vignette=1&newname=". $f ."&id=". $id ."&numero=". $numimage++ ."\"><img src=\"../abonnes/images/". $id ."/". $f ."\" width=\"120\" height=\"120\" border=0></a></div>";
            echo "<div class=\"fd-gris_fonce\">".$f."</div>";
            echo "</div>";
        }
    }
}
?>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 160 Messages

03 juil. 2006, 10:40

Merci pour ton aide mais je n'ai pas réussi à le faire marcher.
Et j'ai essayé autre chose de plus court pour n'afficher que la première photo du dossier (si dossier existe alors vérifier que photo existe, si photo existe afficher la première, sinon afficher la photo par défaut :
$rep = "../annonces/".$Record->id."/"; 
$dir = @opendir($rep);
$f = @readdir($dir); 
if(is_file($rep.$f)) {
echo "<img src=\"../annonces/".$Record->id."/".$f."\" alt=\"photo\" width=\"60\" height=\"60\" class=\"image\" />";
   }
else 
	{
	echo "<img src=\"../images/image.gif\" alt=\"photo\" width=\"60\" height=\"60\" align=\"top\" class=\"image\" />";
	}
Mais ça ne marche pas non plus,
dans ce cas j'ai toujours la photo par défaut.
Si vous pouvez m'aider,
Merci d'avance

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

03 juil. 2006, 12:45

Il te faut nécessairement passer par la boucle, dans la mesure ou tu n'auras pas nécessairement un fichier en premier élément (il existe deux dossiers protégés du system qui sont "." et "..")

En revanche, il te suffit après avoir affiché le premier fichier que tu as trouvé utiliser l'instruction break pour sortir de ta boucle. La solution de Cyrano est interessante car elle te permet de paramétrer le nombre de fichier que tu veux récupérer (il a juste oublié d'incrémenter $i dans sa boucle ;))

Mais si tu ne veux qu'un seul fichier, tu peux simplement ajouter le break dans ton premier code :
while ($f = readdir($dir)) { 
   if(is_file($rep.$f)) { 
      echo "..."; 
      break;
   } 
}

Eléphant du PHP | 160 Messages

03 juil. 2006, 17:56

Merci pour votre aide,
J'ai maintenant ce code :
$rep = "../annonces/".$Record->id."/";       
$dir = @opendir($rep); 
while ($f = @readdir($dir)) { 
   if(is_file($rep.$f)) { 
echo "<img src=\"../annonces/".$Record->id."/".$f."\" alt=\"photo\" width=\"60\" height=\"60\" align=\"top\" class=\"image\" />";
break;    
   } 
   else
   {
echo "<img src=\"../images/image.gif\" alt=\"photo\" width=\"60\" height=\"60\" align=\"top\" class=\"image\" />";   
   }
} 
Il me semblait incorrect parceque j'avais l'impression que l'image par défaut ne pouvais s'afficher, et, surprise, j'ai deux fois la photo par défaut qui s'affiche et ensuite la photo du dossier si présente.
Si quelqu'un peut m'expliquer,
Merci encore, c'est déjà chouette de voir quelque chose à l'écran :wink:

Eléphant du PHP | 160 Messages

03 juil. 2006, 18:12

Là j'ai essayé un autre système :
	  $nb_f = 0;
	  $rep = "../annonces/".$Record->id."/"; 
$opdir = opendir($rep);
while ($c = readdir($opdir)) 
{
   if (!is_dir($c)) $nb_f++;
}

closedir($opdir);
if ($nb_f > 0) {
echo "<img src=\"../annonces/".$Record->id."/".$c."\" alt=\"photo\" width=\"60\" height=\"60\" align=\"top\" class=\"image\" />";
}
else
{
echo "<img src=\"../images/image.gif\" alt=\"photo\" width=\"60\" height=\"60\" align=\"top\" class=\"image\" />";
}
C'est juste que je n'arrive pas à récupérer le nom du premier fichier du dossier.
Si quelqu'un peut m'aider,
Merci

Eléphant du PHP | 160 Messages

03 juil. 2006, 20:53

Merci pour vos indications, le code fonctionne :
<code> $rep = "../annonces/".$Record->id."/";
$dir = @opendir($rep);
if ($dir) {
while ($f = @readdir($dir)) {
if(is_file($rep.$f)) {
echo "<img src=\"../annonces/".$Record->id."/".$f."\" alt=\"photo\" width=\"60\" height=\"60\" align=\"top\" class=\"image\" />";
break; }
}
}
else
{
echo "<img src=\"../images/image.gif\" alt=\"photo\" width=\"60\" height=\"60\" align=\"top\" class=\"image\" />";
}</code>
A bientôt

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

04 juil. 2006, 07:54

j'ai deux fois la photo par défaut qui s'affiche et ensuite la photo du dossier si présente.
Si quelqu'un peut m'expliquer
C'est parce que dans ta boucle, tu commences par lire les deux dossiers cachés "." et "..". Comme il ne s'agit pas de fichiers, il rentrait dans le else et t'affichait ton image par défaut avant de trouver la premiere image du dossier :)

Eléphant du PHP | 160 Messages

04 juil. 2006, 16:38

Merci pour l'explication,
Sinon, le code marche mais il ne me paraît pas très net par exemple à cause des @ pour cacher les messages d'erreurs et de mes \ en peu partout,
Si quelqu'un peut me conseiller
Merci

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

04 juil. 2006, 16:53

Pour les @ suffit de les virer et de t'assurer que $rep est bien un dossier, et puis pour les \ personnellement j'ai tendance à mettre mes chaines html entre apostrophes pour ne pas avoir à protéger les guillemets qui sont généralement beaucoup plus nombreuses :)

Suggestion :
$rep = "../annonces/".$Record->id."/"; 
if(is_dir($rep)) {
  $dir = opendir($rep); 
  while ($f = readdir($dir)) { 
    if(is_file($rep.$f)) { 
      echo '<img src="../annonces/'.$Record->id.'/'.$f.'" alt="photo" width="60" height="60" align="top" class="image" />'; 
      break; 
    } 
  } 
} 
else {
  echo '<img src="../images/image.gif" alt="photo" width="60" height="60" align="top" class="image" />'; 
}

Eléphant du PHP | 160 Messages

04 juil. 2006, 17:14

vraiment bien comme ça, et je ne connaissais pas le is_dir, bien pratique, et aussi le coup des guillemets :wink: comme on dit, l'enfer est pavé de bonnes intentions
Je trouve toutes les réponses à mes questions sur ce forum , c'est vraiment super d'aider les gens comme ça,
Merci encore
A bientôt

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

04 juil. 2006, 17:22

Y a pas de quoi :)
Je trouve toutes les réponses à mes questions sur ce forum
Et encore, t'as pas essayé de poser des questions du style "que faire à manger ce soir ?" ou "comment soigner mes géraniums ?", mais je suis certain que tu aurais des réponses interessantes également ;)