Собственно, помогите идеей как лучше формировать навигацию. Пишу функцию, формирующую массив из пунктов постраничной навигации. Чего-то запутался. На выходе хочу получить такую штуковину: 1 2 3 4 5 6 7 -> Или же, если активная страница не первая, а, к примеру, седьмая: <- 4 5 6 7 8 9 10 -> В функцию передаю текущую страницу ( $cur_page ) и количество материалов, т.е. количество страниц всего ( $pages ). Допустим, формирую массив ссылок на каждую страницу, проходясь (for .. i < $pages). После этого из сформированного массива формирую финальный массив, параллельно в определенных условиях проставляя ссылки на первую и последнюю страницы ( <- -> ). Вот тут у меня загвоздка. Как это посимпатичнее реализовать?
Не знаю, на сколько это симпатично , но это работает: PHP: <?php function paginator($page = 1, $pages = 1, $inline = 7) { $around = (int) ($inline / 2); if($page <= ($around + 1) or $pages < $inline) { $start = 1; $stop = $inline; } elseif($page <= ($pages - ($around + 1))) { $start = $page - $around; $stop = $page + $around; } else { $start = $pages - $inline; $stop = $pages; } $r = range($start, $stop); return($r); } $page = isset($_GET['page']) ? (int) $_GET['page'] : 1; $pages = 30; if($page < 1) $page = 1; if($page > $pages) $page = $pages; $inline = 7; $pagesOut = paginator($page, $pages, $inline); $out = ''; if($page > 1) $out .= "<a href=\"{$_SERVER['PHP_SELF']}?page=" . ($page - 1) . '"><</a> '; foreach($pagesOut as $p) $out .= "<a href=\"{$_SERVER['PHP_SELF']}?page={$p}\">" . (($page === $p) ? "<b>{$p}</b>" : $p) . '</a> '; if($page < $pages) $out .= "<a href=\"{$_SERVER['PHP_SELF']}?page=" . ($page + 1) . '">></a> '; echo($out); ?>
sobachnik, спасибо. Много переменных, голова немного кругом идет ) upd: Прежде разбора, запустил на локальной машине. Нормально не работает =) Попробовал количество страниц сделать равным 4.
Ага, что это со мной?... PHP: <?php function paginator($page = 1, $pages = 1, $inline = 7) { if($pages > $inline) { $around = (int) ($inline / 2); if($page <= ($around + 1)) { $start = 1; $stop = $inline; } elseif($page <= ($pages - ($around + 1))) { $start = $page - $around; $stop = $page + $around; } else { $start = $pages - $inline; $stop = $pages; } } else { $start = 1; $stop = $pages; } $r = range($start, $stop); return($r); } $page = isset($_GET['page']) ? (int) $_GET['page'] : 1; $pages = 30; if($page < 1) $page = 1; if($page > $pages) $page = $pages; $inline = 7; $pagesOut = paginator($page, $pages, $inline); $out = ''; if($pages > 1) { if($page > 1) $out .= "<a href=\"{$_SERVER['PHP_SELF']}?page=" . ($page - 1) . '"><</a> '; foreach($pagesOut as $p) $out .= "<a href=\"{$_SERVER['PHP_SELF']}?page={$p}\">" . (($page === $p) ? "<b>{$p}</b>" : $p) . '</a> '; if($page < $pages) $out .= "<a href=\"{$_SERVER['PHP_SELF']}?page=" . ($page + 1) . '">></a> '; } echo($out); ?>
PHP: <? define(pages_bar, 'Страница %s из %s'); function page_bar($current_page, $records_count, $records_per_page){ $link='/'; if($records_count>$records_per_page){ $pages_count=ceil($records_count/$records_per_page); if($current_page>$pages_count){ $current_page=$pages_count; } if($current_page<1){ $current_page=1; } $previous_page=$current_page-1; $next_page=$current_page+1; echo '<li style="width: 115px;">'; printf(pages_bar, $current_page, $pages_count); echo'</b></li>'; if($previous_page){ echo '<a href="'.$link.$previous_page.'" title="'.page_previous.'">«</a>'; } for($i=1; $i<=$pages_count; $i++){ if($i==1 || $i==$pages_count || ($i>$current_page-4 && $i<$current_page+4)){ if($i+5>$current_page && $current_page>5 && empty($p1)){echo ' … '; $p1=1;} else if($i-4>$current_page && $current_page<$pages_count-4 && empty($p2)){echo ' … '; $p2=1;} if($i==$current_page){ $class=' class="active"'; }else{ $class=''; } echo '<a href="'.$link.$i.'" title="'.$i.'"'.$class.'>'.$i.'</a>'; } } if($next_page!=$i){ echo '<a href="'.$link.$next_page.'" title="'.page_next.'">»</a>'; } } } ?>
Начав разбираться над вариантом sobachnik'а, дописал свой вариант. Не стал передавать в функцию переменную количества ссылок пагинатора ( в моем случае 7) и заменил ссылку шага на ссылку "в начало" и "в конец" (она появляется если не видна ссылка на первую и последнюю страницы, соответственно). В функцию передаю текущую страницу и массив сформированных ссылок (я его формирую ещё при получении из базы) PHP: <?php function paginate($current, $links) { $total = count($links); $pag_nav = array(); if( $total <= 7 ) { foreach ( $links as $link ) { array_push($pag_nav, $link); } } else { echo $current; if ( ($current - 3) > 1 ) { $pag_nav[0] = "to start"; } else { for ($i = 1; $i < 8; $i++) { $pag_nav[ $i ] = array_shift($links); } } if ( ($current + 3) < $total) { $pag_nav[8] = "to end"; } else { for ($i = 7; $i > 0; $i--) { $pag_nav[ $i ] = array_pop($links); } } if ( $pag_nav[0] && $pag_nav[8] ) { $a = 1; for ($i = -4; $i < 3; $i++) { $pag_nav[ $a ] = $links[ $current + $i ]; $a++; } } } echo "<pre>"; print_r($pag_nav); echo "</pre>"; } $links = array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10"); paginate(13, $links);