Système de pagination complet

Soyez le premier à donner votre avis sur cette source.

Vue 17 292 fois - Téléchargée 1 573 fois

Description

Bonjour, PHPPager est une implémentation d'un système de pagination en PHP 5 (5.3.0 minimum) entièrement modulable avec spéparation complète de la partie algorithme de la partie présentation, il est alors très facile de personnaliser l'affichage.

Je fournis des exemples avec plusieurs modèle de template d'affichage.
Merci commenter cette source pour donner votre avis, pour toutes suggestions d'amélioration, correction de bug...

demo et documentation :

http://www.guillaume-genet.fr/phpPager

installation (pour les pages de test) :
- créer une base de données (ex: pager)
- exécuter le script pager.sql pour créer le jeu de test
- configurer la connexion à la page de données dans le fichier connexion.php

Source / Exemple :


//index.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<?php
	  require_once __DIR__.'/../../../lib/autoload.php';
	  require_once __DIR__."/../../../connexion.php";
	?>

	<head>
		<meta http-equiv="Content-type" content="text/html; charset=UTF-8"/>
	    <link href="pager.css" rel="stylesheet" type="text/css" />
	    <script src="../../../jquery-1.6.1.min.js"></script>
	</head>
	<body>

		<h1> Exemple sliding </h1>
		<?php require_once(__DIR__.'/../../getSource.php');?><br /><br />
		<a href="../../../index.php">Retour</a>
		<?php  
		  $query = "select count(*) as total from article";
		  $stm = $bdd->query($query);
		  
		  $result = $stm->fetch();
		  $stm->closeCursor();
		  $stm = null;
	
		  $pager = new Pager\Pager(new \Pager\Scrolling\Sliding(5));
		  $pager->setItemCount($result['total']);
		  $pager->setItemCountPerPage(6); 
		  $pager->setUrl("index.php?page=%d%"); 

		  if(isset($_GET["page"]))  
		  {
		  		//setPage renvoie une erreur si le numéro de page est incorrecte ou si on a pas passé un entier -> 
		    	//cela permet de prévenir le cas où l'utilisateur tente d'accéder à une page qui n'existe pas.
			    //Il faut donc catcher l'exception et renvoyer sur la page d'ereur du site, voir logger l'erreur dans un fichier
			    try 
			    {
			        $pager->setPage(intval($_GET["page"])) ;
			    }
			    catch(Exception $e) 
			    {
			        echo "erreur:".$e->getCode()." : ".$e->getMessage();
			        //echo "La page ".$_GET["page"]." n'existe pas <br/>";
		       		die();
		   	 	}
	  	  }
	  	  
		  //construction de la requête
	  	  $query = "select * from article limit ".$pager->getLeftLimit().", ".$pager->getRightLimit();

		  $stm = $bdd->query($query);
		  $stm->setFetchMode(PDO::FETCH_OBJ);
		  $articles = $stm->fetchAll();
	  	?>
	  	
		<!-- affichage des articles -->
		<?php foreach ($articles as $article): ?>
		   <p>
		      Titre : <?php echo $article->titre; ?>
		      <br/>
		      Texte:  <?php echo $article->contenu; ?>
		   </p>    
		   
		<?php endforeach; ?>
			  
		<?php 
		  	if($pager->haveToPaginate())
		  		include "pager.php"; //inclusion du template 
		?>	
	</body>
</html>

// pager.php

<div id="pager">
    Page <?php echo $pager->getCurrentPage();?> sur  <?php echo $pager->getLastPage();?>, 
    De <?php echo $pager->getFirstIndice()+1;?> à <?php echo $pager->getLastIndice()+1;?>
    <br/>  
    
    <!-- première page-->
    <a href="<?php echo $pager->rewriteUrl($pager->getFirstPage()); ?>" > << </a>
    
    <!-- page précédente -->  
    <?php if($pager->getPreviousPage() !== null) : ?>
      	<a href="<?php echo $pager->rewriteUrl($pager->getPreviousPage()); ?>" > < </a>
    <?php endif; ?>
    &nbsp; 
    
    <!-- liste les pages -->   
   <?php foreach($pager->getPages() as $numPage): ?>
       <?php if($numPage == $pager->getCurrentPage()): ?>
          [<?php echo $numPage; ?>]
       <?php else : ?>
          <a href="<?php echo $pager->rewriteUrl($numPage)?>"><?php echo $numPage; ?></a>
       <?php endif; ?>
    <?php endforeach; ?>
    
    &nbsp;
    <!-- page suivante -->  
    <?php if($pager->getNextPage() !== null) : ?>
      	<a href="<?php echo $pager->rewriteUrl($pager->getNextPage()); ?>" > > </a>
    <?php endif; ?>
    
    <!-- dernière page-->
    <a href="<?php echo $pager->rewriteUrl($pager->getLastPage()); ?>" > >> </a>     
