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...

29
demandé sur jeannicolas 2008-10-02 22:22:34

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
28
répondu changelog 2008-10-02 18:26:36

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
)
15
répondu Alix Axel 2011-09-27 00:24:13

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> ');
}
7
répondu Edwin 2011-12-22 19:50:04

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();
2
répondu Jacob 2008-10-02 21:01:50
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;
2
répondu lazaro 2014-04-24 17:53:22

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:)

0
répondu Fernando Barrocal 2008-10-02 18:29:06

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:';
                }
        }
});
0
répondu Robert Eisele 2011-10-19 15:56:40

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.

0
répondu Natrium 2011-10-20 08:38:49