Exemple de diaporama en php

Soyez le premier à donner votre avis sur cette source.

Snippet vu 57 219 fois - Téléchargée 23 fois

Contenu du snippet

Ce petit script montre le principe d'un diaporama en PHP. Il faut lui fournir par la methode GET le répertoire et le numéro de la nième photo à afficher (0 pour la première et il corrige si le numéro est trop élévé.
Pour être autonome, ce diaporama est associé à un petit formulaire qui permet de choisir le répertoire (chemin relatif par rapport au script).
Principe : On parcour le répertoire pour y trouver les images, connaître leurs noms et leurs numéros d'ordre. après avoir vérifié que le nuéro n'est pas supérieur au nombre maximum d'image, on affiche l'image associé à un menu proposant le numéro précédent, le numéro suivant et un retour au formulaire(Si on est à la dernière image, la "suivante" est la première et inversement pour la "précédente")

Source / Exemple :


<?php	
// diaporama.php

/* Ce script montre comment faire un diaporama en PHP

		On n'affiche successivement toute les diapo d'un répertoire et on revient
		à la première quand on a terminer ou on fait l'inverse.
		Normalement si on rajoute ou enlève des diapos entre deux clics on met 
		de l'incertitude temporaire dans la chronologie mais l'algorithme ne plante pas.
		
		Chaque appel doit fournir le répertoire et un n° de diapo
		dans la chaîne de requête suivant l'url
		On utilise la methode GET car on utilise des envoi par le menu.
		Deux utilisations réalistes pour lancer ce script:
			a) Un menu passe l'url du script et le n° de diapo 0 (zéro)
			b) Dans une série de vignettes, le clic sur l'une d'elles
					passe l'url du script et le n° de la vignette 

  • /
error_reporting(E_ALL &~E_NOTICE); // EasyPhp n'affiche pas les notices // Initialisations $b_diapo = false; // à priori, je n'ai pas de diapo (Pessimiste ?) $texte = ''; // futur contenu du <body> html $filtre = '\.(jpg|gif|png)'; // régex d'identification des extensions de diapo $hauteur = '450'; // hauteur d'affichage des diapo en pixels // A - C'est là que ça commence // Est-ce que je connais le répertoire et le n° de la diapo ? // Normalement comme dit ci-dessus, je peux recevoir ces informations grâce // à un choix dans un menu. Le cas ci-dessous (par formulaire) risque d'être // peu utilisé // Mais c'est quand même là quil faut vérifier que l'uri est valide if ( (isset($_GET['dir'])) && (isset($_GET['nr'])) ) { $dir = $_GET['dir']; $nr = $_GET['nr']; $b_diapo = true; } if (!($b_diapo)) { // Si je n'ai pas mes infos, je les demande // renvoi au module appelant, à la page d'accueil ... // ou, comme ici, par un formulaire // (Le répertoire, est le répertoire relatif à celui du script) $texte .= '<form action="'.$_SERVER['PHP_SELF'].'" method="get" name="diaporama">' .'<input type="hidden" name="nr" value="0" />' .'<input type="text" name="dir" value=""/>' .'<input type="submit" value="Valider"/>' .'</form>' ; } else { // B - C'est là que ça recommence // Je connais le répertoire et le n° de la diapo // 1. je repère toutes les diapos du répertoire et je // met leurs noms dans un tableau if ( $handle = opendir($dir) ) { while (false !== ($file = readdir($handle))) { if (preg_match('/'.$filtre.'/s',strtolower($file))) { $diapos[] = $file; // élément 0 du tableau puis suivants ; } } // on pourrait s'arrêter au n° de la diapo closedir($handle); } else {echo $dir.' NON TROUVE ';} // 2. Si j'ai des diapos if (isset($diapos[0])) { $max = count($diapos); // nombre de diapo trouvées if (!($nr<$max)) { // au cas ou on m'a oté des diapos entre-temps, je réduit le N° $nr = $max-1; } // 3. J'affiche la diapo $texte .= '<img src="'.$dir.'/'.$diapos[$nr].'" alt="" height="'.$hauteur.'" />'; // 4. Je fais un menu $texte .= '<ul class="suivante">'; // (nr + (max+1)) modulo max = n° précédent $texte .= '<li><a href="' .$_SERVER['PHP_SELF'].'?dir='.$dir.'&nr='.strval(($nr+($max-1))%$max).'" >' .'&nbsp; << Précédente &nbsp;' .'</a></li>' ; $texte .= ' '; // Retour au module d'où je venais (event. modifier l'url) $texte .= '<li><a href="' .$_SERVER['PHP_SELF'].'" >' .'&nbsp; ^Retour^ &nbsp;' .'</a></li>' ; $texte .= ' '; // (nr + 1) modulo max = n° suivant $texte .= '<li><a href="' .$_SERVER['PHP_SELF'].'?dir='.$dir.'&nr='.strval(($nr+1)%$max).'" >' .'&nbsp; Suivante >> &nbsp;' .'</a></li>' ; $texte .= '</ul>'; } else { echo $_GET['dir'].' vide';} // NB. l'utilisation de $_SERVER['PHP_SELF'] (moi-même) comme url // permet de faire fonctionner ce script quelque soit son nom } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Choisir un image</title> <!-- Pour avoir mon menu sur une seule ligne --> <style type="text/css"> .suivante li {display: inline;} </style> </head> <body> <?php echo $texte; ?> </body> </html>

Conclusion :


J'ai mis mes remarques et suggestions dans les commentaires

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1
Date d'inscription
vendredi 21 septembre 2007
Statut
Membre
Dernière intervention
12 mars 2011

ton code ne marche pas:

Warning: opendir(22) [function.opendir]: failed to open dir: No error in D:\wamp\www\prd.php on line 60
22 NON TROUVE 22 vide
Messages postés
23
Date d'inscription
lundi 18 janvier 2010
Statut
Membre
Dernière intervention
14 mars 2010
21
Bonsoir,

J'ai apprécié ton tuto et m'en suis inspiré, seulement un petit détail me gène.
En fait j'ai rajouté plusieurs zone d'affichage pour pouvoir visualiser plusieurs images en même temps comme ceci :([] représente les images et le chiffre le numéro de l'image dans le répertoire)
[1][2][3][4][5]
[0]
[6][7][8][9][10]

l'image centrale possède une taille supérieur bien évidement :).
Donc mon problème est le suivant :
Lorsque je clique sur mon bouton suivant toutes mes images s'avancent (ce que je désire) mais le hic c'est que lorsque quand le répertoire ne compte que 10 ou x images, les blocs possédant des images et dont le chiffre n'est égale a aucune image dans le répertoire, m'affichent un icon tout moche (celui pour le image mal informée etc...)
Mon idée était donc je dire quand le 10ème bloc est égal à null y mettre l'image 0 et le hic se fait voir ici :( celà ne fonctionne pas :(....

voici l'extrait de mon code :

<?php
error_reporting(E_ALL &~E_NOTICE);
$b_diapo = false; // à priori, je n'ai pas de diapo (Pessimiste ?)
$texte = ''; // futur contenu du html
$filtre = '\.(jpg|gif|png)'; // régex d'identification des extensions de diapo
$dir = 'photos'; //répertoire des photos
$nr = 0;

if ( (isset($_GET['nr'])) )
{
$nr = $_GET['nr'];
}
$handle = opendir($dir);while (false !($file readdir($handle)))
{
if (preg_match('/'.$filtre.'/s',strtolower($file)))
{
$diapos[] = $file; // élément 0 du tableau puis suivants ;
}
}
closedir($handle);
// 2. Si j'ai des diapos
if (isset($diapos[0]))
{
$max = count($diapos); // nombre de diapo trouvées
if (!($nr<$max))
{ // au cas ou on m'a oté des diapos entre-temps, je réduit le N°
$nr = $max-1;
}
//On initialise des variables pour un test
$valide = true ;
$num = 0 ;
$ecart = 0 ;
//tant que la variables $valide est égale à vrai faire
while ($valide == true)
{
$num = $num + 1 ; //On incrémente un compteur
if (($diapos[0+$num] == null) and ($num <= 9))// Si la diapo n'est égale à rien et que $num est inférieur ou égal à 9 alors
{
$valide = false ;
$ecart = 9 - $num ;
}
if ($num == 10)//Si la variable $num est égale à 10 alors
{
$valide = false ;
}
}
if ($ecart > 0)
{
$c = 0 ;
while ($num <= 9)
{
$diapos[$num] = $diapos[$nr+$c] ;
$num = $num + 1 ;
$c = $c + 1 ;
}
}
// 3. On affiche les diapos
$texte .= '
<center></center>,
<center></center>,
<center></center>,
<center></center>,
<center></center>

<center>'.$diapos[$nr].'</center>

<center>

</center>
';
$texte .= '';
// (nr + (max+1)) modulo max = n° précédent
$texte .= ''
.''
.', '
;
$texte .= ' ';
// Retour au module d'où je venais (event. modifier l'url)
$texte .= ''
.''
.', '
;
$texte .= ' ';
// (nr + 1) modulo max = n° suivant
$texte .= '<td width=\"100\" align=\"center\">'
.''
.''
;
$texte .= '

<center></center>,
<center></center>,
<center></center>,
<center></center>,
<center></center>
';
}
?>

Dans mon HTML j'affiche avec un echo $texte;
Bien sur ce code fonctionne mais j'avoue que c'est assez laid le fait que mon diaporama ne forme pas une boucle infini :/

HELPPPPPP =>>>> please :)
Messages postés
1
Date d'inscription
samedi 25 juillet 2009
Statut
Membre
Dernière intervention
4 août 2009

bonjour modifier cette partie pour par exemple lancer le script à partir d'une autre page en cliquant sur une vignette.
<?php
// diaporama.php
pt montre comment faire un diaporama en PHP

On n'affiche successivement toute les diapo d'un répertoire et on revient
à la première quand on a terminer ou on fait l'inverse.
Normalement si on rajoute ou enlève des diapos entre deux clics on met
de l'incertitude temporaire dans la chronologie mais l'algorithme ne plante pas.

Chaque appel doit fournir le répertoire et un n° de diapo
dans la chaîne de requête suivant l'url
On utilise la methode GET car on utilise des envoi par le menu.
Deux utilisations réalistes pour lancer ce script:
a) Un menu passe l'url du script et le n° de diapo 0 (zéro)
b) Dans une série de vignettes, le clic sur l'une d'elles
passe l'url du script et le n° de la vignette
*/

