Pagination avec boucle while ? (opendir, readdir...)

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour, je me permet de vous demander un peu d'aide, car je suis bloqué par un truc.

Dans un admin, avec une boucle while (avec opendir, readdir) j'affiche toutes les images dans un dossier upload.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<div class="bibliotheque-img">  
    <?php
    $nb_fichier = 0;
    echo '<ul>';
    if($dossier = opendir('../../upload')) {                                        // fonction pour ouvrir un dossier
        while(false !== ($fichier = readdir($dossier))) {                           // si pas d'erreur ouvrir les fichiers
            if($fichier != '.' && $fichier != '..' && $fichier != 'index.php') {        // pour afficher que les img
            ?>
                <form onSubmit="return(confirm('Etes vous sur de supprimer définitivement cette image ?'));"  id="suppr-bibliotheque" method="post" action="traitement_bibliotheque.php"><li><img src="../../upload/<?php echo $fichier; ?>" height="auto" width="40px">
                <?php
                $nb_fichier++;
                echo '<input type="hidden" name="nom_fichier" value="'.$fichier.'">';
                echo '<a href="../../upload/'.$fichier.'">'.$fichier.'</a><input type="submit" name="suppr" value="Supprimer"></li></form>';
            }

        }   // END boucle while
        echo '</ul>';
        echo '<p class="nb-fichiers">Il y a <strong>' . $nb_fichier .'</strong> fichiers dans le dossier d\'upload</p>';
        closedir($dossier);
    }
    else {
         echo 'Le dossier n\' a pas pu être ouvert';
    }
    ?>
</div>

Je souhaite faire une pagination, (je sais faire des paginations avec des requêtes SQL, mais la je ne vois pas comment).

Pour le moment j'en suis ici:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php                       
$Images = $nb_fichier;          // $nb_fichier : nombre de fichiers dans boucle while
$parPage = 10;
$nbPages = ceil($Images/$parPage);

if(isset($_GET['p']) && $_GET['p']>0 && $_GET['p']<=$nbPages) {
    $PageEnCours = $_GET['p'];
}
else {
    $PageEnCours = 1;
}
?>

// afficher la pagination:
<span class="span-pagination">
    <?php
    $PremPage = $PageEnCours -4;            // limiter le début
        if($PremPage>=1) {
            $PageDepart = $PremPage;
        }
        else {
            $PageDepart = 1;
        }

    $DerPage = $PageEnCours +4;             // limiter la fin
        if($DerPage<=$nbPages ) {
            $PageFin = $DerPage;
        }
        else {
            $PageFin = $nbPages;
        }

    for($i=$PageDepart; $i<=$PageFin; $i++) {
        if($i == $PageEnCours) { ?>
            <span class="pagination-active"><?php echo $i ?></span>
        <?php }
        else { ?>
            <a class="liens-pagination" href="?p=<?php echo $i ?>"><?php echo $i ?></a>
        <?php }
    }
    ?>
</span>

Et je suis un peu perdu. Par exemple si j'ai 30 images, ma pagination affiche bien 1 - 2 - 3, mais ça ne se limite pas à 10 par pages, toute les images s'affichent les unes en dessous des autres.

Est-ce possible de m'aider un peu SVP? Merci beaucoup.

Édité par Coyote

+0 -0

Salut !

Le souci est que tu utilises une boucle while qui va, fort justement, afficher tous les fichiers.

Vu qu'il n'y a apparemment pas moyen de spécifier un nombre d'éléments à ignorer ou une limite avec readdir, je te propose d'utiliser une boucle for un peu remaniée pour faire ce que tu souhaites, quelque chose comme ceci :

