Постраничный вывод контента в браузер
Автор: Духанин Роман
Половина второго
ночи, несколько дней недосыпа... И вдруг озарение - наконец-то
я понял, какой-такой супер-пупер скрипт мне нужен для
раскрутки моего нового сайта. Сказано - сделано, сажусь... нет
не писать этот супер-пупер скрипт :) Программисты народ
ленивый, спецы по раскрутке тем более (отсюда и
баннерообменные сети, авторегистраторы в каталогах и пр.
лентяйские штучки). В общем лезу на Google и начинаю методично
обшаривать Рунет в поисках требуемого. Проходит час, два... В
душу закрадываются смутные подозрения, плавно перерастающие в
уверенность, что требуемый мне скрипт в природе либо не
существует, либо спрятан на чьем-то заповедном локалхосте с
правами доступа 000.
Разбиваю стоящую перед скриптом задачу на несколько
составных и минут за 15 пишу реализацию большинства его
(скрипта) функций :) Радостно берусь за следующую фичу... В
общем, необходимо всего-то навсего обеспечить постраничный
вывод контента. То есть, например, имеется 60 статей и нужно
эти статьи выводить по 10 на страницу и построить меню для
оного вывода в виде "1 2 3 ..."
Четыре утра, окромя заветного "LIMIT" в голову ничего не
приходит. И дело даже не в том, что БД к моему скрипту
никакого отношения не имеет. С горечью понимаю, что
квалификация потеряна, лучшие годы жизни прожиты впустую и...
иду на Google ;)
После... в общем уже наступил рассвет. К
этому времени я познакомился с кучей литературы по данному
вопросу, но везде ситуация так или иначе рассматривалась в
контексте работы с SQL, либо я постоянно наталкивался на
какую-то растиражированно-заумную статью про "отделение
алгоритма постраничного вывода от контекста
или-что-то-в-этом-роде" (ИМХО, нижеприведенные 7 строчек кода
эту проблему решают) в которой ничегошеньки не понял... :( И
вот когда я уже отчаялся и решил что утро вечера мудренее, на
каком-то дремучем, заросшим мхом форуме (адрес к сожалению
канул в Лету - по крайней мере у меня его нет), наткнулся на
переписку некоего вечно извиняюшегося Программера и безумного
и злобного Модератора - тема переписки была посвящена именно
построению меню для постраничного вывода. И это было именно то
что нужно!
В общем, ниже по тексту я исправляю несправедливость:
теперь в Интернете есть статья о том, как обеспечить
построение меню для постраничного вывода! Простой рабочий код
на PHP, с подробными комментариями. Никакой излишней
функциональности типа ссылок "next page". Сделано сие
намеренно - ни разу в жизни не нажимал на "next" если можно
было нажать на номер страницы - а данная статья написана с
целью дать возможность понять основной принцип, т.е. чем
меньше кода, тем лучше (хотя кнопка "next" и добавляется тремя
строками кода).
Соглашения о комментариях к коду:
- "Статья" - это некий целостный блок данных (не
обязательно текстовых) который и выводится по несколько штук
на страницу (это могут быть статьи, новости, картинки и пр.)
- "Страница" - это страница :) на которой расположено
некоторое количество "статей".
<?php
$total_articles_number = 79; //общее количество статей
$articles_per_page=10; // количество статей на странице
//получаем количество страниц
$total_pages = ceil($total_articles_number/$articles_per_page);
// запускаем цикл - количество итераций равно количеству страниц
for ($i=0; $i<$total_pages; $i++)
{
// получаем значение $from (как $page_number) для использования в формировании ссылки
$page_number=$i*$articles_per_page;
// если $page_number (фактически это проверка того является ли $from текущим) не соответствует
// текущей странице,
// выводим ссылку на страницу со значением $from равным $page_number
if ($page_number!=$from) echo "<a href='".$PHP_SELF."?from=".$page_number."'> ".($i+1).
" </a>";
// иначе просто выводим номер страницы - данная строка необязательна,
// пропустив ее вы просто получите линк на текущую страницу
else echo $i+1; // если page_number - текущая страница - ничего не выводим (ссылку не делаем)
}
?>
Таким образом, на экране браузера мы получили что-то
вроде "1 2 3 4 5 6 7 8", при этом URL (на
моем компьютере, при выбранной третьей "странице") выглядит
так: http://localhost/ep/ep.php?from=20.
Обратите внимание, на то, что странице под номером "3"
соответствует значение from=20 то есть отсчет
выводимых статей будет вестись в данном случае с 20-й.
Вообще, как вы уже поняли, переменная $from играет здесь
ключевую роль. Она участвует в построении ссылок на каждую
отдельную страницу (если, конечно, можно так выразиться :), и
самое главное - дает нам точку отсчета для вывода статей.
Например (и наверняка вы сделаете именно так) указатели на
статьи (или сами статьи ;) можно поместить в массив, с
последующей выборкой и выводом в браузер по 10 статей, начиная
от значения $from.
То есть еще раз иными словами: весь огород собственно и
городился ради того, чтобы дать скрипту данные относительно
того на какой "странице" сейчас находится посетитель и начиная
с какого номера "статьи" следует вывести заданное количество
этих статей на страницу - а это и есть значение переменной
$from. Т.е. при $from=20 выведутся страницы с 21 по 30 (это
также зависит от реализации вывода и значения переменной
$articles_per_page)
Вот и все - предисловие длиннее чем код :) А в Жизни всегда
так - прелюдия гораздо длиннее чем финал ;)