Amélioration script galerie photo

Invité
Invité n'ayant pas de compte PHPfrance

15 févr. 2011, 21:14

Merci pour vos réponses, mais j'ai réussi à trouver suffisamment d'infos pour m'en sortir.

Cependant il me reste un petit détail à régler, faire un sorte que l'on puisse cliquer sur les noms des images pour afficher ces dernières. Je n'arrive pas à trouver la syntaxe pour rendre les noms cliquables. Pour l'instant je les affiche tout simplement. Voici ce que ça donne : http://zemickyunivers.free.fr/exemple_c ... pages4.php

Et voici le code :

<?php

// On déclare deux tableaux qui contiendra le nom des fichiers de nos miniatures.
$tableau01 = array();
$tableau02 = array();
// On ouvre notre dossier contenant les miniatures.
$dossier = opendir ('images/Luis Royo/Secrets/tb/');
while ($fichier = readdir ($dossier)) {
	if ($fichier != '.' && $fichier != '..' && $fichier != 'index.php') {
		// On stocke le nom des fichiers des miniatures dans un tableau (tableau01) pour les images
		// et dans un autre tableau (tableau02) pour les noms des fichiers sans leur extension.
        $tableau01[]=$fichier;
	$info = pathinfo($fichier);
	$file_name = basename($fichier,'.'.$info['extension']);
        $tableau02[]=$file_name;
	}
}
closedir ($dossier);

// on définit le nombre de colonne sur lesquelles vont s'afficher nos miniatures.
$nbcol=4;

// on tri les tableaux par ordre alphabétique.
sort($tableau01);
sort($tableau02);

// on compte le nombre de miniatures.
$nbpics = count($tableau01);

// Nombre de photos qui seront affichées sur chaque page.
$nb_pics_par_page = 8;

// Paramètres de pagination
$url = "./exemple_calcul_nbr_pages4.php?page=";

// On détermine quelle est la page qui est actuellement affichée.
$page_en_cours    = isset($_GET['page']) ? $_GET['page'] : 0;
$page_affichee    = ($page_en_cours + 1);

// Calcul du rang de départ
$debut = $page_en_cours*$nb_pics_par_page;

// Calcul du rang de fin
// $fin = $debut+$nb_pics_par_page;
$fin = min ($debut+$nb_pics_par_page, $nbpics);

//Calcul du nombre total de pages. On arrondit à l'entier supérieur (ceil().
$nb_pages = ceil($nbpics / $nb_pics_par_page);