1
2
3
4
5
6
<?php
for ($i = 0; ($fichier = readdir($dossier)) && ($i < ($PageEnCours + 1) * $parPage); $i++) {
    if ($i < ($PageEnCours * $parPage)) {
        continue;
    }
    // Le reste du code dans ta boucle while actuelle ne devrait pas avoir besoin d'être changé

Une possibilité de pagination avec readdir()

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0
Auteur du sujet

ok, merci beaucoup pour ton aide, mais après encore + d'une heure d’essais, ça ne fonctionne toujours pas.

Voici mon nouveau code:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
/* cette boucle while va servir à connaitre le nombre d'images dans le dossier d'upload.
(à la meme fonction de SELECT COUNT des paginations avec requetes SQL) */

$nb_fichier = 0;

if($dossier = opendir('../../upload')) {
        while(false !== ($fichier = readdir($dossier))) {
        if($fichier != '.' && $fichier != '..' && $fichier != 'index.php') {
            $nb_fichier++;
        }
    }

    echo '<p class="nb-fichiers">Il y a <strong>' . $nb_fichier .'</strong> fichiers dans le dossier d\'upload</p>';
    closedir($dossier);

}
else {
     echo 'Le dossier n\' a pas pu être ouvert';
}
?>

et:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?php       
$nbArticles = $nb_fichier;      // $nb_fichier : nombre de fichiers dans boucle while si-dessus
$parPage = 10;
$nbPages = ceil($nbArticles/$parPage);

if(isset($_GET['p']) && $_GET['p']>0 && $_GET['p']<=$nbPages && preg_match("/^[a-z0-9\-?_]+$/i",$_GET['p'])) {
    $PageEnCours = $_GET['p'];
}
else {
    $PageEnCours = 1;
}
?>

et (je pense que c'est dans cette partie le problème):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<div class="bibliotheque">  
    <?php
    echo '<ul>';

    if($dossier = opendir('../../upload')) {

        for($i = 0; ($fichier = readdir($dossier)) && ($i < ($PageEnCours + 1) * $parPage); $i++) {

            if($i < ($PageEnCours * $parPage)) {

                if($fichier != '.' && $fichier != '..' && $fichier != 'index.php') {        // pour afficher que les img
                ?>

                    <form  id="suppr-bibliotheque" method="post" action="traitement_bibliotheque.php"><li><img src="../../upload/<?php echo $fichier; ?>">

                    <?php

                    echo '<input type="hidden" name="nom_fichier" value="'.$fichier.'">';

                    echo '<a href="../../upload/'.$fichier.'">'.$fichier.'</a><input type="submit" name="suppr" value="Supprimer"></li></form>';

                }

            }

        }   // End boucle for

        echo '</ul>';
        closedir($dossier);

    }
    else {
         echo 'Le dossier n\' a pas pu être ouvert';
    }
    ?>
</div>

_J'ai actuellement 17 images dans mon dossier. Je demande à avoir 10 images par page. Ma pagination (où y a les numéros pour cliquer) m'affiche bien 2 numéros, mais lorsque je suis sur le numéro 1 ça m'affiche 8 images, et lorsque je suis sur le numéro 2 ça m'affiche toutes mes images.

Je pense que dans la boucle for ou pas bien loin, y'a encore un petit réglage à faire. Peut-ont encore m'aider SVP?

Merci beaucoup.

Édité par stephweb

+0 -0

Tu as adapté le if que je t'avais proposé, il devait être gardé quasiment tel quel (à une éventuelle soustraction près, je dirais).

D'ailleurs, du coup, il ne devrait pas y avoir d'addition dans le for.

Dernier point : vu que tu exclus .., . et index.php, ta pagination pourra être fausse, parce qu'il faut soustraire à $nb_fichiers ces trois qui ne seront pas affichés.

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0

Dans la boucle for proposée par Ymox, il commence à zéro, cela explique que ta seconde page affiche tous les resultats jusqu'a nbpage x nbparpage. Pour la seconde page il faut commencer à nbpage-1 x nbparpage. Mais comme l'a dit ymox, il faut prendre en compte les fichiers que tu as soustrais, sinon tu risques d'oublier des fichiers entres deux pages…

Édité par grugru

+0 -0
Auteur du sujet

OK merci. j'ai essayé d'enlever la ligne où je soustrais, ça change rien.

C'est effectivement peut etre du à ceci :

"Dans la boucle for proposée par Ymox, il commence à zéro, cela explique que ta seconde page affiche tous les resultats jusqu'a nbpage x nbparpage. Pour la seconde page il faut commencer à nbpage-1 x nbparpage"

Comment puis je faire pour qu'au premier tour ce soit $PageEnCours * $parPage et qu'au 2ème tour ce soit $PageEnCours-1 * $parPage ?

ps: je suis débutant, ça fait que 1 mois que je débute en php - sql, donc avec des trucs compliqué comme ceci, j'ai vraiment du mal.

Merci

Édité par stephweb

+0 -0

En fait, colle l'a dit grugru, j'ai calculé à partir de 0 et non de 1 comme toi. Du coup, là où il y a ($PageEnCours + 1), il faut simplement $PageEnCours, et là où il y a simplement $PageEnCours, il faut ($PageEnCours - 1).

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0
Auteur du sujet

Ok merci, je viens d'essayer de remplacer comme tu m'a dit.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<div class="bibliotheque">  
    <?php
    echo '<ul>';

    if($dossier = opendir('../../upload')) {                                        // fonction pour ouvrir un dossier

        for($i = 0; ($fichier = readdir($dossier)) && $i < ($PageEnCours * $parPage); $i++) {

            if($i < (($PageEnCours - 1) * $parPage)) {

                if($fichier != '.' && $fichier != '..' && $fichier != 'mypath.php' && $fichier != 'index.php') {        // pour afficher que les img
                    ?>

                    <form onSubmit="return(confirm('Etes vous sur de supprimer définitivement cette image ?'));"  id="suppr-bibliotheque" method="post" action="traitement_bibliotheque.php"><li><img src="../../upload/<?php echo $fichier; ?>" height="auto" width="40px">

                    <?php
                    echo '<input type="hidden" name="nom_fichier" value="'.$fichier.'">';

                    echo '<a href="../../upload/'.$fichier.'">'.$fichier.'</a><input type="submit" name="suppr" value="Supprimer"></li></form>';

                }

            }

        }   // End boucle for

        echo '</ul>';
        closedir($dossier);

    }
    else {
         echo 'Le dossier n\' a pas pu être ouvert';
    }
    ?>
</div>

Mais rien à faire, cette fois sur la page 1 j'ai zéro images qui s'affichent, et sur la page 2 j'ai 8 images qui s'affichent. que c'est dur

+0 -0

Je t'ai dit que le bloc if dans mon code n'était pas à modifier, or, tu ne l'as toujours pas repris  ;)

Edit

Je parle du bloc entier, pas juste de la condition, si jamais  :-°

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0
Auteur du sujet

a ok, merci de me l'avoir redis. mais je comprends pas trop ce que tu veut me dire. tu me parles de ce if la:

1
if($i < (($PageEnCours - 1) * $parPage)) {

car si je le remet tel tu me l'avais donné:

1
if ($i < ($PageEnCours * $parPage)) {

ça ne marche pas non plus.

+0 -0

Le bloc, pour moi, c'est le if, la condition, et tout ce qu'il y a entre les accolades (celles-ci incluses).

Il faut effectivement adapter la condition pour avoir ($i < ($PageEnCours * $parPage))

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0
Auteur du sujet

ok merci, mais comme j'ai écris plus haut, aussi comme ceci, ça ne marche pas

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<div class="bibliotheque">  
    <?php
    echo '<ul>';

    if($dossier = opendir('../../upload')) {                                        // fonction pour ouvrir un dossier

        for($i = 0; ($fichier = readdir($dossier)) && $i < ($PageEnCours * $parPage); $i++) {

            if($i < ($PageEnCours * $parPage)) {

                if($fichier != '.' && $fichier != '..' && $fichier != 'mypath.php' && $fichier != 'index.php') {        // pour afficher que les img
                    ?>

                    <form onSubmit="return(confirm('Etes vous sur de supprimer définitivement cette image ?'));"  id="suppr-bibliotheque" method="post" action="traitement_bibliotheque.php"><li><img src="../../upload/<?php echo $fichier; ?>" height="auto" width="40px">

                    <?php
                    echo '<input type="hidden" name="nom_fichier" value="'.$fichier.'">';

                    echo '<a href="../../upload/'.$fichier.'">'.$fichier.'</a><input type="submit" name="suppr" value="Supprimer"></li></form>';

                }

            }

        }   // End boucle for

        echo '</ul>';
        closedir($dossier);

    }
    else {
         echo 'Le dossier n\' a pas pu être ouvert';
    }
    ?>
</div>
+0 -0

Ce n'est toujours pas le bloc complet.

Il ne faut rien mettre d'autre entre les accolades que ce qui s'y trouve déjà dans ce que je t'ai fourni.

Là où j'avais mis un commentaire, tu mets ce que tu avais mis dans ta boucle while, mais sans le if qui a été adapté par mes soins.

Donc en gros, tu ne mets que les lignes 9 à 13 de ton tout premier code après le bloc if que je t'ai gracieusement fourni.

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0
Auteur du sujet

A ok. je pense avoir compris.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<div class="bibliotheque">  
    <?php
    echo '<ul>';

    if($dossier = opendir('../../upload')) {                                        // fonction pour ouvrir un dossier

        for($i = 0; ($fichier = readdir($dossier)) && $i < ($PageEnCours * $parPage); $i++) {

           if($i < (($PageEnCours-1) * $parPage)) {
                continue;
            }

                if($fichier != '.' && $fichier != '..' && $fichier != 'mypath.php' && $fichier != 'index.php') {        // pour afficher que les img
                    ?>

                    <form onSubmit="return(confirm('Etes vous sur de supprimer définitivement cette image ?'));"  id="suppr-bibliotheque" method="post" action="traitement_bibliotheque.php"><li><img src="../../upload/<?php echo $fichier; ?>" height="auto" width="40px">

                    <?php
                    echo '<input type="hidden" name="nom_fichier" value="'.$fichier.'">';

                    echo '<a href="../../upload/'.$fichier.'">'.$fichier.'</a><input type="submit" name="suppr" value="Supprimer"></li></form>';

                }

        }   // End boucle for

        echo '</ul>';
        closedir($dossier);

    }
    else {
         echo 'Le dossier n\' a pas pu être ouvert';
    }
    ?>
</div>

Je pensais que quand t'avais "continue;" c'était pour me dire de continuer mon code entre les accolades de ce if. Je ne savais pas que "continue;" vooulais dire quelque chose en PHP.

Visiblement avec le code ci-dessus, ça fonctionne.

Merci beaucoup

+0 -0

Je pensais que quand t'avais "continue;" c'était pour me dire de continuer mon code entre les accolades de ce if. Je ne savais pas que "continue;" vooulais dire quelque chose en PHP.

Visiblement avec le code ci-dessus, ça fonctionne.

Merci beaucoup

stephweb

Désolé, je n'y avais pas pensé  :p

Oui, continue est un mot-clé dans beaucoup de langages de programmation. Il te permet de forcer le programme à passer à l'itération suivante, donc, dans ton cas ici, au fichier suivant.

Il y aura encore un petit souci à mon avis, c'est que tu auras des fichiers qui se répéteront d'une page à l'autre, ou deux fichiers de pas assez sur certaines pages. La solution que je verrais serait de prendre la condition opposée de celle de la ligne 13, d'en faire un bloc juste après l'ouverture de la boucle for. Dans ce bloc, je mettrais ces deux lignes : $i--; continue;.

Au final, j'ai ça :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?php
for($i = 0; ($fichier = readdir($dossier)) && ($i < ($PageEnCours * $parPage)); $i++) {
    if ($fichier == '.' || $fichier == '..' || $fichier == 'index.php') {
        $i--;
        continue;
    }
    if ($i < (($PageEnCours - 1) * $parPage)) {
        continue;
    } ?>
        <li><form id="suppr-bibliotheque" method="post" action="traitement_bibliotheque.php"><img src="../../upload/<?php echo $fichier; ?>">
        <input type="hidden" name="nom_fichier" value="<?php echo $fichier; ?>">
        <a href="../../upload/<?php echo $fichier; ?>"><?php echo $fichier; ?></a> <input type="submit" name="suppr" value="Supprimer"></form></li><?php
}   // End boucle for

Une méthode finale pour pagination avec readdir()

Note que tu pourrais peut-être utiliser la fonction glob() plutôt que readdir(), afin de directement filtrer sur les extensions de fichiers  ;)

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte