2008-10-02 2 views
29

Я ищу пример алгоритма умной разбивки на страницы. Разумно, я имею в виду, что я хочу показать, например, две соседние страницы на текущей странице, поэтому вместо того, чтобы заканчивать смехотворно длинный список страниц, я усекаю его.Смарт-алгоритм разбиения на страницы

Вот краткий пример, чтобы сделать его более ясным ... это то, что я сейчас:

Pages: 1 2 3 4 [5] 6 7 8 9 10 11 

Это то, что я хочу, чтобы в конечном итоге с:

Pages: ... 3 4 [5] 6 7 ... 

(В данном примере , Я показываю только две соседние страницы на текущей странице)

Я реализую его в PHP/Mysql, а «базовая» разбивка на страницы (без перехвата) уже закодирована, я просто ищу пример для его оптимизации ... Это c быть примером на любом языке, если он дает мне представление о том, как его реализовать ...

+0

Смотрите мой вопрос о [страничных ссылок] (http://stackoverflow.com/questions/44542/algorithm-pseudo-code-to-create-paging-links) – Geoff 2008-10-02 18:28:49

+0

Вопросы по SO должен показать код вы пробовали, а не просто общий запрос на решения. См. Http://stackoverflow.com/about – Blazemonger 2014-02-24 15:46:01

ответ

28

У меня была такая же потребность некоторое время назад.

Вот статья, которую я использовал, чтобы сделать это (с PHP кода): Digg-Style Pagination

Она работает довольно быстро и имеет некоторые дополнения к тому, что вы пытаетесь сделать, как:

[1] 2 3 4 5 6 ... 100 
1 [2] 3 4 5 6 ... 100 
... 
1 ... 4 5 [6] 7 8 ... 100
+1

Некоторая очистка кода необходима, но отлично работает. +1 – 2014-01-06 20:41:02

0

Я хотел бы использовать что-то простое на странице вы показываете Paginator, как:

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; 

вы можете адаптировать его, чтобы показать каждые 10 или около того страниц соператор ...

Я думаю, что с помощью переключателя случай() будет лучше в этом случае, я просто не помню синтаксис Теперь

Держите это просто :)

2

Я сделал класс разбивки на страницы и недавно добавлен в Google Code.Проверьте это его довольно просто 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
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; 
15

Любопытное поздно =), но вот мой идти на него:

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; 
} 

Пример:

$total = 1024; 
$per_page = 10; 
$current_page = 2; 
$adjacent_links = 4; 

print_r(Pagination($total, $per_page, $current_page, $adjacent_links)); 

Выход (@ Codepad):

Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 3 
    [3] => 4 
    [4] => 5 
) 

Другой пример:

$total = 1024; 
$per_page = 10; 
$current_page = 42; 
$adjacent_links = 4; 

print_r(Pagination($total, $per_page, $current_page, $adjacent_links)); 

Выход (@ Codepad):

Array 
(
    [0] => 40 
    [1] => 41 
    [2] => 42 
    [3] => 43 
    [4] => 44 
) 
0

Если это возможно произвести разбиение на страницы на стороне клиента, я хотел бы предложить свой новый PAGINATION плагин: http://www.xarg.org/2011/09/jquery-pagination-revised/

Решение на ваш вопрос будет:

$("#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

Кодекса CodeIgniter pagination -класса может on GitHub

(что вы называете) Умная разбивка на страницы может быть достигнута с помощью конфигурации.

$config['num_links'] = 2; 

Количество «цифр» ссылок вы хотели бы до и после выбранного номера страницы. Например, номер 2 поместит две цифры с обеих сторон, как в примерах ссылок в самой верхней части этой страницы.

7

Я начал с поста Лазаро и попытался сделать надежный и легкий алгоритм с JavaScript/JQuery ... Нет дополнительных и/или громоздких библиотек постраничной необходимых ... Посмотреть на скрипку в прямом эфире, например: 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> '); 
} 
Смежные вопросы