Jump to content
×
×
  • Create New...

Class - Pagination


Recommended Posts

  • Retraité

Bonjour,

 

Comme indiqué dans le titre, ce tutoriel vise à vous apprendre à créer une class de pagination.On va pas tourner cent ans autour du pot, commençons dès maintenant...

 

Pagination ? Kézako ?

 

Révélation

Bien. Vous voulez afficher vos news sur votre page news; jusque là OK.Mais vous en avez vraiment beaucoup, une centaine ! Vous imaginez la longueur de la page avec la centaine de news affichées ? Imaginez vous la longueur du chargement de la page si il y en a vraiment beaucoup ?Et reconnaissez que niveau esthétique c'est pas formidable d'avoir des dizaines & des dizaines de news affichées sur sa page.Des codeurs ont donc inventé (me demandez pas qui, je sais pas :hehe!:)la Pagination :idea:C'est en faite une façon de répartir les données à afficher (Ex.: News) sur plusieurs pages avec une liste des liens en bas de la page.Ça y est, vous voyez ce que c'est maintenant ? :) Vous pouvez la voir sur quasi tous les sites/forums !

 

Pourquoi faire une class au lieu d'un code simple à insérer dans notre page ?

 

Révélation

Soit, vous avez envie de faire tout directement dans votre page, mais regardons plutôt les inconvénients:- La cinquantaine (environ) de lignes nécessaire à la pagination ne fera qu'alourdir et salir votre code. Moi même je ne fais attention à la propreté que depuis quelques semaines, mais sachez que l'organisation de votre code est un élément à ne surtout pas négliger.Pourquoi ? Tout simplement parce qu'un code léger et bien organisé permet d'être modifié/arrangé d'autant plus facilement => Pas de prise de tête à tenter de comprendre son fonctionnement après quelques temps sans le toucher.Donc faites dès maintenant attention à la propreté & l'organisation de votre code ! :P Ensuite, la deuxième raison pour éviter de mettre directement le code dans la page:- S'il vous faut réécrire la pagination pour une autre page, vous allez sacrément vous faire c****. En bon flemmard de webmaster, vous allez donc tenter de remédier à ce problème en rendant le code facilement utilisable n'importe où grâce à la ... POO ! :P Convaincus 🆒 ? Passons donc directement au vif du sujet... Le codage !

 

 

Révélation

 

Avant de commencer : Créez un un fichier pagination.class.php où vous mettrez la class et prenez pour page de teste une de vos pages.

Nous faisons donc une classe,une classe nommée Pagination. On va donc de suite la créer :

class Pagination{
	// Code
}

Avant d'aller plus loin, il faut réfléchir à notre code.De quoi aura-t-il besoin pour fonctionner ?

 

