Télécharger
pagination.class.php (version : 1.0.1)
Dimanche 29 Novembre 2020 par Loïc Doumerc
Le principe de cette classe est de générer une pagination avec la Framework Semantic-UI.
Les attributs
url
Spécifie le lien à afficher.
La variable [NUMPAGE] sera automatiquement remplacée par le numéro adéquate.
Description
(pagination)->url = (string) '?genre=5&page=[NUMPAGE]';
pageCourante
Spécifie le numéro de la page courante, par défaut = 1.
Description
(pagination)->pageCourante = (int) $_GET['page'];
nombreDeCellule
Nombre maximum de cellule (boutons) de chaque coté du numéro de la page courante,
Description
(pagination)->nombreDeCellule = (int) 4;
item_par_page
Nombre maximum d'item à afficher par page,
Description
(pagination)->item_par_page = (int) 24;
pageTotal
Indique le nombre de page
Description
(pagination)->pageTotal = (int) 100;
Les méthodes
calculePageTotal
Calcule le nombre de page suivant une requête passée en argument et retourne une requête SQL contenant les LIMIT.
Description
(pagination)->calculePageTotal( (string) $requete_de_base, (cache) &$cache) : (string)
Liste des paramètres
$requete_de_base
Chemin vers le fichier de chache, évitez les caractères spéciaux et changez le à chaque fois que vous utilisez start.
$cache
Pointeur vers un objet de type (cache).
Voir cache.class.php
create
Affiche la pagination
Description
(pagination)->create() : (void)
Exemples
Pagination minimaliste
<?php require_once('pagination.class.php'); $pagination = new pagination(); $pagination->url = '?page=[NUMPAGE]'; $pagination->pageCourante = !isset($_GET['page']) ? 1 : ((int)$_GET['page']) ; $pagination->nombreDeCellule = 2;//nombre de numéros de page de chaque côté du numéro de la page courante (défaut : 4) $pagination->pageTotal = 10; /* Affichage des items par vos soins */ $pagination->create();
Pagination grâce à MySQLi (cache.class.php)
<?php require_once('pagination.class.php'); $pagination = new pagination(); $pagination->url = '?page=[NUMPAGE]'; $pagination->pageCourante = !isset($_GET['page']) ? 1 : ((int)$_GET['page']) ; $pagination->nombreDeCellule = 2;//nombre de numéros de page de chaque côté du numéro de la page courante (défaut : 4) $pagination->item_par_page = 24;//(défaut : 24) require_once('cache.class.php'); $cache = new cache(); $query = "SELECT * FROM database"; $query = $pagination->calculePageTotal($query, $cache); /* Affichage des items */ $pagination->create();
Les fichiers
pagination.class.php
<?php /********************************************************* * Fichier : pagination.class.php * Début du projet : 12 juillet 2020 16h15 * Modification : 22 aout 2020 9h21 * * Adapté de la source : http://www.notoon.com/tutoriaux/php-pagination-style-digg/ * Propriété de Loïc Doumerc loic@mamessagerie.fr *********************************************************/ /* require_once('pagination.class.php'); $pagination = new pagination(); $pagination->url = 'film_liste.php?page=[NUMPAGE]'; $pagination->pageCourante = 1; $pagination->nombreDeCellule = 4;//nombre de numéros de page de chaque côté du numéro de la page courante (défaut : 4) $pagination->item_par_page = 24;//(défaut : 24) //$pagination->pageTotal = 1;//Préférez $pagination->calculePageTotal($requete_de_base, $cache) $query = $pagination->calculePageTotal($query, $cache);/!\ Attention un BUG existe avec les requetes imbriquées et HAVING $pagination->create(); $this->url - URL ou nom de la page qui doit inclure le parametre de la page ex: index.php?page=[NUMPAGE] http://example.com/?page=[NUMPAGE] index.php?genre=5&page=[NUMPAGE] index-genre-5-page-[NUMPAGE] */ class pagination { var $url = null; var $pageCourante = 1; var $pageTotal = 1; var $nombreDeCellule = 4;//nombre de numéros de page de chaque ct du numro de la page courante var $item_par_page = 24; var $param_get = null; function create( ) { /* Déclaration des variables */ $prev = $this->pageCourante - 1; // numéro de la page précédente $next = $this->pageCourante + 1; // numéro de la page suivante if( $this->pageCourante > $this->pageTotal - $this->nombreDeCellule ) { $adjPrev = $this->nombreDeCellule + ($this->nombreDeCellule -($this->pageTotal-$this->pageCourante)); } else { $adjPrev = $this->nombreDeCellule; } if( $this->pageCourante <= $this->nombreDeCellule ) { $adjNext = $this->nombreDeCellule + ($this->nombreDeCellule -$this->pageCourante) +1; } else { $adjNext = $this->nombreDeCellule; } //Initialisation de la variable à retourner $pagination = ''; //Si il n'y a pas au moins deux pages : l'affichage reste vide if ($this->pageTotal > 1) { $pagination .= '<div class="pagination" style="text-align:center;">Pages '.$this->pageCourante.'/'.$this->pageTotal." \n"; if ($this->pageCourante > 1) { $pagination .= ' <div class="ui buttons">'."\n"; $pagination .= '<a href="'.$this->urlize(1).'" class="ui button" ><i class="icon fast backward"></i></a>'; $pagination .= '<a href="'.$this->urlize($prev).'" class="ui button" ><i class="icon backward"></i></a>'; $pagination .= ' </div>'."\n"; } $pagination .= ' <div class="ui buttons">'."\n"; for($i = $this->pageCourante -$adjPrev; $i < $this->pageCourante ; $i++) { if( $i> 0) { $pagination .= ' <a href="'.$this->urlize($i).'" class="ui button">'.$i.'</a>'."\n"; } } $pagination .= ' <a href="'.$this->urlize($this->pageCourante).'" class="ui button primary">'.$this->pageCourante.'</a>'."\n"; for($i = $this->pageCourante + 1; $i <= $this->pageCourante + $adjNext ; $i++) { if( $i<= $this->pageTotal) { $pagination .= ' <a href="'.$this->urlize($i).'" class="ui button">'.$i.'</a>'."\n"; } } $pagination .= ' </div>'."\n"; if ($this->pageCourante < $this->pageTotal) { $pagination .= ' <div class="ui buttons">'."\n"; $pagination .= ' <a href="'.$this->urlize($next).'" class="ui button"><i class="icon forward"></i></a>'."\n"; $pagination .= '<a href="'.$this->urlize($this->pageTotal).'" class="ui button" ><i class="icon fast forward"></i></a>'; $pagination .= ' </div>'."\n"; } $pagination .= '</div>'."\n"; } echo $pagination; return $pagination; } function urlize($numpage) { return @preg_replace ( '#\[NUMPAGE\]#ims', $numpage, $this->url); } // /!\ Attention un BUG existe avec pagination.class.php avec les requetes embriquées et HAVING function calculePageTotal($requete_de_base, &$cache) { //On doit modifier lq requete de facon a avoir COUNT(*) entre SELECT et FROM et supprimer les ordres qui pourrait faire buger le comptage $requete_de_base_count = @preg_replace ( '#SELECT(.*)FROM#ims' , 'SELECT COUNT(*) as total_ligne FROM' , $requete_de_base); $requete_de_base_count = @preg_replace ( '#ORDER BY(.*)$#ims' , '' , $requete_de_base_count); /* Calcul du nombre total d'item */ $total = 0;//initialisation $result = $cache->query($requete_de_base_count); if( $row = $result->next() ) { $total = $row->total_ligne; } // calcul du nombre de pages (on arrondit à l'entier supérieur) $this->pageTotal = ceil($total/$this->item_par_page); /* $start est la valeur de départ du LIMIT dans notre requête SQL (est fonction de la page courante) */ $start = ($this->pageCourante * $this->item_par_page - $this->item_par_page); /* Récupération des données à afficher pour la page courante */ $qry = $requete_de_base." LIMIT $start, $this->item_par_page"; return $qry; } }
À propos
Je suis développeur depuis près de 20 ans.
Principalement dans le milieu web.