постраничная разбивка контента
решил написать про возможные варианты разбивки контента на страницы, но стоило только отвернуться как скачок напряжения, и пары абзацев
как не бывало. Но не будем о грустном.
Я встречал пока только два основных направления «пейджификации», это постраничная разбивка, для которой требуется в обязательном порядке знать общее число
страниц. И разбивка вида «ВПЕРЕД», «НАЗАД», для ее реализации достаточно немного изменить сам запрос дерганья контента из БД.
В случае постраничного отображения, мы получаем более наглядный и удобный способ визуализации, который легко можно представить как второй способ.
Но за все приходится платить, в данном случае дополнительным запросом к БД.
Второй вариант реализован путем получения ответа от Бд, составляющей страницу на 1 элемент больше чем собирались выводить, если этот элемент
присутствует то значит мы можем дать ссылку на последующую страницу. Иногда, где не требуется вся мощь и красота постраничного вывода, этот способ тоже применим.
пример реализации:
вариант «< НАЗАД | ВПЕРЕД >»
$start=isset($_GET['page']) ? $_GET['page'] : 0; // с какого элемента начинаем забирать данные $pages=15; // количество выводимых полей из бд $result=mysql_query("SELECT * FROM `table` ORDER BY `id` LIMIT $start,($pages+1)"); // код вывода ссылки если возможна навигация назад $prev=($start-$pages>=0) ? '<a href="page.php?page='.($start-$pages).'"> BACK </a>' : 'BACK'; // если возможна навигация вперед $next=count($result)>$pages ? '<a href="page.php?page='.($start+$pages).'"> NEXT </a>' : 'NEXT'; print $prev.' | '.$next;
Но что будет если мы передадим скрипту в запросе значение к примеру равное 2, по нашему алгоритму в $prev не будет ссылки, тогда как на самом деле
предыдущая страница есть. Так что в фильтре входящего значения необходимо несколько доработать код. Который будет валидировать данные и
все что не подходим нам по условиям отправлять в исключение.
if (((int)$start % (int)$pages)!=0){print '404, Sorry, page not found';exit;}
вариант «1 2 3 4 [5] 6 7 8»
$max=mysql_query("SELECT COUNT(*) FROM `table`"); // количество записей в таблице $pages=15; // по сколько выводить записей на страницу $page=$_GET['page']; // текущая страница for ($i=1;$i<=ceil($max/$pages);$i++){ print ($i==$page) ? ' <span style="color : #262626; font-size : 0.82em; font-weight : bold;">[ '.$i.' ]</span> ': ' <a style="color : #C2C2C2; font-size : 0.72em;" href="#page.php?page='.$i.'">'.$i.'</a> '; }
результат:
1 2 3 4 5 6 7 8 9 10 11 12 13 [ 14 ] 15 16 17 18 19 20 21 22 23 24 25
$max=mysql_query("SELECT COUNT(*) FROM `table`"); // количество записей в таблице $pages=15; // по сколько выводить записей на страницу $page=$_GET['page']; // текущая страница $len=5; // количество отображаемых ссылок слева и справа от текущей страницы //left $left=$len>=$page-1? $page-1:$len; for ($i=0;$i<=$left-1;$i++){ print ' <a style="color : #C2C2C2; font-size : 0.72em;" href="#page.php?page='.($page+$i-$left).'">'.($page+$i-$left).'</a> '; } print '<span style="color : #262626; font-size : 0.82em; font-weight : bold;"> [ '.$page.' ] </span>'; //right $right=ceil($max/$pages)<=$page+$len?ceil($max/$pages)-$page:$len; for ($i=1;$i<=$right;$i++){ print ' <a style="color : #C2C2C2; font-size : 0.72em;" href="#page.php?page='.($page+$i).'">'.($page+$i).'</a> '; }
результат:
9 10 11 12 13 [ 14 ] 15 16 17 18 19
В качестве max, page, pages, len можно поставить любые цифры и посмотреть на итоговый результат.