</div>

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

webdeb
Messages postés
509
Date d'inscription
samedi 5 avril 2003
Statut
Membre
Dernière intervention
31 mars 2009
3
Hello,

Ta source est plutôt bien faite, bravo. Au niveau améliorations et simplification tu peux retirer le __construct() ne contenant qu'un appel au constructeur parent. Par défaut, PHP appel le constructeur parent donc on peut se passer de réimplémenter le constructeur si c'est uniquement pour appeler celui du parent. D'autre part, tu devrais retirer les commentaires de séparation de tes méthodes. Ils ne servent à rien si ce n'est d'alourdir la lecture du code.

Je te conseille plutôt d'avoir recours au mot-clé protected plutôt que private pour faciliter les héritages de tes classes. Dans tes constructeurs, il serait judicieux de passer au moins paramètre (obligatoire ou facultatifà : le nombre d'éléments par page:

public function __construct($nbByPage = 10)
{
$this->nbByPage = (int) $nbByPage;
}

Enfin pour le pager SQL, ton objet PDO je ne devrait pas être instancié directement dans ta méthode mais plutôt passé par dépendance au constructeur par exemple. Ca te permettra deux choses :

* Pouvoir réutiliser un objet PDO existant
* Faciliter les tests unitaires de tes classes en "mockant (simulant)" l'objet PDO avec un objet qui se comporte comme lui sans faire les requêtes SQL sur la base.

Ce qui donne :

class PagerSql extends Pager
{
protected $pdo, $table;
public function __construct(PDO $pdo, $table null, $nbByPage 10)
{
parent::__construct($nbByPage);

$this->pdo = $pdo;
$this->table = $table;
}
}

Je te laisse améliorer ton code en conséquence ;)

Hugo.
genetApt151
Messages postés
30
Date d'inscription
lundi 7 mai 2007
Statut
Membre
Dernière intervention
2 avril 2011
1
Merci d'avoir répondu.

Effectivement, la classe PagerSql n'est pas très bien implémentée. Je vais passer l'objet pdo en paramètre pour abstraire la partie connexion à la base de données.

Passer des paramètres par défaut, j'y avais pas pensé. C'est un truc que je n’utilise jamais d'habitude. En fait, le problème avec PHP est qu'on ne peut pas définir plusieurs méthodes de même nom de prototype différent comme en java, c++.

Et enfin je ne vois pas l'intérêt d'avoir recours au mot-clé protected plutôt que private. ça sert à rien à part de permettre de faire n'importe quoi dans les classes filles et entrainer des erreurs.

Si on veut accéder aux attributs, il y a les setters et getters pour cela.
cs_mouloudia16
Messages postés
7
Date d'inscription
jeudi 31 janvier 2008
Statut
Membre
Dernière intervention
3 mai 2010

Bonjour GENETAPT151,
Le lien ne fonctionne pas.
Bon courage.
Cordialement
genetApt151
Messages postés
30
Date d'inscription
lundi 7 mai 2007
Statut
Membre
Dernière intervention
2 avril 2011
1
Salut, si le lien fonctionne mais il faut enlever l'espace 'exemplePage r'. j'ai tout essayé mais cette espace est toujours rajouté automatiquement dans la description.

lien : http://guillaume-genet.100webspace.net/exemplePager/index.php
bj33
Messages postés
145
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
1 mai 2012

salut

<< webdeb

Non, le constructeur parent doit être explicitement appellé dans la classe fille si la classe mère définie un constructeur. c'est bien spécifié içi :

http://fr2.php.net/manual/fr/language.oop5.decon.php

<< GENETAPT151

Pour une première, chapeau! çà remonte le niveau débutant. Merci pour eux.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.