Listing et tri chronologique d'un répertoire

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 : Listing et tri chronologique d'un répertoire

par zeus » 10 mars 2008, 21:20

Ne pouvant éditer mon premier message, si un modérateur passe par là, peut-il ajouter dans le titre un [Résolu] ou un [Résolu - propreté du code à vérifier] ?
Fait ;)

par Matthias » 10 mars 2008, 20:46

Je me suis (enfin) enregistré sur le forum.

Ne pouvant éditer mon premier message, si un modérateur passe par là, peut-il ajouter dans le titre un [Résolu] ou un [Résolu - propreté du code à vérifier] ?

Encore merci !

par Matthias » 10 mars 2008, 19:50

Après avoir effectué (...) et trituré au lieu de Après avoir effectuer (...) et triturer. :oops:

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

par Matthias » 10 mars 2008, 19:48

Après avoir effectuer des recherches un peu partout et triturer le code dans tous les sens, je suis arrivé à quelque chose qui me convient (ou du moins qui n'affiche pas d'erreur).
Par contre, je ne sais pas si mon code est "propre"... il fonctionne et c'est déjà pas mal !

J'attends vos avis et espère que si ce code est correct, il pourra servir à d'autres.
<?php
$dir_nom = 'lightbox/small'; // dossier listé
$dir = opendir($dir_nom) or die('Erreur de listage : le répertoire n\'existe pas'); // on ouvre le contenu du dossier courant
$fichier= array(); // on déclare le tableau contenant le nom des fichiers

$current = $_SERVER['PHP_SELF'];
$num_page=(is_numeric($_GET['page'])?$_GET['page']:1);
$i = 0;$compteur = 0;
$debut = ($num_page - 1) * 112;
$fin = $debut + 111;

while($element = readdir($dir)) {

		if($element != '.' && $element != '..' && $element != $current && $element != 'liste.php' && $element != 'liste2.php' && $element != 'essai.php') {
			$compteur++;
			if (!is_dir($dir_nom.'/'.$element)) {
				$fichier[] = $element;
			}
		}
}

closedir($dir);

/* Construction de la barre de navigation */
$precedent  = $num_page > 1?'<a href="'.$current.'?page='.($num_page-1).'"><img src="images/photosgauche.png" alt="photos+" title="photos+" /></a>':'<img src="images/photosgauchevide.png" alt="photos+" title="photos+" />';
$suivant    = (112 * $num_page) < $compteur?'<a href="'.$current.'?page='.($num_page+1).'"><img src="images/photosdroite.png" alt="photos+" title="photos+" /></a>':'<img src="images/photosdroitevide.png" alt="photos+" title="photos+" />';
$navigation = '<p style="text-align:center">'.$precedent.''.$suivant.'</p>';


