Class de pagination

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 989 fois - Téléchargée 24 fois

Contenu du snippet

J'avais déjà fais une source d'une fonction de pagination (http://www.phpcs.com/code.aspx?ID=40509) et donc voilà une Class que j'ai amélioré (enfin j'espère XD) et rajouté quelques petits trucs ici et là.

Source / Exemple :


<?php
class Pagination
{
	private $nb_datas;
	private $nb_pages;
	private $current_page = 1;
	private $start_offset = 0;
	
	private $link;
	private $next_page;
	private $previous_page;
	private $first_page;
	private $last_page;
	
	/**

  • @var nombre de données sur une seule page
  • @access private
  • /
private $data_per_page = 10; /**
  • @var nombre de liens s'affichant sur les cotés de la page courante
  • @access private
  • /
private $nb_link_per_page = 5; /**
  • @var url de la page actuelle
  • @access private
  • /
private $url = ''; /**
  • @var activation de l'url rewriting
  • @access private
  • /
private $url_rewriting = false; /**
  • @var nom de la variable $_GET
  • @access private
  • /
private $var_page = 'page'; /**
  • @var separateur qui sépare (logique haha...) les liens entre eux
  • @access private
  • /
private $separator = '|'; /**
  • @var nombre d'espace avant le separateur
  • @access private
  • /
private $space_before = 1; /**
  • @var nombre d'espace après le separateur
  • @access private
  • /
private $space_after = 1; /**
  • @var options disponibles
  • @access private
  • /
private $options = array( 'nb_datas', 'data_per_page', 'nb_link_per_page', 'url', 'url_rewriting', 'var_page', 'space_before', 'space_after', 'separator' ); /**
  • Constructeur de la class avec en argument les options choisis
  • /
public function __construct($options = null) { $this->generateOptions($options); $this->generatePages(); $this->generateLink(); } /**
  • Génère les options
  • /
private function generateOptions($options) { foreach ($options as $key => $value) { if (in_array($key, $this->options) && !is_null($value)) { $this->$key = $value; } } } /**
  • Génère le nombre de pages, la page courante et le premiers offset
  • /
private function generatePages() { $this->nb_pages = ceil($this->nb_datas / $this->data_per_page); $this->current_page = !empty($_GET[$this->var_page]) && is_numeric($_GET[$this->var_page]) && $_GET[$this->var_page] < $this->nb_pages + 1 ? $_GET[$this->var_page] : 1; $this->start_offset = ($this->current_page - 1) * $this->data_per_page; } /**
  • Génère les liens
  • /
private function generateLink() { if ($this->url_rewriting) { $this->link = $this->url; $this->next_page = sprintf($this->url, $this->current_page + 1); $this->previous_page = sprintf($this->url, $this->current_page - 1); $this->first_page = sprintf($this->url, 1); $this->last_page = sprintf($this->url, $this->nb_pages); } else { $this->link = strstr($this->url, '?') ? '&' : '?'; $this->link .= $this->var_page . '='; $this->next_page = $this->link . ($this->current_page + 1); $this->previous_page = $this->link . ($this->current_page - 1); $this->first_page = $this->link . 1; $this->last_page = $this->link . $this->nb_pages; } } /**
  • Retourne le lien de la première page si la page courante est supérieur à 3 et celui de la page précédente
*
  • @return string
  • /
public function getFirstLinks() { $display = ''; if ($this->current_page != 1) { if ($this->current_page >= 3) { $display .= ' <a href="' . $this->first_page . '"><<</a> '; } $display .= ' <a href="' . $this->previous_page . '" ><</a> '; return $display; } } /**
  • Retourne le lien de la page suivante et celui de la dernière page si la page courante n'est pas égale au nombre de pages
*
  • @return string
  • /
public function getLastLinks() { $display = ''; if ($this->current_page != $this->nb_pages) { $display .= ' <a href="' . $this->next_page . '" >></a> '; if ($this->current_page <= $this->nb_pages - 2) { $display .= ' <a href="' . $this->last_page . '">>></a> '; } return $display; } } /**
  • Retourne la liste des liens avec le séparateur si il n'est pas vide : 0 | 1 | 2 | 3 | 4
*
  • @return string
  • /
public function getLinks() { $display = ''; for ($i = 1; $i <= $this->nb_pages; $i++) { if ($i - 1 < ($this->current_page + $this->nb_link_per_page) && $i + 1 > ($this->current_page - $this->nb_link_per_page)) { if ($i == $this->current_page) { $display .= '<span>' . $i . '</span>'; } else { if ($this->url_rewriting) { $url = sprintf($this->link, $i); } else { $url = $this->link . $i; } $display .= '<a href="' . $url . '">' . $i . '</a>'; } if ($i != $this->current_page + $this->nb_link_per_page && $i != $this->nb_pages) { for ($j = 0; $j <= $this->space_before; $j++) { $display .= ' '; } $display .= $this->separator; for ($j = 0; $j <= $this->space_after; $j++) { $display .= ' '; } } } } return $display; } public function __get($name) { if (property_exists($this, $name)) { return $this->$name; } } public function __set($name, $value) { if (property_exists($this, $name)) { $this->$name = $value; } } } ?> <p>Petit exemple :</p> <?php /* Avec un array $datas = array(); for ($i = 1; $i <= 10000; $i++) { $datas[] = 'niah_' . $i; }
  • /
// Avec une base de donnée $connect = mysql_connect('localhost', 'root', ''); mysql_select_db('test', $connect); $query_count = mysql_query('SELECT COUNT(id) AS nb FROM news'); $count = mysql_result($query_count, 0); // $options = array( 'nb_datas' => $count, // Avec une base de donnée // 'nb_datas' => count($datas), // Avec un array 'data_per_page' => 20, 'nb_link_per_page' => 10, 'url' => $_SERVER['PHP_SELF'], // Sans url rewriting // 'url' => 'index-%d.html', // Avec url rewriting // 'url_rewriting' => true, // Avec url rewriting 'var_page' => 'p' ); $pagination = new Pagination($options); $pagination->separator = '-'; /* Avec un array $datas = array_slice($datas, $pagination->start_offset, $pagination->data_per_page); foreach ($datas as $data) { echo $data . '<br />'; }
  • /
// Avec une base de donnée $query = mysql_query('SELECT id, title, content FROM news LIMIT ' . $pagination->start_offset . ', ' . $pagination->data_per_page); while ($row = mysql_fetch_assoc($query)) { echo $row['id'] . '<br />'; } // echo '<br />Pages (' . $pagination->nb_pages . ' pages pour ' . $pagination->nb_datas . ' résultats) : ' . $pagination->getFirstLinks() . $pagination->getLinks() . $pagination->getLastLinks(); ?>

A voir également

Ajouter un commentaire Commentaires
Messages postés
1
Date d'inscription
vendredi 21 juillet 2006
Statut
Membre
Dernière intervention
31 décembre 2011

bonjour,

Je viens de tomber sur cette classe, et je me demandai comment l'utiliser
Est'il possible d'avoir un exemple d'utilisation de cette classe avec l'url rewriting ?
Je suppose qu'il faut utiliser le .htaccess ?

Merci beaucoup
Messages postés
70
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
20 août 2008

@hindioumax :
Si tu est en php4 c'est foutu pour toi ^^, enfin pas sans modif en tous cas.

@NainPuissant

J'ai voulu essayer le space_besore et space_after mais ça ne marche pas, car il faut mettre
for ($j = 0; $j <= $this->space_before; $j++)
{
$display .= ' ';
}

$display .= $this->separator;
for ($j = 0; $j <= $this->space_after; $j++)
{
$display .= ' ';
}

car pas défaut il ne prend qu'un espace si on ne lui indique pas le non breakable space, (enfin le navigateur).

voila.

mis à part ça j'ai du aussi modifier de façon à pourvoir utiliser mes variable déjà en $_GET car,
soit :

Ça na pas été gérer

Soit :

J'ai pas vu et/ou compris comment faire.

:)
Messages postés
3
Date d'inscription
dimanche 20 mai 2007
Statut
Membre
Dernière intervention
23 novembre 2007

Bon j'ai un petit problème en serveur distant (OVH), la classe ne semble pas fonctionner.
Pourtant en local tout fonctionne à merveille.

Erreur PHP:
"Can't access to private property::$separator..."

Apparement la classe n'arrive pas récuperer les variables d'option.

Une aide ? Je me demande si c'est pas une histoire de version de php ...

:(
Messages postés
3
Date d'inscription
dimanche 20 mai 2007
Statut
Membre
Dernière intervention
23 novembre 2007

Excellente source, c'est exactement ce que je recherchais. En url rewriting = false, j'ai du toutefois apporter quelques modif sur la classe. En url rewriting = false, j'avais les même problème d'url (avec seulement le &p= après mon host)

J'ai ajouté aussi un paramètre d'option pour définir une classe css.
Maintenant ca fonctionne impeccable.

Merci encore :)


Pour ceux que ca interresse voici les modifs que j'ai fait (sans url rewriting activé):

dans la classe 'pagination', en haut dans les déclarations :
 * @var définition de la classe css des liens
 * @access private
 */	private $classe_css = '';
/**	
 * @var options disponibles
 * @access private
 */	private $options = array(
'nb_datas',
'data_per_page',
'nb_link_per_page',
'url',
'url_rewriting',
'var_page',
'space_before',
'space_after',
'separator',
'classe_css'
);


Les fonctions modifiées qui prenne en compte la variable 'classe_css' + correction URL pour la navigation des pages:
/**
 * Génère les liens
 */	private function generateLink()
{
if ($this->url_rewriting)
{
$this->link = $this->url;
$this->next_page = sprintf($this->url, $this->current_page + 1);
$this->previous_page = sprintf($this->url, $this->current_page - 1);
$this->first_page = sprintf($this->url, 1);
$this->last_page = sprintf($this->url, $this->nb_pages);
}
else
{
$this->link = strstr($this->url, '?') ? '&' : '?';
$this->link .= $this->var_page . '=';
      $this->next_page     = $this->url . $this->link . ($this->current_page + 1);
      $this->previous_page = $this->url . $this->link . ($this->current_page - 1);
$this->first_page    = $this->url . $this->link . 1;
      $this->last_page     = $this->url . $this->link . $this->nb_pages;
}
}
/**
 * Retourne le lien de la première page si la page courante est supérieur à 3 et celui de la page précédente
 *
 * @return string
 */	public function getFirstLinks()
{
$display = '';
if ($this->current_page != 1)
{
if ($this->current_page >= 3)
{
$display .= ' [' . $this->first_page . ' <<] ';
}
$display .= ' [' . $this->previous_page . ' <] ';
return $display;
}
}
/**
 * Retourne le lien de la page suivante et celui de la dernière page si la page courante n'est pas égale au nombre de pages
 *
 * @return string
 */	public function getLastLinks()
{
$display = '';
if ($this->current_page != $this->nb_pages)
{
$display .= ' [' . $this->next_page . ' >] ';
if ($this->current_page <= $this->nb_pages - 2)
{
$display .= ' [' . $this->last_page . ' >>] ';
}
return $display;
}
}
/**
 * Retourne la liste des liens avec le séparateur si il n'est pas vide : 0 | 1 | 2 | 3 | 4
 *
 * @return string
 */	public function getLinks()
{
$display = '';
for ($i = 1; $i <= $this->nb_pages; $i++)
{
if ($i - 1 < ($this->current_page + $this->nb_link_per_page) && $i + 1 > ($this->current_page - $this->nb_link_per_page))
{
if ($i == $this->current_page)
{
$display .= '' . $i . '';
}
else
{
if ($this->url_rewriting)
{
$url = sprintf($this->link, $i);
}
else
{
$url = $this->url . $this->link . $i;
}
$display .= '['. $url . ' ' . $i . ']';
}
if ($i != $this->current_page + $this->nb_link_per_page && $i != $this->nb_pages)
{
for ($j = 0; $j <= $this->space_before; $j++)
{
$display .= ' ';
}
$display .= $this->separator;
for ($j = 0; $j <= $this->space_after; $j++)
{
$display .= ' ';
}
}
}
}
return $display;
}


Construction de l'objet :
$options = array(
'nb_datas' => $count, // Avec une base de donnée
// 'nb_datas' => count($datas), // Avec un array
'data_per_page' => 1,
'nb_link_per_page' => 10,
'url' => 'index.php?p='.$id_page, // Sans url rewriting
// 'url' => 'index-%d.html', // Avec url rewriting
// 'url_rewriting' => true, // Avec url rewriting
'var_page' => 'display',
'classe_css' => 'pagination'
);

$pagination = new Pagination($options);
$pagination->separator = '-';

// etc ...


:)
Messages postés
138
Date d'inscription
vendredi 1 août 2003
Statut
Membre
Dernière intervention
16 juillet 2009

Bonne remarque de seulunami, la source comme elle est proposée là ne fonctionne pas en mode url rewriting = false.

La modification qu'il propose fonctionne.

Merci pour ton travail NainPuissant, c'est du bon boulot.

A+
Afficher les 32 commentaires

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.