За последние 24 часа нас посетили 59042 программиста и 1840 роботов. Сейчас ищут 919 программистов ...

Принцип построения меню пагинатора

Тема в разделе "PHP для новичков", создана пользователем virus-07, 9 окт 2011.

  1. virus-07

    virus-07 Активный пользователь

    С нами с:
    9 май 2011
    Сообщения:
    37
    Симпатии:
    0
    Собственно, помогите идеей как лучше формировать навигацию.
    Пишу функцию, формирующую массив из пунктов постраничной навигации. Чего-то запутался.
    На выходе хочу получить такую штуковину:
    1 2 3 4 5 6 7 ->
    Или же, если активная страница не первая, а, к примеру, седьмая:
    <- 4 5 6 7 8 9 10 ->

    В функцию передаю текущую страницу ( $cur_page ) и количество материалов, т.е. количество страниц всего ( $pages ).
    Допустим, формирую массив ссылок на каждую страницу, проходясь (for .. i < $pages).

    После этого из сформированного массива формирую финальный массив, параллельно в определенных условиях проставляя ссылки на первую и последнюю страницы ( <- -> ).
    Вот тут у меня загвоздка. Как это посимпатичнее реализовать?
     
  2. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Не знаю, на сколько это симпатично :) , но это работает:
    PHP:
    1. <?php
    2. function paginator($page = 1, $pages = 1, $inline = 7) {
    3.     $around = (int) ($inline / 2);
    4.     if($page <= ($around + 1) or $pages < $inline) {
    5.         $start = 1;
    6.         $stop = $inline;
    7.     } elseif($page <= ($pages - ($around + 1))) {
    8.         $start = $page - $around;
    9.         $stop = $page + $around;
    10.     } else {
    11.         $start = $pages - $inline;
    12.         $stop = $pages;
    13.     }
    14.     $r = range($start, $stop);
    15.     return($r);
    16. }
    17. $page = isset($_GET['page']) ? (int) $_GET['page'] : 1;
    18. $pages = 30;
    19. if($page < 1)
    20.     $page = 1;
    21. if($page > $pages)
    22.     $page = $pages;
    23. $inline = 7;
    24. $pagesOut = paginator($page, $pages, $inline);
    25. $out = '';
    26. if($page > 1)
    27.     $out .= "<a href=\"{$_SERVER['PHP_SELF']}?page=" . ($page - 1) . '">&lt;</a> ';
    28. foreach($pagesOut as $p)
    29.     $out .= "<a href=\"{$_SERVER['PHP_SELF']}?page={$p}\">" . (($page === $p) ? "<b>{$p}</b>" : $p) . '</a> ';
    30. if($page < $pages)
    31.     $out .= "<a href=\"{$_SERVER['PHP_SELF']}?page=" . ($page + 1) . '">&gt;</a> ';
    32. echo($out);
    33. ?>
     
  3. virus-07

    virus-07 Активный пользователь

    С нами с:
    9 май 2011
    Сообщения:
    37
    Симпатии:
    0
    sobachnik, спасибо.
    Много переменных, голова немного кругом идет )
    upd: Прежде разбора, запустил на локальной машине. Нормально не работает =) Попробовал количество страниц сделать равным 4.
     
  4. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Ага, что это со мной?...
    PHP:
    1. <?php
    2. function paginator($page = 1, $pages = 1, $inline = 7) {
    3.     if($pages > $inline) {
    4.         $around = (int) ($inline / 2);
    5.         if($page <= ($around + 1)) {
    6.             $start = 1;
    7.             $stop = $inline;
    8.         } elseif($page <= ($pages - ($around + 1))) {
    9.             $start = $page - $around;
    10.             $stop = $page + $around;
    11.         } else {
    12.             $start = $pages - $inline;
    13.             $stop = $pages;
    14.         }
    15.     } else {
    16.         $start = 1;
    17.         $stop = $pages;
    18.     }
    19.     $r = range($start, $stop);
    20.     return($r);
    21. }
    22. $page = isset($_GET['page']) ? (int) $_GET['page'] : 1;
    23. $pages = 30;
    24. if($page < 1)
    25.     $page = 1;
    26. if($page > $pages)
    27.     $page = $pages;
    28. $inline = 7;
    29. $pagesOut = paginator($page, $pages, $inline);
    30. $out = '';
    31. if($pages > 1) {
    32.     if($page > 1)
    33.         $out .= "<a href=\"{$_SERVER['PHP_SELF']}?page=" . ($page - 1) . '">&lt;</a> ';
    34.     foreach($pagesOut as $p)
    35.         $out .= "<a href=\"{$_SERVER['PHP_SELF']}?page={$p}\">" . (($page === $p) ? "<b>{$p}</b>" : $p) . '</a> ';
    36.     if($page < $pages)
    37.         $out .= "<a href=\"{$_SERVER['PHP_SELF']}?page=" . ($page + 1) . '">&gt;</a> ';
    38. }
    39. echo($out);
    40. ?>
     
  5. virus-07

    virus-07 Активный пользователь

    С нами с:
    9 май 2011
    Сообщения:
    37
    Симпатии:
    0
    На первый взгляд все отлично. Попробую разобраться. Спасибо вам и хорошей недели )
     
  6. rainarr

    rainarr Активный пользователь

    С нами с:
    20 ноя 2010
    Сообщения:
    276
    Симпатии:
    0
    PHP:
    1.  
    2. <?
    3. define(pages_bar, 'Страница %s из %s');
    4. function page_bar($current_page, $records_count, $records_per_page){
    5.     $link='/';
    6.     if($records_count>$records_per_page){
    7.     $pages_count=ceil($records_count/$records_per_page);
    8.         if($current_page>$pages_count){ $current_page=$pages_count; }
    9.         if($current_page<1){ $current_page=1; }  
    10.         $previous_page=$current_page-1; $next_page=$current_page+1;
    11.         echo '<li style="width: 115px;">'; printf(pages_bar, $current_page, $pages_count); echo'</b></li>';
    12.         if($previous_page){ echo '<a href="'.$link.$previous_page.'" title="'.page_previous.'">&laquo;</a>'; }
    13.         for($i=1; $i<=$pages_count; $i++){
    14.             if($i==1 || $i==$pages_count || ($i>$current_page-4 && $i<$current_page+4)){
    15.                 if($i+5>$current_page && $current_page>5 && empty($p1)){echo ' … '; $p1=1;}
    16.                 else if($i-4>$current_page && $current_page<$pages_count-4 && empty($p2)){echo ' … '; $p2=1;}
    17.                 if($i==$current_page){ $class=' class="active"'; }else{ $class=''; }
    18.                 echo '<a href="'.$link.$i.'" title="'.$i.'"'.$class.'>'.$i.'</a>';
    19.             }
    20.         }
    21.         if($next_page!=$i){ echo '<a href="'.$link.$next_page.'" title="'.page_next.'">&raquo;</a>'; }
    22.     }
    23. }
    24. ?>
    25.  
    26.  
     
  7. virus-07

    virus-07 Активный пользователь

    С нами с:
    9 май 2011
    Сообщения:
    37
    Симпатии:
    0
    Начав разбираться над вариантом sobachnik'а, дописал свой вариант.
    Не стал передавать в функцию переменную количества ссылок пагинатора ( в моем случае 7) и заменил ссылку шага на ссылку "в начало" и "в конец" (она появляется если не видна ссылка на первую и последнюю страницы, соответственно).
    В функцию передаю текущую страницу и массив сформированных ссылок (я его формирую ещё при получении из базы)

    PHP:
    1. <?php
    2.     function paginate($current, $links)
    3.     {
    4.         $total = count($links);
    5.         $pag_nav = array();
    6.         if( $total <= 7 )
    7.         {
    8.             foreach ( $links as $link )
    9.             {
    10.                 array_push($pag_nav, $link);
    11.             }
    12.         }
    13.         else
    14.         {
    15.             echo $current;
    16.             if ( ($current - 3) > 1 )
    17.             {
    18.                 $pag_nav[0] = "to start";
    19.             }
    20.             else
    21.             {
    22.                 for ($i = 1; $i < 8; $i++)
    23.                 {
    24.                     $pag_nav[ $i ] = array_shift($links);
    25.                 }
    26.             }
    27.             if ( ($current + 3) < $total)
    28.             {
    29.                 $pag_nav[8] = "to end";
    30.             }
    31.             else
    32.             {
    33.                 for ($i = 7; $i > 0; $i--)
    34.                 {
    35.                     $pag_nav[ $i ] = array_pop($links);
    36.                 }
    37.             }
    38.             if ( $pag_nav[0] && $pag_nav[8] )
    39.             {
    40.                 $a = 1;
    41.                 for ($i = -4; $i < 3; $i++)
    42.                 {
    43.                 $pag_nav[ $a ] = $links[ $current + $i ];
    44.                 $a++;
    45.                 }
    46.             }
    47.            
    48.         }
    49.         echo "<pre>";
    50.         print_r($pag_nav);
    51.         echo "</pre>";
    52.     }
    53.    
    54.     $links = array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10");
    55.     paginate(13, $links);