if(!empty($fichier)) {
	rsort($fichier);// rsort() pour le tri décroissant
				echo $navigation;
				echo '<p style="text-align:center">';
		foreach($fichier as $lien) {
			if ($i >= $debut && $i <= $fin) {

			echo "<a href=\"lightbox/big/$lien \" rel=\"lightbox[photos]\"><img src=\"lightbox/small/$lien\" alt=\"$lien\" /></a>&nbsp;";
			}
			$i++;$compteur++;
		}
				echo '</p>';
				echo $navigation;
}
?>
[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

par Matthias » 09 mars 2008, 18:14

Trop dur pour moi. Je bloque !

Peut-être serait-ce plus facile de classer les images de cette manière plutôt que par date :
- 0001.jpg
- 0002.jpg
- 0003.jpg
- etc.

Je m'y remets.

par Matthias » 09 mars 2008, 14:15

Pour le tri, je me suis trompé dans mon précédent message.
Il fallait lire :
array_multisort($date, SORT_DESC, $liens);
au lieu de :
array_multisort($date, SORT_ASC, $liens);
Sinon, la modif sur la dernière boucle ne semble rien changer.
Je vais essayer de reprendre à zéro tout cela car tout se bouscule dans ma tête de débutant !


Je mets ça ici au "propre" pour plus tard...
  • - Lister les images d'un dossier,
    - Classer ces images (de la plus récente à la plus ancienne),
    - Faire une pagination pour n'avoir qu'un nombre limité d'images par page.
Bon, je fais une pause et ensuite je m'y mets ! Si je trouve quelque chose, je posterai tout ici.
Merci beaucoup pour l'aide ! :wink:
Je passerai aussi par la case "enregistrement" car en invité, c'est pas tip-top.

par Cyrano » 09 mars 2008, 13:42

Alors il manque un élément dans la boucle :

Il faut tester au moment de la construction des liens dans la dernière boucle foreach : à modifier comme ceci :
<?php
//..........
/* Création des liens */
$liste_liens = '';
$i = 0;
foreach ($liens as $cle => $val)
{
    if($i >= $debut && $i <= $fin)
    {
        $liste_liens .= $liens[$cle]['adresse'];
    }
}
Sous réserve, mais ça devrait fonctionner.

par Matthias » 09 mars 2008, 13:25

Bonjour et merci pour l'aide !

Je suis sur ton code depuis pas mal de temps mais je bloque.

Le soucis est que cela affiche toutes les images du répertoire et du coup la navigation ne sert pas. Je souhaiterais n'afficher qu'un nombre limité d'images (en l'occurrence 112 par page).

Aussi, pour le tri, je souhaiterais qu'il soit décroissant. J'ai donc fait ceci mais sans résultat :
array_multisort($date, SORT_ASC, $liens); 
J'essaie de procéder en comparant mon code (mauvais et désordonné je le conçois) et le tiens mais n'arrive pas à m'en sortir ! Argh !!!

par Cyrano » 09 mars 2008, 10:03

Salut,
il y aurait beaucoup à dire sur ton code. Pour commencer, il y a beaucoup trop de répétitions. Tu initialises deux fois certaines variables inutilement, et tu effectues deux fois la même boucle pour des instructions différentes.

Ensuite, tu testes tous les fichiers du répertoire alors qu'en fin de compte, tu cherches justes les images. Donc au départ, tu pourrais isoler les images en les mettant dans un répertoire spécifique.

Tu as écrit également "$current = $_SERVER['PHP_SELF'];" : $_SERVER['PHP_SELF'] est un chemin, pas un fichier.

Ce que tu peux faire, c'est ajouter un test sur le type de fichier.
- Puisque tu veux afficher des images, alors vérifie le type. Tu dois trouver des types "jpg", "png" ou "gif" avec la fonction pathinfo().
- Ensuite tu veux les trier chronologiquement, alors récupère la date de la dernière modification avec la fonction filemtime
Met ça dans un tableau associatif et ajoute une condition dans le if en remplacement du test sur "$current".

Ensuite, on fait des tris de tableaux en utilisant array_multisort(), tout ceci est directement tiré de la documentation PHP. Essayes comme ceci :
<?php
$current  = $_SERVER['PHP_SELF'];
$path     = '.';
$num_page = (isset($_GET['page']) && is_numeric($_GET['page']) ? $_GET['page'] : 1);
$i        = 0;
$compteur = 0;
$debut    = ($num_page - 1) * 112;
$fin      = $debut + 111;

$liens    = array();
$types    = array("jpg", "png", "gif");

/* Parcours du répertoire pour collecter les informations */
$dh       = opendir($path);
while (($file = readdir($dh)) !== false)
{
    if(!is_dir($file) && $file != '.' && $file != '..')
    {
        $infos = pathinfo($file);
        if(isset($infos['extension']) && in_array($infos['extension'], $types))
        {
            /* Construction du lien sur l'image */
            $liens[$i]['adresse'] = '<a href="lightbox/'. $file .'" rel="lightbox[photos]"><img src="'. $path .'/'. $file .'" alt="" /></a> ';
            /* Stockage de la date de dernière modificaiton di fichier */
            $liens[$i]['date']    = filemtime($file);
            $i++;
            $compteur++;
        }
        /* Nettoyage des informations stockées sur le fichier */
        clearstatcache();
    }
}
closedir($dh);

