Pb listage & affichage d'image

Petit nouveau ! | 8 Messages

10 avr. 2009, 07:02

Bonjour,
Je suis vraiment nul en PHP, j'ai besoin de votre aide s'il vous plaît.

Je voudrais coder un script image.php qui permet d'afficher UNE image depuis un répertoire spécifique contenant PLUSIEURS image.
Et une autre page album.php qui permet de lister tous les noms des images de ce répertoire, chaque nom est un support du lien vers l'affichage de cette image (à l'aide de image.php).

Seulement voilà, ce que j'ai réussit c'est d'afficher TOUTES les images et non pas une seule. Et donc lorsqu'on clic sur un nom d'image (donc un lien), ça les affiche toutes d'un coup. C'est pas du tout ce que je voulais.

Voici mon code
image.php
<?php

	$rp="coverart"; //répertoire contenant les images
	$rep=opendir($rp); //ouvrir le répertoire
	while ($fichier=readdir($rep)) { //lire le contenu de ce répertoire
	if (($fichier==".") || ($fichier=="..")) { //si l'image n'existe pas
		echo ""; //rien
		} 
	else {       
    //affichage des images dans un cadre   
		echo "<table align=center border=1><th><strong>";
		echo $fichier."</strong></th><br>";
		echo '<tr><td><a href="'.$rp."/".$fichier.'"><img src="'.$rp."/".$fichier.'"></a><br>';
		echo "</td></tr></table>";
     
		  }

    };
closedir($rep); //fermer le répertoire
?>
Ca donne quelque chose comme ça:
Image

Le script album.php ça je sais le faire.
C'est juste le script image.php, je sais pas comment lui dire d'afficher seulement l'image que l'on veut (quand on clic sur un nom d'image).

Merci

Avatar du membre
ViPHP
ViPHP | 3008 Messages

10 avr. 2009, 09:59

Je n'ai pas tout saisi, ton album (album.php) affiche toutes les images et quand tu cliques sur une des images, tu veux que ce lien pointe vers ton fichier image.php qui afficherait juste l'image en question ?

Petit nouveau ! | 8 Messages

10 avr. 2009, 13:10

Non, en fait, album.php sert à afficher une liste des noms (seulement les noms, pas de <img>), chaque nom est un lien qui pointe vers une page image.php qui afficherait l'image en question. (La liste des noms sera remplacé plus tard par une liste de vignettes par ex).
_________________

J'ai encore un autre problème.
Pour afficher les noms des fichiers images dans le répertoire courant (le même répertoire contenant album.php ET les images), j'utilise la fonction glob().
//les fichiers d'images du répertoire courant
foreach(glob({"*.jpg,*.gif,*.png"}, GLOB_BRACE) as $filename) 
              echo $filename."<br>";
Mais si dans ce répertoire il y a des sous répertoires, comment on fait pour qu'il (album.php) prenne en compte les images dans ces sous répertoires ?

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

10 avr. 2009, 15:01

Pour ton problème d'affichage de l'image, la solution est assez simple : il te suffit de spécifier dans ton lien un paramètre permettant d'identifier l'image à ouvrir par la page image.php (son nom en général fait bien l'affaire ;))

Dans ta page album.php tu génères des liens de la forme

Code : Tout sélectionner

<a href="image.php?affiche=nom_du_fichier">Cliquez ici pour ouvrir l'image nom_du_fichier</a>
Et dans ta page image.php tu récupères le paramètre spécifié
if (!empty($_GET['affiche'])) {
  $monImage = $_GET['affiche'];
  ...
  echo '<img src="' . $monImage . '" alt="blabla" />';
}

Quant à l'accès aux images des sous dossiers, il te faut en fait réaliser une fonction récursive.
En gros, tu dois faire une fonction qui va non seulement ramener les images avec glob() ou open_dir(), mais également les dossiers.
Il te faut ensuite tester le type de chaque élément récupéré (avec is_dir() par exemple) :
- Si c'est un fichier, tu affiches son nom, ton lien, etc.
- Si par contre c'est un répertoire, alors tu rappeles ta fonction en lui demandant de lister les images et dossier de ce répertoire.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 8 Messages

10 avr. 2009, 18:42

Merci beaucoup, ça marche nickel !

En fait, concernant image.php, c'est une page vide à la base. C'est seulement quand on l'appelle que ça va donner quelque chose. J'avais pas compris.

Encore merci.

Petit nouveau ! | 8 Messages

12 avr. 2009, 12:41

En fait, la fonction récursive marche très bien avec open_dir() mais pas avec glob(), voici le code avec glob(), est-ce que vous pouvez me dire où est l'erreur svp ?

Je préfère glob() car elle retourne un tableau, c'est plus pratique pour manipuler je pense.
function listing($chemin) 
{
     foreach(glob('*') as $filename)  //lister le contenu du dossier courant
    {
	   if(!is_dir($filename))  //si c'est un fichier
          {
	       echo '<li>'.$filename.'</li><br>'; //lister le
	   }
	    
       if(is_dir($filename)) //sinon
	   {
	       echo '<li>'.$filename.'<br>';
	       listing($chemin.'/'.$filename); //appeller la fonction listing pour le sous dossier
	       echo '</li>';
	    }
     }
     listing('.');
}

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

12 avr. 2009, 12:54

"Ca marche pas" est pas forcément une info d'une grande utilité pour débuger un code... un message d'erreur, un comportement, le résultat obtenu par rapport au résultat attendu... sont des données beaucoup plus intéressantes pour trouver ce qui ne fonctionne pas :)

Alors à première vue, ton listing('.') devrait je pense être en dehors de la fonction (à moins que tu ne veuilles parcourir le dossier courrant en plus de celui spécifié lors de l'appel ?), mais comme je sais pas ce qu'on cherche...

Sinon entre un foreach(glob()) ou un while (readdir()), y a pas forcément de grosse différence si c'est pour un affichage immédiat des noms des fichiers... Le tableau est effectivement plus pratique si tu en as besoin par la suite pour vérifier la présence d'un fichier, ou faire une comparaison de dossiers etc.

Ps : ah et histoire de simplifier ton code, un "sinon" en php, ça se traduit par un "else".. ça évite de devoir écrire tes conditions dans un sens puis dans l'autres, et de devoir en maintenir 2 le jour ou elle évolue ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 8 Messages

12 avr. 2009, 14:16

Oui, merci pour votre réponse.
Désolé je vais décrire ce qui se passe: alors si j'enlève l'appel de la fonction listing, comme suivant
function listing($chemin)
	{
	 foreach(glob('*') as $filename)
	 { 
	   if(is_dir($filename))
	   {
	     echo '<li>'.$filename.'<br>';
	     //listing($chemin.'/'.$filename);
	     echo '</li>';
	   }
	   else
	   {
	     echo '<li>'.$filename.'</li><br>';
	   }
	 }
	}
	listing('.');
Le résultat est
Image

Comme on a pas la fonction récursive, il affiche seulement le nom des sous dossiers (sousalbum, sousalbum2), et non leur contenu.

Le résultat attendu est le contraire (je crois que vous avez compris) , c'est à dire l'affichage des noms des fichiers dans ces sous dossiers sans afficher les noms de ces derniers.

Si je laisse l'appel de listing, il va afficher une liste infinie (la liste affichée est une liste des listes comme ci-dessus qui se répète infiniment), c'est pourquoi je ne fais pas une capture d'écran car on n'aura pas assez de place.