Page 1 sur 2

Diaporama généré par PHP sans MySQL à partir d'un dossier d'

Posté : 04 sept. 2007, 22:44
par jpsartre
Bonjour,

Je dois faire un diaporama. J'ai une centaine de photos à mettre. Je ne dois pas utiliser MySQL et faciliter au maximum la mise à jour sachant que l'administrateur sait mettre les photos par le F T P.

Un abécédaire charge une IFRAME qui liste les artistes par nom. Lorsqu'on clique sur un artiste, sa photo apparaît dans l'IFRAME.

Donc, j'ai 26 page pour présenter les noms d'artistes et une page par photo, plus de 126 pages en tout, pour l'instant.

Je pense qu'il est possible de faire un code PHP qui liste les photos du dossier. Si je les nomme (et fait nommer pour les suivantes) bien, par exemple : NOM-PRENOM.jpg J'aimerais faire un code PHP qui liste les photos du dossier, et construit la page.
Par exemple, je clique sur A, le code PHP affiche dans l'IFRAME tous les noms d'artistes commençant par A en s'appuyant sur le nom des photos et réécrit correctement le nom d'artiste. Exemple : NOM PRENOM (majuscule pour contourner le problème des accents). Je clique sur l'artiste et la photo s'affiche dans l'IFRAME à la place de la liste des artistes.

Je ne vois pas comment m'y prendre, je faisais toujours avec des bases de données.
Est-ce possible et surtout auriez vous des indications, pistes ou des idées à me fournir pour cette opération.

Pour lire des dossiers portant un numéro d'id dont je ne connaissais pas le nombre de photo, j'avais utilisé cela :

Code : Tout sélectionner

$rep = "images/".$id."/"; $numimage = 1; $dir = opendir($rep); while ($f = readdir($dir)) { if(is_file($rep.$f)) { echo "<div class=\"flottante\"><div><a href=\"archives_galerie.php?voir=1&id=".$id."&numero=".$numimage++."\"><img src=\"images/".$id."/".$f."\" width=\"120\" height=\"120\" border=0></a></div><div class=\"fd-gris_fonce\">".$f."</div></div>"; } }
Le problème est qu'il y a des tris et de la réécriture (enlever les tirets et le .jpg) des noms d'artistes à partir des noms de photo et je ne connais pas cela.

J'aimerais vraiment réussir à faire ça d'une part pour éviter les taches répétitives pour moi et faciliter la mise à jour pour l'administrateur.

Merci pour votre aide,

Posté : 04 sept. 2007, 23:32
par sadeq
Php te servira certes à lister les noms recherchés par alphabet mais le système qui affichera la photo d'un nom cliqué peut être écrit en html et non par php car c'est très simple.

Je m'explique: étant donné que tu connais le dossier des photos et que l'admin en effectue la mise à jour par ftp, et que les noms des photos sont les mêmes que les noms des artistes tu n'as qu'à écrire un lien HREF html autour du nom de l'artiste affiché dans la liste ; lien qui pointe vers le nom de la photo dans son dossier et qui a comme target un iframe où l'image sera chargée.

Par exemple:
<table>
<tr><td colspan="2">Liste des artistes</td></tr>
<tr>
<td valign="top">
<div  style="width:200; height:500; overflow:auto">
<li><a href="ARTISTE1.jpg" target="iframe_photo">Artiste1</a>
<li><a href="ARTISTE2.jpg" target="iframe_photo">Artiste2</a>
</div>
</td>
<td valign="top"><iframe name="iframe_photo" width="200" height="200"/></td>
</tr>
</table>
Pour transformer ce redu html en générateur PHP, remarque que la seule variable à déterminer dynamiquement est le nom de l'artiste.

Posté : 04 sept. 2007, 23:51
par jpsartre
On dirait que je touche au but, merci pour ces informations. Il faut que je regarde encore tes explications pour bien comprendre mais j'ai aussi le problème de l'abécédaire.
Je viens de comprendre. Super.
J'ai fait ça pour lister le fichier :
		   $rep = "livre-d-or/";  
$dir = opendir($rep); 
while ($f = readdir($dir)) { 
   if(is_file($rep.$f)) { 
      echo "<p><a href=\"livre-d-or/".$f."\">".$f."</a></p>"; 
   } 
}  
J'ai bien tous les noms des photos qui apparaissent.

Mais je voudrais enlever l'extension pour l'affichage.

Et aussi j'ai fait mon lien sur la lettre A :

Code : Tout sélectionner

<p><a href="artistes.php?lettre=a" target="abecedaire_iframe">A</a></p>
Je voudrais récupérer la lettre A pour lui dire de n'afficher que les noms de fichiers commençant par A.

Comme cela j'aurai les noms des artistes commençant par A après je fais pareil pour B, etc...