Eh bien comme toutes classes, de deux choses, ainsi que d'une troisième tout compte fait :hehe!: :- De ses attributs (= variables)- De son constructeur afin de donner une valeur aux attributs - De ses méthodes (= fonctions) A présent, de quels attributs notre code aura-t-il besoin ? Afin de pouvoir l'utiliser facilement n'importe où, notre classe doit être flexible & configurable au maximum.En premier lieu, pour la liste des pages nous avons besoin de la base de l'URL ($_GET compris s'ils sont nécessaires au fonctionnement de la page).Il faut donc une variable pour stocker la base de l'URL :

class Pagination{
	private $_Base_Url; // Base de l'url, où on y rajoute la variable n (pagination)
}

L'attribut est en private car seul la classe en a besoin.Ensuite, on doit savoir combien d'entrées mettre par page :

class Pagination{
	private $_Base_Url; // Base de l'url, où on y rajoute la variable n (pagination)
	private $_Per_Page; // Nombre d'entrées à mettre par page
}

Afin de savoir quelles entrées afficher sur la page courante, on doit savoir sur quelle page on est :

class Pagination{
	private $_Base_Url; // Base de l'url, où on y rajoute la variable n (pagination)
	private $_Per_Page; // Nombre d'entrées à mettre par page
	private $_Current; // Page actuelle
}

Enfin, afin de savoir le nombre de liens vers les pages à afficher, on doit connaître le nombre d'entrées :

class Pagination{
	private $_Base_Url; // Base de l'url, où on y rajoute la variable n (pagination)
	private $_Per_Page; // Nombre d'entrées à mettre par page
	private $_Current; // Page actuelle
	private $_RowCount; // Nombre d'entrées
}

Et voilà ! C'est tout pour les attributs :smiling:

 

A présent, on doit initialiser nos variables à l'aide du constructeur. Mais comment ?
Afin qu'à l'appel de notre classe on puisse la configurer selon nos souhaits, on va utiliser un array config. Un array associatif pour être plus précis.Notre array contiendra donc les données correspondants aux variables private de la classe.Maintenant, à vous de faire l'array, j'vais pas tout vous faire namého ! :dodgy:Rappel:Cet array doit être crée sur la page où doit être faite la pagination (pour ensuite être envoyé en args à la classe).

$config = array (
	'Base_Url' => '?page=news&act=1',
	'Per_Page' => $News_Per_Page,
	'Current'  => $CurrentPage,
	'RowCount' => $nbre
);

Les trois variables ont été auparavant initialisées :

 

  • $News_Per_Page est une variable initialisée sur la config.php contenant le nombre de news à mettre par pages.• $CurrentPage est une variable contenant le numéro de la page actuelle (Grâce à $_GET['n']; n étant le numéro de la page actuelle)
  • $nbre est la variable contenant le nombre d'entrées de la table à afficher (par exemple news).

 

A présent que tout est prêt, il ne nous reste plus qu'à faire le constructeur.Rappel de la structure d'un constructeur :

public function __construct(array $config){
	// Code
}

Le mot-clé "array" sert juste à préciser que la variable $config attendu est un array. Maintenant, initialisez les variables à l'aide de la $config !

public function __construct(array $config){
	$this->_Base_Url = $config['Base_Url'];
	$this->_Per_Page = $config['Per_Page'];
	$this->_Current  = $config['Current'];
	$this->_RowCount = $config['RowCount'];
}

Bien, maintenant que les variables sont crées & initialisées, vous pouvez mettre ça sur votre page à "paginer" :D :

include("chemin_vers/pagination.class.php");
$CurrentPage = intval($_GET['n']);	/* * Requête + Variable $nbre contenant le nombre d'entrées  */

$config = array (
	'Base_Url' => 'Base_url ou on ajoute lors de la pagi $_GET['n']',
	'Per_Page' => $News_Per_Page,
	'Current'  => $CurrentPage,
	'RowCount' => $nbre
);

$Pagination = new Pagination($config); // Enfin, on crée un objet Pagination

Il ne reste plus qu'une chose; les méthodes ! 2 méthodes suffiront : 

 

  • L'une pour trouver les limits de la requête SELECT afin de n'afficher que les entrées correspondants à la page actuelle.
  • L'autre pour afficher la liste des liens vers les pages.

 

Commençons par la fonction limits() Vous devrez normalement avoir tous (oupah' :D) déjà écrit la base de cette fonction :

function limits(){
	// Code
}

Bien, nous devons donc trouver les limites de la requête SQL pour afficher les bonnes entrées.Je ne vais pas trop expliquer sur le comment et le pourquoi de la façon d'obtenir ces limites, je sais pas trop comment l'expliquer; je me suis appuyé sur un autre script de pagination pour ça.

 

Pour $min :

$min = ($this->_Current-1)*$this->_Per_Page;	
Pour $max :
 $max = $this->_Per_Page;
Si vous avez vraiment du mal, je vous invite à revoir le fonctionnement de LIMIT (SQL) sur le Site du Zér0Maintenant qu'on a les limites, il ne reste plus qu'à les renvoyer à l'aide d'un array:
return $limits = array (
	'Min' => $min,
	'Max' => $max
);

La fonction limits() complète est donc :

public function limits()  // Renvoi les limites pour la requête sous forme d'array{ $min = ($this->_Current-1)*$this->_Per_Page;	 $max = $this->_Per_Page; return $limits = array ( 'Min' => $min, 'Max' => $max);}

Utilisation de la fonction limits() : Bon, vous voulez tester tout ça je suppose.Vous n'avez donc qu'à stocker les limites dans un array sur la page à paginer :

$limits = $Pagination -> limits();

Puis à faire la requête SQL à l'aide de cet array.Exemple :

$query = mysql_query('SELECT * FROM news ORDER BY id DESC LIMIT '.$limits['Min'].','.$limits['Max']);

Il ne reste ensuite qu'à afficher le contenu de la variable à l'aide d'un while

while($donnees = mysql_fetch_array($query)){
	// Code
}

Et la toute dernière partie, l'affichage des liens vers les pages :

Encore une fois, vous devrez normalement déjà avoir mis la base :D :

public function ListPages(){
	// Code
}

Bon, première étape; il faut tout d'abord savoir le nombre de "liens-pages" à afficher :

$PageCount = ceil($this->_RowCount / $this->_Per_Page); // Nbre de pages

J'ai appliqué un ceil() pour ne pas avoir d'erreur si le nombre de pages est un nombre décimal.Rappel:La fonction ceil() sert à prendre le nombre entier juste au dessus de celui envoyé en argument Ensuite, une simple boucle for afin d'afficher un lien tant que le numéro de la page-lien est en dessous ou égal que le nombre de pages.

$PageCount = ceil($this->_RowCount / $this->_Per_Page); // Nbre de pages
echo '<div class="pagination">Pages : ';

for($n=1; $n <= $PageCount; $n++){
	...
}

echo '</div>';

Ensuite, si le lien actuel est celui de la page actuelle, alors on le met en gras & sans liens : (Désolé si je m'exprime mal, j'en pète là >_<)

$PageCount = ceil($this->_RowCount / $this->_Per_Page); // Nbre de pages
echo '<div class="pagination">Pages : ';

for($n=1; $n <= $PageCount; $n++){
	If($n == $this->_Current){
		echo ' '.$n.' ';
	}
}

echo '</div>'; 

Et enfin, "sinon"; on affiche le lien normal :

$PageCount = ceil($this->_RowCount / $this->_Per_Page); // Nbre de pages
echo '<div class="pagination">Pages : ';

for($n=1; $n <= $PageCount; $n++){
	If($n == $this->_Current){
		echo ' '.$n.' ';
	}else{
		echo ' '.$n.' ';
	}
}

echo '</div>';

Aller, encore un petit quelque chose, le "Suivant" :

If($this->_Current < $PageCount){
	$lastPage=($this->_Current) + 1; echo '|  Suivante ';
}

Je vous laisse comprendre son fonctionnement tout seuls, c'est pas compliqué :pVous devez le placer à la fin de la boucle for.Pour ceux voulant le css de .pagination :

.pagination{
	width: 600px;
	height: 30px;
	padding-bottom: 4px;
	padding-top: 3px;
	background-color: rgb(245,235,208);
	background-position: center;
	border-radius: 3px;
	margin-left: 5px;
	margin-right: 5px;
}

.pagination a{
	color: black;
}

La fonction ListPages complète est donc :

public function ListPages(){
	$PageCount = ceil($this->_RowCount / $this->_Per_Page); // Nbre de pages
	echo '<div class="pagination">Pages : ';

	for($n=1; $n <= $PageCount; $n++){
		If($n == $this->_Current){
			echo ' '.$n.' ';
		}else{
			echo ' '.$n.' ';
		}
	}

	If($this->_Current < $PageCount){
		$lastPage = ($this->_Current) + 1;
		echo '|  <a href="https://example.com/index.php&page='.$lastpage.'">Suivante</a> ';
	}

	echo '</div>';
}

Utilisation de la fonction ListPages() : C'est tout bête, il suffit de placer sur votre page à l'endroit où vous souhaitez la liste:

$Pagination -> ListPages(); // Liste des pages
Voilà, ce tutoriel touche à sa fin (et c'était pas trop tôt :P) !Merci de l'avoir suivit jusqu'au bout, j'espère qu'il est assez bien expliqué.En échange de ce tutoriel, tout ce que je vous demande est de ne pas vous l'approprier, s'il vous plaît.J'ai mis du temps à le faire donc respectez mon travail.

 

 
Vous pouvez le partager sur un autre forum mais en me citant !
 
Cordialement,
Hey hey
Link to comment
  • Replies 9
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.