/* Construction de la barre de navigation */
$precedant  = $num_page > 1                 ? '<a href="'.$current.'?page='.($num_page - 1).'"><img src="images/precedent.png" alt="" /></a>' : '<img src="images/precedent.png" alt=""/>';
$suivant    = (112 * $num_page) < $compteur ? '<a href="'.$current.'?page='.($num_page+1).'"><img src="images/suivant.png" alt="" /></a>'     : '<img src="images/suivant.png" alt="" />';
$navigation = '<p style="text-align:center">'. $precedant . $suivant .'</p>';

// Obtient une liste de dates
foreach ($liens as $cle => $ligne)
{
    $date[$cle]    = $ligne['date'];
}

// Trie les données par adresse (croissant), date (croissant)
// Ajoute $liens en tant que dernier paramètre, pour trier par la clé commune
array_multisort($date, SORT_ASC, $liens);

/* Création des liens */
$liste_liens = '';
foreach ($liens as $cle => $val)
{
    $liste_liens .= $liens[$cle]['adresse'];
}

/* Affichage */
echo($navigation);
echo '<p style="text-align:center">'. $liste_liens .'</p>';
echo($navigation);
?>
Si tu as bien suivi ce code, tu verras que pas mal de chose ont disparu par rapport à l'original. D'abord on traite et on trie les données, on prépare ce qu'il y aura à afficher. Ensuite seulement on affiche et ça tient en trois lignes.

Listing et tri chronologique d'un répertoire

par Matthias » 09 mars 2008, 02:47

Bonjour,

Je cherche à lister les fichiers d'un répertoire d'une manière chronologique. Je bloque sur le classement chronologique.
J'ai fait cela pour le moment (ajout d'une pagination) :
<?php
$path = '.';
$current = $_SERVER['PHP_SELF'];
$num_page=(is_numeric($_GET['page'])?$_GET['page']:1);
$dh = opendir($path);
$i = 0;$compteur = 0;
$debut = ($num_page - 1) * 112;
$fin = $debut + 111;
while (($file = readdir($dh)) !== false) {
if($file != '.' && $file != '..' && $file != $current) {
$i++;$compteur++;
}
}
closedir($dh);

echo '<p style="text-align:center">';
echo ($num_page > 1?'<a href="'.$current.'?page='.($num_page - 1).'"><img src="images/precedent.png" alt="" /></a>':'<img src="images/precedent.png" alt=""/>');

echo (112 * $num_page < $compteur?'<a href="'.$current.'?page='.($num_page+1).'"><img src="images/suivant.png" alt="" /></a>':'<img src="images/suivant.png" alt="" />');
echo '</p>';

echo '<p style="text-align:center">';
$path = '.';
$current = $_SERVER['PHP_SELF'];
$num_page=(is_numeric($_GET['page'])?$_GET['page']:1);
$dh = opendir($path);
$i = 0;$compteur = 0;
$debut = ($num_page - 1) * 112;
$fin = $debut + 111;
while (($file = readdir($dh)) !== false) {
if($file != '.' && $file != '..' && $file != $current) {
if ($i >= $debut && $i <= $fin) {
printf('<a href="lightbox/%s" rel="lightbox[photos]"><img src="%s/%s" alt="" /></a> ', $file, $path, $file);
}
$i++;$compteur++;
}
}
echo '</p>';
closedir($dh);

echo '<p style="text-align:center">';
echo ($num_page > 1?'<a href="'.$current.'?page='.($num_page - 1).'"><img src="images/precedent.png" alt="" /></a>':'<img src="images/precedent.png" alt="" />');


echo (112 * $num_page < $compteur?'<a href="'.$current.'?page='.($num_page+1).'"><img src="images/suivant.png" alt="" /></a>':'<img src="images/suivant.png" alt="" />');
echo '</p>';
?>
Avez-vous des conseils ou des bouts de codes à me donner ?

D'avance, merci !