Пейджинг своими руками.
Зачем программистам это нужно? Объясняю… Как не крути, а основой любого нормального сайта (не гавносайта) является контент. В большинстве случаев это обычный текст (ну и картинки). Человек, приходя на сайт, рассчитывает найти на нем необходимую ему информацию. И если он ее находит, то радуется что больше искать ничего не надо. Но, как показывает практика, в большинстве случаев, напрасно. Еще есть некоторые проблемы, которые могут встать у него на пути. Например, кривое предоставление информации. |
Представим, что мы ищем ответ на какой-нибудь научный вопрос (как размножаются пальмы).
Находим какой-то сайт, с несоответствующим заголовком, но в описании про размножение пальм что-то мелькает. Заходим туда и видим трактат на 150 кб текста, для которого только прокручивание займет минуты 2 и сразу думаем: “о, черт”, “много букф”, “наверное, лучше просто про пальмы искать” и т.д. После такого вида посетитель может даже перенервничать и вообще уйти. Очевидно, что это на популярность сайта влияет негативно (да и поисковик такой длинный текст вряд ли проиндексирует весь).
Тут есть, как минимум два решения.
Либо хозяин сайта заказывает контент-менеджеру разбить текст на главы, пункты и т.д. и для каждого пункта сделать в CMS сайта отдельную страницу.
Либо, разбить текст на страницы автоматически (программным способом). Как это сделано в wordpress – там внизу каждой страницы с постами есть пейджинг с номерами страниц.
Первый способ реализовывать не наша задача, а вот как второй реализовать я напишу.
Рассмотрим на примере гостевой книги (я в первых постах писал упрощенную версию).
Итак, у нас есть 50 сообщений и все на одной странице. Каждое сообщение хранится в БД.
Нам нужно сделать так, чтобы на странице отображалось не более 10 сообщений.
Допустим, что поля таблицы guestbook в БД для всех сообщений будут следующими:
Id, author, title, post, post_date.
Тогда выборка всех страниц будет производится следующим способом.
Но возможности SQL позволяют реализовать эту выборку не полностью, а фрагментарно.
Например нам нужно выбрать записи с 20ой по 30ую из этого списка:
Здесь мы указываем начиная с какой позиции нужно выбирать (20) и сколько записей надо выбирать (10).
Тогда пейджинг реализовывается очень просто:
index.php:
define ("POSTS_PER_PAGE", 10);
include "connect.php";
$page = $_REQUEST["page"]?intval($_REQUEST["page"]):0;
$sql = "select * from guestbook order by post_date limit ".($page*POSTS_PER_PAGE).",".POSTS_PER_PAGE;
$res = mysql_query($sql);
while ($post = mysql_fetch_assoc($res))
$posts[] = $post;
$sql = "select COUNT(*) from guestbook order by post_date";
$res = mysql_query($sql);
$res = mysql_fetch_assoc($res);
$pages_num = ceil($res["COUNT(*)"]/POSTS_PER_PAGE);
include "guestbook.html";
?>
connect.php:
$host = "localhost";
$user = "root";
$pass = "";
$dbname = "inovice";
mysql_connect($host, $user, $pass);
mysql_select_db($dbname);
?>
guestbook.html
<body>
<!-- Выводим все посты -->
<table width="300">
<? foreach ($posts as $post) { ?>
<tr>
<td colspan="2"><b><?=$post['title']?></b></td>
</tr>
<tr>
<td><?=$post['author']?></td>
<td><?=$post['post_date']?></td>
</tr>
<tr>
<td colspan="2"><?=$post['post']?><br></td>
</tr>
<? } ?>
</table><br />
<? for( $i=0; $i < $pages_num; $i++) { ?>
<a href="index.php?page=<?=$i?>"><?=($i+1)?></a>
<? } ?>
</body>
</html>
В случае же с нашими пальмами дело будет обстоять еще проще. Просто предварительно нам надо будет разбить текст на страницы и каждую страницу сделать элементом массива.
А потом выводить только элементы с 20го по 30ый в цикле.
Проблема пейджинга решается не очень сложно, но результаты внедрения такого механизма на ваш сайт могут существенно сказаться на его прибыльности
Не против, что я на своей новой социалке закинул ваш пост?
Не против конечно. Главное - оставить ссылку на оригинал.
Копните в сторону шаблонизации (; Стоит обратить внимание на Smarty.
Пригодится
Да. Наслышан про эту библиотеку. В ближайшее время хочу попробывать ее.
Кстати, сам только что узнал, лучше обратить внимание на Blitz - мощный шаблонизатор, но в то же время, и производительный (быстрее smarty), что критично для больших проектов
Хм. Интересный проект. Посмотрю его тоже Почему он быстрее остальных, интересно.
Вообще я люблю написать какую-нибудь едкую критику, но тут не придраться!
А если страниц будет штук 100? Что скрипт их все выведет?
Имхо надо делать постраничную навигацию такого плана:
< << 1…3 4 5 6 7 8 9 … 100 > >>
Согласитесь займет место гораздо меньше, чем вывод 100 страниц!
В догонку еще одно исправление:
$sql = “select COUNT(*) from guestbook order by post_date”;
замените на:
$sql = “select COUNT(*) AS cnt from guestbook order by post_date”;
А это:
$pages_num = ceil($res[“COUNT(*)”]/POSTS_PER_PAGE);
замените на:
$pages_num = ceil($res[‘cnt’]/POSTS_PER_PAGE);
Насчет первого понятно.. тут надо подумать как реализовать.
А насчет второго - непонял немного - в чем разница между полученным результатом? Кроме оформления запросов.
Возможно задам глупый вопрос….но это же раздел для начинающих )
не совсем понятна строчка
$page = $_REQUEST[“page”]?intval($_REQUEST[“page”]):0;
а именно, зачем после $_REQUEST[“page”] идёт знак вопроса, затем функция возвращающая целое значение переменной(ведь числа и так предположительно целые) и :0
если кто-нибудь пояснит буду очень благодарна.
2 Snejok: Нет, вопрос не глупый. Тут на самом деле лучше написать так:
$page = intval($_REQUEST[“page”]);
Надо как-нибудь будет исправить в тексте статьи. intval нужно применять, чтобы кто-то случайно не подсунул в переменную page строку или еще что-то. Т.е. мы принудительно приводим эту переменную в целочисленный тип.