error_reporting(E_ALL &~E_NOTICE); // EasyPhp n'affiche pas les notices

// Initialisations

$b_diapo = false; // à priori, je n'ai pas de diapo (Pessimiste ?)
$texte = ''; // futur contenu du html
$filtre = '\.(jpg|gif|png|jpeg)'; // régex d'identification des extensions de diapo
$hauteur = '450'; // hauteur d'affichage des diapo en pixels

$dir=$_GET['valeur_id']; // valeur du lien provenant d'une autre page
if ( (isset($_GET['dir'])) && (isset($_GET['nr'])) ) {
$dir= $_GET['dir'];
$nr = $_GET['nr'];
$b_diapo = true;
}

?>
<!>
<! on recupere le nom du repertoire >

"/>
<?
a+
Messages postés
1
Date d'inscription
samedi 16 mai 2009
Statut
Membre
Dernière intervention
16 mai 2009

Comment faire pour ne pas avoir a choisir le repertoire et juste le predefinir, de plus si possible ajouter un timer entre chaque photo pour faire un style de slideshow ? ... Desoler je suis debutant et jessaie dapprendre merci d'avance.
Messages postés
156
Date d'inscription
vendredi 20 août 2004
Statut
Membre
Dernière intervention
31 décembre 2007

L'idée est bonne
Afficher les 7 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.