Sunday, June 22, 2014

PHP - Pagination





Présentation

Cette fonction permet de créer une pagination. Elle ne fait pas qu'afficher bêtement la liste des liens mais il est possible de mettre une limitation du nombre de liens avant et après la page actuelle. 

La fonction

<?php
/* Options de connexion à MySQL */
define('DB_HOST', 'localhost'); // Hôte du serveur MySQL
define('DB_NAME', 'la_base'); // Nom de la base de données
define('DB_USER', 'root'); // Nom d'utilisateur MySQL
define('DB_PASS', ''); // Mot de passe du compte MySQL

/* Options pour la pagination */
define('PAGINA_LIMIT', 5); // Limite de liens avant et après la page actuelle
define('PAGINA_CLASS', 'page'); // Classe des liens "normaux"
define('PAGINA_CURRENT_CLASS', 'active'); // Classe du lien de le page actuelle
define('PAGINA_NEXTLINK_CLASS', 'next'); // Classe du lien "Suivant"
define('PAGINA_PREVIOUSLINK_CLASS', 'previous'); // Classe du lien "Précédent"
define('PAGINA_PERPAGE', 7); // Nombre d'éléments par page
define('PAGINA_LINK', '/teste2.php?page={nb}'); // Structure des liens générés


HP-Compaq 550 610,615 6720s, 6720s/CT, 6730s Series battery
/* Définition de la fonction getLink()
. Paramètre :
. @page Int : Page
.*/
function getLink($nb) {
return str_replace('{nb}', (string) $nb, PAGINA_LINK);
}


HP Compaq 6510 6515b 6710b 6715b 6910p nc6100 battery

/* Définition de la fonction pagination()
. Paramètres :
. @table String : Nom de le table
. @current Int : Page actuelle
.*/
function pagination($table, $current = 1) {
echo '<ul class="pagination">';

/* On compte le nombre d'entrées dans la table et le nombre de page */
try {
$pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS);
} catch(PDOException $e) {
echo 'Erreur lors de la connexion au serveur MySQL.<br/>'.$e->getMessage();
return;
}

$sql = 'SELECT COUNT(*) AS nb FROM '.$table;
$req = $pdo->query($sql);
$data = $req->fetch();
$nb = $data['nb'];

$nbPage = ceil($nb / PAGINA_PERPAGE);


/* Afficher le lien "Précédent" si la page actuelle n'est pas la première */
if($current !== 1) {
echo '<li><a href="'.getLink($current - 1).'" class="'.PAGINA_PREVIOUSLINK_CLASS.'">Précédent</a></li>';
}

/* Afficher les liens avant la page actuelle */
for($i = ($current - PAGINA_LIMIT) ; $i < $current ; $i++) {
if($i > 0) {
echo '<li><a href="'.getLink($i).'" class="'.PAGINA_CLASS.'">'.$i.'</a></li>';
}
}

/* Afficher le lien de la page actuelle */
echo '<li><a href="'.getLink($current).'" class="'.PAGINA_CURRENT_CLASS.'">'.$current.'</a></li>';

/* Afficher les liens suivants */
$nb = 0;
for($i = ($current + 1) ; $i <= $nbPage ; $i++) {
if($nb < PAGINA_LIMIT) {
echo '<li><a href="'.getLink($i).'" class="'.PAGINA_CLASS.'">'.$i.'</a></li>';
$nb++;
}
}

/* Afficher le lien "Suivant" si la page actuelle n'est pas la dernière */
if($current < $nbPage) {
echo '<li><a href="'.getLink($current + 1).'" class="'.PAGINA_NEXTLINK_CLASS.'">Suivant</a></li>';
}

echo '</ul>';
}

if(isset($_GET['page']) && (int) $_GET['page'] !== 0) {
$page = (int) $_GET['page'];
} else {
$page = 1;
}

pagination('la_table', $page);
?>

Style CSS

.pagination {
margin: 0px;
list-style: none;
padding: 0px;
}

.pagination li {
float:left;
}

.pagination li a {
border: solid 1px black;
color: black;
padding-left: 4px;
padding-right: 4px;
margin-left: 3px;
margin-right: 3px;
text-decoration: none;
}

.pagination li a.active {
border-color: red;
}

.pagination li a.next, .pagination li a.previous {

}

.pagination li a.page {

}

No comments:

Post a Comment