// Si on a au moins une miniature dans le répertoire on l'affiche.
if ($nbpics != 0) {

// Initialisation d'un compteur d'éléments (ici nos images).
// $cpt = 0;

?>

<table>

<?php

for ($compteur = 0,$i = $debut; $i < $fin; $i++, $compteur++){ // On parcourt les images pour la page appelée.

    // Début d'une ligne du tableau
    if ($compteur%$nbcol==0) // On divise le nb d'élément par le nb de colonnes. Si le reste est de 0 ...
        echo '<tr>'; // ... alors on est sur le premier élément d'une ligne et on ouvre la ligne.

    	// On place chaque élément dans une cellule du tableau.
		// Pour chaque miniature, on affiche la miniature munie d'un lien vers la photo en taille réelle.
		echo '<td>';
		echo '<a href="images/Luis Royo/Secrets/' , $tableau01[$i] , '" rel="lightbox[Royo]"><img src="images/Luis Royo/Secrets/tb/' , $tableau01[$i] , '" alt="Image" /></a>';
		echo '<br />';
		echo $tableau02[$i];
		echo '<br /><br />';
		echo '</td>';

    // Fin d'une ligne du tableau.
    if ($compteur%$nbcol==($nbcol-1)) // On divise le nb d'élément par le nb de colonnes. Si le reste est de ($nbCols-1) ...
        echo '</tr>'; // ... on est sur le dernier élément d'une ligne et on ferme la ligne.
        
//	$cpt++; // On incrémente le compteur pour savoir où on en est.

}
	// Au cas où ...
	if ($compteur!=0 && $compteur%$nbcol!=0) { // S'il n'y a pas eu assez de cellules dans la boucle pour finir la ligne ...
   		echo '<td colspan="'.($nbcol - ($compteur%$nbcol) ).'">&nbsp;</td>'; // ... on complète avec une cellule vide de la bonne taille...
    	echo '</tr>'; // ... et on ferme la ligne.
}

?>

</table>

<?php

Je continue de chercher, mais si vous avez moyen de m'aider... :wink:

Micky

ViPHP
xTG
ViPHP | 7331 Messages

15 févr. 2011, 21:16

Beh tu décales la balises </a> après ton titre ? ^^'

Invité
Invité n'ayant pas de compte PHPfrance

16 févr. 2011, 12:07

C'est vrai que la solution parait toute simple... et pourtant je n'y arrive pas.

Voilà mon code :

// On place chaque élément dans une cellule du tableau.
// Pour chaque miniature, on affiche la miniature munie d'un lien vers la photo en taille réelle.
echo '<td>';
echo '<a href="images/Luis Royo/Secrets/' , $tableau01[$i] , '" rel="lightbox[Royo]"><img src="images/Luis Royo/Secrets/tb/' , $tableau01[$i] , '" alt="Image" />';
echo '<br />';
echo '$tableau02[$i]</a>';
echo '<br /><br />';
echo '</td>';

Et voilà ce que ça donne : http://zemickyunivers.free.fr/exemple_c ... pages4.php

Je ne vois pas comment faire en sorte que "$tableau[$i]" soit variabilisée et non prise comme texte à part entière.

Micky

ViPHP
ViPHP | 3607 Messages

16 févr. 2011, 12:17

En un mot : Concaténation!
Une variable au sein d'une chaîne "simple quote" n'est pas interprétée ;)
Je te laisse faire des recherches!

Eléphanteau du PHP | 23 Messages

16 févr. 2011, 12:30

Oui en effet, ça je l'avais bien compris. J'ai donc modifié mon code en décrivant le lien sur une seule et même ligne :

// On place chaque élément dans une cellule du tableau.
// Pour chaque miniature, on affiche la miniature munie d'un lien vers la photo en taille réelle.
echo '<td>';
echo '<a href="images/Luis Royo/Secrets/' , $tableau01[$i] , '" rel="lightbox[Royo]"><img src="images/Luis Royo/Secrets/tb/' , $tableau01[$i] , '" alt="Image" /><br />'.$tableau02[$i].'</a>';
echo '<br /><br />';
echo '</td>';

Et miracle, ça fonctionne !!! \:D/

Voilà le résultat : http://zemickyunivers.free.fr/exemple_c ... php?page=4

Une dernière chose. Est-ce que le fait d'utiliser deux tableaux pour afficher et les images et les noms de ces images est judicieux ? Est-ce qu'il y a moyen de simplifier ce code ou est-il correct ?

Micky

ViPHP
ViPHP | 3607 Messages

16 févr. 2011, 12:35

Bonjour,

Tu pourrais avoir un seul tableau et le construire comme ceci:
$tab = array(

    array(
        'src'=>'image.jpg',
        'title'=>'image'
    ),
    array(
        'src'=>'image2.jpg',
        'title'=>'image2'
    )
);
Mais après c'est les goûts et les couleurs ;)

Eléphanteau du PHP | 23 Messages

16 févr. 2011, 14:10

Bien ! Je vais essayer de le peaufiner petit à petit et je vais réfléchir à une éventuelle base de données. :wink:

Je remet ici le code définitif pour ceux qui passeraient dans le coin et que ça intéresserait :

<?php

