Постраничный вывод контента

Thursday, 01 April 2010 | Автор: programmer

Вот и подошли к одному из главных уроков - создание постраничного вывода контента. В простонародии постраничный вывод также может называться пагинация, так что не пугайтесь этого слова, если встретите. Постраничный вывод надо делать в своих проектах, это обязательное условие каждого проекта при более или менее большом объеме информации. Представьте себя простым пользователем, который заходит на сайт интернет-магазина, чтобы купить, например, книгу. Если администратор (программист) не озаботились постраничным выводом каталога книг, то зайдя на страницу магазина, Вы будете ждать минут 10, пока откроется страница с каталогом книг эдак в 1000 наименований. По отношению к пользователю плохой тон заставлять ждать. Для этого необходимо просто поделить одну страницу на 40 по 25 позиций книг на каждой странице.

Для примера возьмем всё тот же интернет-магазин. Пусть у нас есть таблица в MySQL с название books, где есть 4 поля: id (Автоинкрементное поле), name (наименование книги), autor (автор книги), price (цена).

Для нача рассмотрим неправильный вариант, чтобы понимать, что и как делать:

$db = new sql_db ($sqlserver, $sqluser, $sqlpassword, $database);
$db->sql_query("select * from books");
$rowset = $db->sql_fetchrowset();
foreach ($rowset as $row) {
echo "Название книги: {$row['name']}. Автор: {$row['autor']}. Цена: {$row['price']}";
}

При такой реализации вывода списка книг будет выводиться всё сразу, т.е. чем больше книг в таблице books, тем дольше по времени будет выводиться этот список. Такой вариант нам не подходит. Будем делать сразу правильно.

Для этого немного изменим подход. Будем считать, что на странице у нас будет по 10 книг.

$count = 10; // количество книг на странице
$page = (isset($_GET['page'])? $_GET['page']: 0); // это номер страницы

$db = new sql_db ($sqlserver, $sqluser, $sqlpassword, $database);
$db->sql_query("select * from books limit ".($count*$page).", {$count}"); // Этим запросом мы выбираем $count записtq начиная с $count*$page, т.е. если у нас $page=2, то выбираются 10 записей начиная с 20.
$rowset = $db->sql_fetchrowset();
foreach ($rowset as $row) {
echo "Название книги: {$row['name']}. Автор: {$row['autor']}. Цена: {$row['price']}";
}
if ($page > 0) // Если не первая страница, то выводим ссылку на предыдущую страницу
echo "<a href='index.php?page=".($page-1)."'><< назад</a> ";
if ($count($rowset)<$count) // Если количество выбранных элементов из базы меньше $count, то выводим ссылку на следующую страницу
echo " <a href='index.php?page=".($page+1)."'>вперед >></a>";

Это самый распространенный вид. Тут конечно возникает глюк в пагинации, когда, например, в базе ровно 100 книг, т.е. будет 10 страниц, но при этом будет ссылка для перехода на другую страницу. Тут можно немного переиграть, для этого необходимо сначала подсчитать количество книг, а потом исходя из этого значения делить на страницы, например, так:

$count = 10; // количество книг на странице
$page = (isset($_GET['page'])? $_GET['page']: 0); // это номер страницы

$db = new sql_db ($sqlserver, $sqluser, $sqlpassword, $database);
$db->sql_query("select count(*) as total from books");
$all = $db->sql_fetchrow();
$all = $all['total'];

$db->sql_query("select * from books limit ".($count*$page).", {$count}");
$rowset = $db->sql_fetchrowset();
foreach ($rowset as $row) {
echo "Название книги: {$row['name']}. Автор: {$row['autor']}. Цена: {$row['price']}";
}

for ($i = 0; $i < ceil($all/$count); $i++)
if ($i == $page)
echo "[".($i+1)."] ";
else
echo "<a href='index.php?page={$i}'>[".($i+1)."]</a> ";

Т.е. блок пагинации будет выглядеть вот так:


Есть вопросы? Задавайте!


 
Tweet


Категория(и): Изучаем PHP, Скрипты, MySQL

Комментарии


Friday, 02 April 2010 | 15:14:08 | Автор: Phoenix

Спасибо за статью. Теперь бум пробовать реализовать это в админской части галереи.

Friday, 02 April 2010 | 15:47:42 | Автор: Phoenix

Хм, а вот в "Галерее" для посетителя сайта всё гораздо сложнее реализованно, если я конечно всё правильно просмотрел в файлах.

Попробую пояснить.
Пример который Вы показали в статье, в "Галерее" разбит на несколько частей.
1. В файле class/gallery.php, там function viewGallery($cid, $page, $count) {.......
2. В файле class/template.php, там static function pages($all, $count, $current) {.......
3. И в файле index.php, там echo viewTemplate::pages($gallery->countPhotos(.......

Мда, не всё так просто...

Friday, 02 April 2010 | 15:59:48 | Автор: programmer

В галерее немного просто по другому разбито, но выполняет теже самые функции.

1. Аналог строки $db->sql_query("select * from books limit ".($count*$page).", {$count}"); Т.е. просто выбор из базы данных по параметрам текущей страницы и количества позиций на странице

2. Описание самого метода пагинации, что и как выводить

3. Вызов метода вывода блока пагинации

Отвечу на вопросы по PHP

Monday, 05 April 2010 | 23:51:49 | Автор: Phoenix

Совсем запутался, классы, методы..... Все выходные сидел, закипел.
Понял одно, что надо брать где-то путёвую литературу по ООП.

Tuesday, 06 April 2010 | 00:08:55 | Автор: programmer

Можно не использовать классы, я программировать функциями. Но потом собирать все эти функции в одно единое сложно. 

Да, наверное, это сложно, но я сейчас с ужасом смотрю на свое первые проекты :) И еще раз повторюсь, что лучше сразу "покипеть" с теорией, чтобы потом было легче

Отвечу на вопросы по PHP

Добавить комментарий
Чтобы оставить комментарий, Вам необходимо зарегистрироваться или авторизироваться