Class de pagination

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

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.