//***************************************************************************************************************
// Ce script permet d'afficher dans une page web des images contenues dans un répertoire et de générer plusieurs
// pages en fonction de paramètres que l'utilisateur lui donnera.
// Il n'utilise pas de base de données.
// Il ne génère pas de miniatures à la volée. Il faudra donc créer les miniatures manuellement et les mettre dans
// un répertoire dédié aux miniatures (ici répertoire "tb").
// Les paramètres modifiables sont le nombre d'images par page et le nombre de colonnes par page.
// Expl : On a 30 images dans un répertoire. Si on définit 10 images par page et 5 colonnes par page le script
// créera trois pages (accessibles via une barre de navigation créée automatiquement) avec chacune 10 images
// réparties sur 5 colonnes. On aura donc par page deux lignes de 5 images.
//***************************************************************************************************************

//***************************************************************************************************************
// Vous pouvez modifier les paramètres suivants.
//***************************************************************************************************************

// Nombre de photos qui seront affichées sur chaque page.
$nb_pics_par_page = 8;

// Nombre de colonnes sur lesquelles vont s'afficher nos miniatures.
$nbcol=4;

// Remplacer "nom_de_ma_page.php" par le nom de la page qui contient ce sript.
$url = "./nom_de_ma_page.php?page=";

//***************************************************************************************************************
// A partir d'ici il est préférable de ne pas toucher au code sauf pour les chemins vers vos répertoires des
// miniatures et des images à taille réelle.
//***************************************************************************************************************

// On déclare deux tableaux qui contiendront pour le 1er le nom des fichiers afin d'afficher nos miniatures
// et pour le second le noms des fichiers sans les extensions (expl : sans .jpg, .gif ...).
$tableau01 = array();
$tableau02 = array();
// On ouvre notre dossier contenant les miniatures.
$dossier = opendir ('chemin/répertoire/miniature/');
while ($fichier = readdir ($dossier)) {
	if ($fichier != '.' && $fichier != '..' && $fichier != 'index.php') {
		// On stocke le nom des fichiers dans un tableau (tableau01) pour afficher ultérieurement les miniatures
		// et dans un autre tableau (tableau02) pour afficher les noms des fichiers sans leurs extensions.
        $tableau01[]=$fichier;
		$info = pathinfo($fichier);
		$file_name = basename($fichier,'.'.$info['extension']);
        $tableau02[]=$file_name;
	}
}
closedir ($dossier);

// on tri les tableaux par ordre alphabétique.
sort($tableau01);
sort($tableau02);

// on compte le nombre de miniatures.
$nbpics = count($tableau01);

// On détermine quelle est la page qui est actuellement affichée.
$page_en_cours    = isset($_GET['page']) ? $_GET['page'] : 0;
$page_affichee    = ($page_en_cours + 1);

// Calcul du rang de départ
$debut = $page_en_cours*$nb_pics_par_page;

// Calcul du rang de fin
$fin = min ($debut+$nb_pics_par_page, $nbpics);

//Calcul du nombre total de pages. On arrondit à l'entier supérieur (ceil().
$nb_pages = ceil($nbpics / $nb_pics_par_page);

