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, par défaut = 4

Description

(pagination)->nombreDeCellule = (int) 4;

item_par_page

Nombre maximum d'item à afficher par page, par défaut = 24

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.

Exemple de retour
SELECT * FROM database => SELECT * FROM database LIMIT 0,20
Attention
Ne fonctionne pas correctement avec les requetes imbriquées et HAVING

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&amp;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."&nbsp;&nbsp;&nbsp; \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.

Toutes mes classes