Algorithme de pagination intelligent [fermé]
Je cherche un exemple d'algorithme de pagination intelligente. Par smart, ce que je veux dire, c'est que je veux seulement montrer, par exemple, 2 pages adjacentes à la page actuelle, donc au lieu de me retrouver avec une liste de pages ridiculement longue, je la tronque.
Voici un exemple rapide pour le rendre plus clair... c'est ce que j'ai maintenant:
Pages: 1 2 3 4 [5] 6 7 8 9 10 11
C'est ce que je veux finir avec:
Pages: ... 3 4 [5] 6 7 ...
(dans cet exemple, Je ne montre que 2 pages adjacentes à la page en cours)
Je suis en train de mettre en œuvre en PHP / Mysql, et la pagination "Basique "(pas de trucage) est déjà codée, je cherche juste un exemple pour l'optimiser... Cela peut être un exemple dans n'importe quelle langue, tant qu'il me donne une idée de la façon de l'implémenter...
8 réponses
J'ai eu le même besoin il y a un moment.
Voici l'article que j'ai utilisé pour le faire (avec du code PHP): Pagination De Style Digg
Cela fonctionne assez vite et a quelques ajouts à ce que vous essayez de faire, comme:
[1] 2 3 4 5 6 ... 100 1 [2] 3 4 5 6 ... 100 ... 1 ... 4 5 [6] 7 8 ... 100
Un peu en retard =), mais voici mon départ:
function Pagination($data, $limit = null, $current = null, $adjacents = null)
{
$result = array();
if (isset($data, $limit) === true)
{
$result = range(1, ceil($data / $limit));
if (isset($current, $adjacents) === true)
{
if (($adjacents = floor($adjacents / 2) * 2 + 1) >= 1)
{
$result = array_slice($result, max(0, min(count($result) - $adjacents, intval($current) - ceil($adjacents / 2))), $adjacents);
}
}
}
return $result;
}
Exemple:
$total = 1024;
$per_page = 10;
$current_page = 2;
$adjacent_links = 4;
print_r(Pagination($total, $per_page, $current_page, $adjacent_links));
De Sortie (@ Codepad):
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
Un Autre exemple:
$total = 1024;
$per_page = 10;
$current_page = 42;
$adjacent_links = 4;
print_r(Pagination($total, $per_page, $current_page, $adjacent_links));
De Sortie (@ Codepad):
Array
(
[0] => 40
[1] => 41
[2] => 42
[3] => 43
[4] => 44
)
J'ai commencé à partir du post de lazaro et j'ai essayé de faire un algorithme robuste et léger avec javascript / jquery... Aucune bibliothèque de pagination supplémentaire et/ou volumineuse n'est nécessaire... Regardez sur fiddle pour un exemple en direct: http://jsfiddle.net/97JtZ/1/
var totalPages = 50, buttons = 5;
var currentPage = lowerLimit = upperLimit = Math.min(9, totalPages);
//Search boundaries
for (var b = 1; b < buttons && b < totalPages;) {
if (lowerLimit > 1 ) { lowerLimit--; b++; }
if (b < buttons && upperLimit < totalPages) { upperLimit++; b++; }
}
//Do output to a html element
for (var i = lowerLimit; i <= upperLimit; i++) {
if (i == currentPage) $('#pager').append('<li>' + i + '</li> ');
else $('#pager').append('<a href="#"><li><em>' + i + '</em></li></a> ');
}
J'ai fait une classe de pagination et j'ai mis du code Google il y a un moment. Vérifier son assez simple http://code.google.com/p/spaceshipcollaborative/wiki/PHPagination
$paging = new Pagination();
$paging->set('urlscheme','class.pagination.php?page=%page%');
$paging->set('perpage',10);
$paging->set('page',15);
$paging->set('total',3000);
$paging->set('nexttext','Next Page');
$paging->set('prevtext','Previous Page');
$paging->set('focusedclass','selected');
$paging->set('delimiter','');
$paging->set('numlinks',9);
$paging->display();
List<int> pages = new List<int>();
int pn = 2; //example of actual pagenumber
int total = 8;
for(int i = pn - 9; i <= pn + 9; i++)
{
if(i < 1) continue;
if(i > total) break;
pages.Add(i);
}
return pages;
J'utiliserais quelque chose de simple sur la page que vous montrez au paginateur, comme:
if (
$page_number == 1 || $page_number == $last_page ||
$page_number == $actual_page ||
$page_number == $actual_page+1 || $page_number == $actual_page+2 ||
$page_number == $actual_page-1 || $page_number == $actual_page-2
) echo $page_number;
Vous pouvez l'adapter pour afficher chaque 10 pages avec l'opérateur %
...
je pense que l'utilisation du cas switch() serait meilleure dans ce cas, je ne me souviens tout simplement pas de la syntaxe maintenant
Gardez les choses simples:)
S'il est possible de générer la pagination sur le client, je vous suggère mon nouveau plugin de Pagination: http://www.xarg.org/2011/09/jquery-pagination-revised/
La solution à votre question serait:
$("#pagination").paging(1000, { // Your number of elements
format: '. - nncnn - ', // Format to get Pages: ... 3 4 [5] 6 7 ...
onSelect: function (page) {
// add code which gets executed when user selects a page
},
onFormat: function (type) {
switch (type) {
case 'block': // n and c
return '<a>' + this.value + '</a>';
case 'fill': // -
return '...';
case 'leap': // .
return 'Pages:';
}
}
});
Le code de la CodeIgniter pagination-classe peut être trouvé sur GitHub
(ce que vous appelez) la pagination intelligente peut être obtenue par configuration.
$config['num_links'] = 2;
Le nombre de liens "chiffres" que vous souhaitez avant et après le sélectionné numéro de page. Par exemple, le nombre 2 placera deux chiffres de chaque côté, comme dans les liens d'exemple en haut de cette page.