// Si on a au moins une miniature dans le répertoire on l'affiche.
if ($nbpics != 0) {

?>

<table>

<?php

for ($compteur = 0,$i = $debut; $i < $fin; $i++, $compteur++){ // On parcourt les images pour la page appelée.

    // Début d'une ligne du tableau
    if ($compteur%$nbcol==0) // On divise le nb d'éléments par le nb de colonnes. Si le reste est de 0 ...
        echo '<tr>'; // ... alors on est sur le premier élément d'une ligne et on ouvre la ligne.

    	// On place chaque élément dans une cellule du tableau.
		// Pour chaque miniature, on affiche la miniature et son nom sans l'extension munie d'un lien vers la
		// photo en taille réelle
		echo '<td>';
		echo '<a href="chemin/répertoire/images/tailles/réelle/' , $tableau01[$i] , '" rel="lightbox[Royo]"><img src="chemin/répertoire/miniature/' , $tableau01[$i] , '" alt="Image" /><br />'.$tableau02[$i].'</a>';
		echo '<br /><br />';
		echo '</td>';

    // Fin d'une ligne du tableau.
    if ($compteur%$nbcol==($nbcol-1)) // On divise le nb d'élément par le nb de colonnes. Si le reste est de ($nbCols-1) ...
        echo '</tr>'; // ... on est sur le dernier élément d'une ligne et on ferme la ligne.

}
	// Au cas où ...
	if ($compteur!=0 && $compteur%$nbcol!=0) { // S'il n'y a pas eu assez de cellules dans la boucle pour finir la ligne ...
   		echo '<td colspan="'.($nbcol - ($compteur%$nbcol) ).'">&nbsp;</td>'; // ... on complète avec une cellule vide de la bonne taille...
    	echo '</tr>'; // ... et on ferme la ligne.
}

?>

</table>

<?php

// Création de la barre de navigation.

    // On définit une variable qui contiendra les données de navigation.
    $barre_nav = "Page ";
    // Nous avons au moins une page. Avons nous besoin d'une barre de navigation ?
    if($nb_pages > 1)
    {
        /**
        Nous avons plusieurs pages. Nous allons afficher successivement les liens vers
        les pages précédentes (s'il y en a), la page en cours et les liens vers les pages
        suivantes. Nous aurons une barre sous la forme "Page 1 | 2 | 3 etc..." en liens cliquables
        sauf pour la page en cours dont nous mettrons le chiffre en gras.
         */
        if($page_en_cours > 0)
        {
            for($i = 0; $i < $page_en_cours; $i++)
            {
                $p = $i + 1;
                $barre_nav .= "<a href=\"". $url . $i ."\" title=\"page ". $p ."\">". $p ."</a> | ";
            }
        }

        /**
        On affiche la page en cours. Notez le (+ 1), pour les calculs nous partons d'une
        page 0 mais pour l'internaute il est préférable de commencer à la page 1, donc on incrémente.
         */
        $barre_nav .= "<strong>". $page_affichee ."</strong>";

        // Enfin on affiche (s'il y a lieu) les liens vers les pages suivantes.
        if(($page_affichee) < $nb_pages)
        {
            // Il reste encore d'autres pages à afficher.
            $nb_suivantes = $nb_pages - ($page_affichee);
            for($j = ($page_affichee); $j < $nb_pages; $j++)
            {
                $p = $j + 1;
                $barre_nav .= " | <a href=\"". $url . $j ."\" title=\"page ". $p ."\">". $p ."</a>";
            }
        }
        
        //On peut définir en plus la situation dans une autre variable à afficher ailleurs.
        $page_affichee = "Page ". $page_affichee ." sur un total de ". $nb_pages ." pages.";
    }
    else
    {
        // Nous n'avons qu'une seule page, on peut se contenter d'afficher juste 1/1.
        $barre_nav .= "1/1";
    }

?>	

<p class="pcenter"><?php echo($barre_nav); ?></p>

<?php

} // Fin condition si miniature dans le répertoire.

else echo 'Aucune image à afficher';// S'il n'y a aucune miniature on affiche un petit message.

?>

Merci beaucoup à ceux qui m'ont aidé et poussé à réfléchir pour l'amélioration de ce code.

Bonne continuation.

Micky

ViPHP
ViPHP | 3607 Messages

16 févr. 2011, 14:13

Merci de nous faire profiter de la version finale ;)
Un petit conseil supplémentaire, $tableau01 et $tableau02 ne sont pas du tout explicites ;)
Essaye avec un truc du genre $src_images/titres_images ou en anglais etc...

Eléphanteau du PHP | 23 Messages

16 févr. 2011, 14:23

C'est noté. Je serais plus explicite sur les noms de mes variables.

Au passage, comment fait-on pour mettre un sujet en résolu ? Parce que pour ma part je considère que c'est résolu mon histoire.

Micky

ViPHP
ViPHP | 3607 Messages

16 févr. 2011, 14:31

Il y a un petit bouton vert sur chaque post, en haut à droite ;)

Eléphanteau du PHP | 23 Messages

16 févr. 2011, 15:04

Mince, j'étais en Invité quand j'ai ouvert ce sujet.

S'il y a un modérateur qui passe dans le coin pour mettre ce sujet résolu ce serait sympa...

... et s'il y a moyen de m'affecter ce sujet ce serait encore mieux :wink:

Micky