Amélioration script galerie photo

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Amélioration script galerie photo

Re: Amélioration script galerie photo

par bisca330 » 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

Re: Amélioration script galerie photo

par jojolapine » 16 févr. 2011, 14:31

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

Re: Amélioration script galerie photo

par bisca330 » 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

Re: Amélioration script galerie photo

par jojolapine » 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...

Re: Amélioration script galerie photo

par bisca330 » 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

Re: Amélioration script galerie photo

par jojolapine » 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 ;)

Re: Amélioration script galerie photo

par bisca330 » 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

Re: Amélioration script galerie photo

par jojolapine » 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!

Re: Amélioration script galerie photo

par Invité » 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

Re: Amélioration script galerie photo

par xTG » 15 févr. 2011, 21:16

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

Re: Amélioration script galerie photo

par Invité » 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

Re: Amélioration script galerie photo

par xTG » 15 févr. 2011, 15:17

Tes noms de fichier d'après ton code ne comporte que l'extension dans ce qui ne t'intéresse pas.
Tu peux donc voir du côté des fonctions telles que str_replace() afin de supprimer les extensions (.jpg, .png, .gif, ect) dans les chaînes de caractères lors de l'affichage.

Après c'est cela dit moins propre que ce que te propose jojolapine. ;)

Re: Amélioration script galerie photo

par jojolapine » 15 févr. 2011, 15:15

Si tu ne veux absolument pas utiliser de bdd, de fichiers en plus etc...
La meilleure solution est de se tourner vers pathinfo() ( http://fr2.php.net/manual/en/function.pathinfo.php )
Attention tout de même il faudra lui donner un chemin de fichier et non une url...

Re: Amélioration script galerie photo

par bisca330 » 15 févr. 2011, 15:12

C'est tout simplement magnifique. Ça fonctionne à merveille. J'ai fait un petit tour sur le Web pour avoir plus d'infos sur cette fonction "min" qui est très simple à comprendre et très efficace dans mon cas. Merci beaucoup.

Puis-je abuser ? Aller oui, j'abuse.

Lorsque j'ai ouvert ce post je souhaitais donc afficher les images d'un album sur plusieurs pages, ce qui est à présent fait, mais je souhaitais également afficher sous ces images leurs noms respectifs, sans l'extension du fichier et sans avoir recours à une base de données.

Y'a-t-il moyen de me mettre sur la voie pour que je puisse réfléchir à la modification de mon code ?

Par avance merci.

Micky

Re: Amélioration script galerie photo

par macgawel » 15 févr. 2011, 13:36

J'ai survolé le code, il y a peut-être un truc qui m'a échappé, mais :
$fin = $debut+$nb_pics_par_page;
//...
for ($compteur = 0,$i = $debut; $i < $fin; $i++, $compteur++){ // On parcourt les images pour la page appelée.
Le problème vient d'ici, puisque tu vas boucler n fois (avec n = $fin - $debut = $nb_pics_par_page).
Une solution, ce serait de donner à $fin la valeur la plus petite entre $debut+$nb_pics_par_page OU $nbpics.
=>
$fin = min ($debut+$nb_pics_par_page, $nbpics);