Général

Les PCRE

Les POSIX

Pratique

Linux

Spécial php

Les billets de fred

Un diaporama en php

Qu'appelle t'on un diaporama ?

On pourrait comparer un diaporama à un album de photos. Pour progressez dans l'album vous tourner les pages.
C'est simple, je vais vous montrer comment réaliser cela simplement en php.

On va imaginer notre diaporama au départ d'un dossier contenant nos images que voici :

image 1 diaporama expreg.com image 2 diaporama expreg.com image 3 diaporama expreg.com image 4 diaporama expreg.com image 5 diaporama expreg.com
                          nouveau-1.jpg     nouveau-2.jpg     nouveau-3.jpg     nouveau-4.jpg     nouveau-5.jpg


image 6 diaporama expreg.com image 7 diaporama expreg.com image 8 diaporama expreg.com image 9 diaporama expreg.com image 10 diaporama expreg.com
                           nouveau-6.jpg     nouveau-7.jpg     nouveau-8.jpg     nouveau-9.jpg     nouveau-10.jpg



La première chose à faire sera de lister le dossier afin d'en retirer les noms des images.
Pour se faire on a deux solutions : readdir(); et glob();

Version avec readdir()


<?php
$dos='images';
if ($lister = opendir($dos)) {
   while (false !== ($file = readdir($lister))) {
       if ($file != '.' && $file != '..' && strrchr($file,".")=='.jpg') {
           $diapo[] = $file;
       }
   }
   closedir($lister);
}
usort($diapo, "strnatcmp");
?>


La même chose avec glob();

<?php
$dos='images/';
$diapo=glob($dos.'*.jpg');
usort($diapo, "strnatcmp");
?>

Comme vous le voyez, la version glob() est plus courte et permet de mettre un masque directement dans la recherche.
Selon votre config, vous choisirez ce qui vous convient (glob désactivé chez Free par exemple)
Donc voilà, notre dossier images est listé et mis dans un array() nommé diapo.

D'ailleurs si vous faites un print_r($diapo) vous obtiendrez :

Array
(
[0] => nouveau-1.jpg
[1] => nouveau-2.jpg
[2] => nouveau-3.jpg
[3] => nouveau-4.jpg
[4] => nouveau-5.jpg
[5] => nouveau-6.jpg
[6] => nouveau-7.jpg
[7] => nouveau-8.jpg
[8] => nouveau-9.jpg
[9] => nouveau-10.jpg
)


Je vous laisse le soin de consulter la doc afin de vous familiariser avec les fonctions que j'ai utilisé et notamment :
usort($diapo, "strnatcmp");

Voilà, notre dossier étant lister on va passer au script proprement dit. Afin d'éviter un appel au listage de dossier à chaque chargement de la page, je vous propose de travailler avec une session. La session n'est pas obligatoire dans le cas d'un listage de dossier en direct, mais elle le deviendra si d'aventure on extrait des liens images d'une base de données. Imaginez le diaporama sans session au départ d'une base de données... une requête à chaque appel de la page... pas terrible !

Bon on y va, je vous livre le script :

<?php
error_reporting(E_ALL);
if(isset($_GET['stop']) && $_GET['stop']=='yes'){
$_SESSION=array();
}
session_start();
?>
<!DOCTYPE html PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
<meta name="Author" content="Maistriaux Yves">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?php
if(empty($_SESSION['diaporama']))
{
$dos='images/';
$diapo=glob($dos.'*.jpg');
usort($diapo, "strnatcmp");

$_SESSION['diaporama']=$diapo;
$nb=count($diapo);
}
else
{
$nb=count($_SESSION['diaporama']);
}
if(isset($_GET['image']) && ctype_digit($_GET['image']))
{
$img=$_GET['image'];
}
else
{
$img=0;
}
echo '<table style="width:500px;border:1px solid;">
        <tr>
        <td colspan="3" style="text-align:center;">
        Mon Diaporama
        <br /><br />
        <img src="',$_SESSION['diaporama'][$img],'" alt="" />
        </td>
        </tr>
        <tr>
        <td style="width:100px;">';
        if($img>0 && $img<$nb){
        echo '<a href="diaporama1.php?image=',$img-1,'">Précédente</a>';
        }
        else
        {
        echo '&nbsp;';
        }
        echo '</td>
        <td></td>
        <td style="width:100px;">';
        if($img<$nb-1 && $img>=0){
        echo '<a href="diaporama1.php?image=',$img+1,'">Suivante</a>';
        }
        else
        {
        echo '&nbsp;';
        }
        echo '</td>
        </tr>
        <tr>
        <td colspan="3" style="text-align:center;">
        <hr />
        <a href="diaporama1.php?stop=yes">[ Reprendre du début ]</a>
        </td>
        </tr>
        </table>';    
?>
</body>
</html>


Explication :

- On démarre d'une manière un peu particulière par un if() de contrôle permettant de reprendre la lecture du diaporama au début.
- Vient ensuite le session_start();
- Viennent les entêtes de la pages, mais on passe rapidement dessus.
- Grâce au empty on vérifie que la variable de session diaporama n'existe pas au premier appel de la page, ce qui est normalement le cas.
- Cet appel à empty sera encore sollicité lorsque l'on demandera de reprendre la lecture des diapos du début via le lien prévu à cet effet.

     - Donc, si la variable n'existe pas, on lit le dossier, on crée l'array et on le place en session dans la variable diaporama et on compte son contenu que l'on place dans une variable $nb.

- On passe enfin au contrôle d'une variable symbolisant le numéro de la clé du tableau contenant le nom de l'image à afficher.
- Si cette valeur n'existe pas (logique au premier appel) on l'initialise à 0 correspondant au premier indice d'un array();
   (par conséquent à la première image);

- Pour le reste, je ne crois pas que vous ayez besoin d'explications, tout ce que contient les lignes de codes est sensé être connu. Si ce n'est pas le cas, je vous laisse le soin d'approfondir vos connaissances sur le site de votre choix.

Voilà, je n'ai pas mis le script en demo ici, je vous laisse le soin de le tester et de le comprendre sur vos bécanes.
Et le premier qui fait un bête copié/collé du code, je lui colle une beigne dont il se souviendra longtemps.

Qui a osé me traiter de bourreau là dans le fond ???? smiley passe la langue

Voici un exemple de ce que vous afficherez au premier appel de la page :

Mon Diaporama

 
Suivante

[ Reprendre du début ]


Si vous faites la mise en place depuis une base de données, il suffit de remplacer le listage du dossier par votre requête et votre while.

Exemple :

<?php
//--------------------------
$dos='images/';
$diapo=glob($dos.'*.jpg');
usort($diapo, "strnatcmp");
//----------------------------

// Remplacez la partie du dessus par votre requête perso :
$req="select nom_image from latable order by id";
$res=mysql_query($req);
while($data=mysql_fetch_assoc($res)){
$diapo[]=$data['nom_image'];
}
?>

Il est bien entendu que vous devrez indiquer le chemin vers le dossier correspondant à vos image.
Bref, vous vous débrouillez (j'ai déjà tout fait !)

ADAM Benjamin 2008 | Admin