C'est vrai que je pourrai leur faire 26 dossiers mais bon... c'est bête...

Si quelqu'un peut m'aider à rédiger la condition suivante : Si lettre=a alors afficher seulement les images dont la première lettre est a

Pas trouvé pour l'instant...

Encore merci (j'en étais à la lettre E, je m'y voyais passer la nuit)

Posté : 05 sept. 2007, 00:11
par sadeq
Pour rester dans ton code (oublie ma solution pour l'instant car t'es en plein travail là)
1. Le remplacement du - par un espace peut se faire par str_replace() ou preg_replace() t'as le choix sachant que la seconde repose sur une expression régulière.

2. Le filtrage des noms commençant par A, B ou ... peut se faire par une expression réguliaire et la recherche par preg_match()
L'expression régulière de recherhe d'un mot commençant par A s'écrit: #^A.*#
où les # sont les délimiteurs de l'expression ^A veut dire : commence par A et .* veut dire: suivi de n ou N caractères.

Pour l'appliquer en php utilise la fonction preg_match() par exemple:
if ( preg_match("#^A.*#", $nom_artiste) ) { Le nom commence par A } else { Non }
3. La recupération du paramètre A, B, .... choisi se fait par la méthode GET et le paramètre s'appelle lettre comme le dit ton lien:

Code : Tout sélectionner

<p><a href="livre-d-or/artistes.php?lettre=A" target="abecedaire_iframe">A</a></p>
La récuperation de lettre en php s'écrit alors:
$lettre = isset($_GET["lettre"])?$_GET["lettre"]:"A"; //par défaut la lettre A
le teste isset() permet de vérifier s'il ya eu postage de lettre (?) on affecte le $_GET et dans le cas contraire (:) on affecte la valeur par défaut "A". comme ça la liste affichera par défaut les artistes commençant par A.

Posté : 05 sept. 2007, 00:13
par jpsartre
J'ai bien lu tes explications, tout semble clair et pourtant je bloque. Je n'arrive pas à trier les artistes par lettre.
J'en suis là :
  <? 
		   $rep = "livre-d-or/";  
$dir = opendir($rep); 
while ($f = readdir($dir)) { 
   if(is_file($rep.$f)) { 
      echo "<p><a href=\"livre-d-or/".$f."\">".$f."</a></p>"; 
  }
} 

?>
Mon lien est toujours :

Code : Tout sélectionner

<a href="artistes.php?lettre=a" target="abecedaire_iframe">A</a>
J'ai essayé en vain de n'afficher les artistes commençant par A ... argh, si prés du but...

Je retourne lire tes explications

Posté : 05 sept. 2007, 00:34
par sadeq
Je vais t'aider:
sachant que la lettre est récupérée par:
$lettre = isset($_GET["lettre"])?$_GET["lettre"]:"A"; //par défaut la lettre A
si on veut que la recherche se fasse sur n'importe quelle lettre on écrit le preg_match comme ça:
if ( preg_match("#^$lettre.*#", $nom_artiste) ) { Le nom commence par la lettre choisie } 
Dans ton cas, le nom de l'artiste est la variable $f.

Posté : 05 sept. 2007, 00:38
par jpsartre
Ah oui merci,
Je crois que j'ai compris.
J'ai fait comme ça :
  		  $lettre = isset($_GET["lettre"])?$_GET["lettre"]:"A"; //par défaut la lettre A 
		   $rep = "livre-d-or/";  
$dir = opendir($rep); 
while ($f = readdir($dir)) 
{ 
   if(is_file($rep.$f)) { 
   // Enlever l'extension
$fichier = $f; 
$position = strrpos($fichier,'.'); 
if($position !== false) 
   $sans = substr($fichier,0,$position);
   
   if ( preg_match("#^$lettre.*#", $f) ) {  
      echo "<p><a href=\"livre-d-or/".$f."\">".$sans."</a></p>"; 
	  }
  }
}  
Lien :

Code : Tout sélectionner

<a href="artistes.php?lettre=A" target="abecedaire_iframe">A</a>
ça marche.

Et aussi comment j'aimerais bien classer les résultats par ordre alphabétique mais je ne vois pas comment ?


En tout cas c'est super pratique... quand je pense à ce que j'allais faire, x pages en html, et pour la mise à jour aussi, super pratique...

merci beaucoup pour ton aide

Posté : 05 sept. 2007, 08:55
par sadeq
Pour le tri, tu peux mettre les noms d'artistes trouvés par preg_match() dans un tableau au lieu de les afficher directement.
Exemple pour ajouter des éléments dans un tableau:
$tableau[] = "valeur1";
$tableau[] = "valeur2";
...
On n'a pas besoin de signaler l'indice quand on ajoute c'est automatique.

Puis quand le parcours du répertoire se termine, tu tri ton tableau par la fonction sort() qui fait le tri croissant.
Exemple:
$tableau_trié = sort($tableau_à_trier);

Posté : 05 sept. 2007, 12:08
par jpsartre
J'espérais un truc aussi simple que ORDER BY mais je me doutais qu'il fallait utiliser un tableau...
Et là c'est le blocage. Si tu peux m'en dire un peu plus parce que j'avoue ne pas comprendre comment procéder,

Je comprends :
$tableau_trié = sort($tableau_à_trier);
Mais je ne vois pas trop comment exploiter :
PHP: 
$tableau[] = "valeur1"; 
$tableau[] = "valeur2"; 
... 
C'est-à-dire comment l'adapter et où le placer dans le code.

Je vais de ce pas lire un peu sur les tableaux et vais essayer mieux comprendre le principe,

Merci

Posté : 05 sept. 2007, 15:50
par sadeq
Je t'encourage pour ta persévérance et ton amour d'apprendre mais je vais t'aider pour avancer.

Tu sais, dans ton code, tu fais une boucle qui affiche par un echo les noms d'artistes filtrés par lettre:
echo "<p><a href=\"livre-d-or/".$f."\">".$sans."</a></p>";
Sauf que maintenant tu ne veux plus afficher directement les noms que tu lis du répertoire mais tu souhaite les trier par ordre croissant avant de les afficher.

Ma suggestion était de les stocker d'abord dans un tableau par la boucle de lecture du répertoire, en suite trier le tableau et finalement afficher le contenu du tableau trié.

Posté : 05 sept. 2007, 23:35
par AB
Dans le tri de ton tableau utilise plutôt natsort();
ça te rendra service si certaines de tes images sont terminées par un nombre

Posté : 05 sept. 2007, 23:37
par jpsartre
J'ai bien compris la logique de la manoeuvre mais impossible d'y arriver, le code n'est pourtant pas bien long et j'ai essayé dans tous les sens...

Alors pour l'instant j'en suis là :
$lettre = isset($_GET["lettre"])?$_GET["lettre"]:"A"; // La lettre A par défaut 
$rep = "livre-d-or/";  
$dir = opendir($rep); 
while ($f = readdir($dir)) 
{ 
   if(is_file($rep.$f)) { 
 
   // Enlève l'extension
$fichier = $f; 
$position = strrpos($fichier,'.'); 
if($position !== false) 
   $sans = substr($fichier,0,$position);
   if ( preg_match("#^$lettre.*#", $f) ) { 
      // Stocke dans un tableau avant classement par ordre alphabétique
         echo "<p><a href=\"livre-d-or/".$f."\">".$sans."</a></p>"; 
	  
	  }
  }

} 
Je n'arrive pas à adapter à mon code. Si tu peux encore m'aider...
Pas évident à saisir ces tableaux. En fait je me perds dans les variables...

Et quoi que je fasse je n'ai pas de message d'erreur pour m'aider, soit rien ne se passe, soit les noms affichés sont remplacés par des 1 mais jamais dans l'ordre alphabétique....

Et merci pour le natsort(); car j'utilise effectivement des images qui se terminent par des nméros étant donné que certains artistes ont plusieurs photos. Mais pas évident tout cela...

Posté : 06 sept. 2007, 00:06
par AB
Sur le principe, par exemple pour afficher les fichiers d'un dossier par ordre alphabétique
 $list = opendir($dossier);
  
  $tabfile = array();
  
  while ($fichier = readdir($list)) 
           {// lit les fichiers et les insère dans le tableau $tabfile
           ($fichier != "." && $fichier != "..")? $tabfile[] = $fichier : '' ;
           }
  closedir($list);
  
  //tri du tableau
  natcasesort($tabfile);
  
  //lecture du tableau trié
  foreach($tabfile as $file)    
	  {
	  echo $file.'<br />';
  	  }

Posté : 06 sept. 2007, 00:13
par jpsartre
J'ai essayé et j'ai eu soit une page vide, soit les noms qui se répétaient plusieurs fois chacun sans être classés.
J'y retourne

Posté : 06 sept. 2007, 00:35
par AB
Evidemment, pour que cela fonctionne il faut indiquer le chemin d'un répertoire pour $dossier. Pour lister ton répertoire PHOTO par exemple (si PHOTO est au même niveau que ton script) :
$dossier = 'PHOTO';

$list = opendir($dossier);
  
  $tabfile = array();
  
  while ($fichier = readdir($list)) 
           {// lit les fichiers et les insère dans le tableau $tabfile
           ($fichier != "." && $fichier != "..")? $tabfile[] = $fichier : '' ;
           }
  closedir($list);
  
  //tri du tableau
  natcasesort($tabfile);
  
  //lecture du tableau trié
  foreach($tabfile as $file)    
      {
      echo $file.'<br />';
        }