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

Начнем по обыкновению с постановки задачи. Необходимо организовать постраничный вывод любого рода контента. Поле деятельности – движок, написаный на PHP, и данные, которые хранятся в базе MySQL.

Разобьем нашу задачу на два подпункта. Нам необходимо организовать выбор из базы необходимой нам части информации (иными словами – страницы), а также сгенерировать меню навигации по страницам.

Я считаю наиболее удобной следующего вида схему навигации по страницам:

<< … n-1 n n+1 … >>,

где “<<” переход на первую страницу (“<< … ” не отображаются когда текущая страница первая), ” n ” – номер текущей страницы, “n-1″и “n+1” – ссылки на предыдущую и следующую страницы соответственно, “…” просто три точки. =)

Теперь приступим непосредственно к делу. Для начала определим константу, которой присвоим максимально допустимое значение единиц контента на страницу.

DEFINE('ITEM_PER_PAGE', 4);

Следующим шагом необходимо узнать количество всех доступных элементов. Например:

$items_cnt_arr = $this->db->GetRow("SELECT COUNT(`id`) as `all` FROM `content` ");
# в этой переменно уже храниться общее кол-во элементов.
$items_cnt = $items_cnt_arr['all'];
#делим кол-во всех элементов на кол-во элементов на странице и округляем до большего
$max_pages = ceil($items_cnt/ITEM_PER_PAGE);

Теперь определить какой передаваемый параметр будет отвечать за запрашиваемую страницу и проверить допустимо ли значение, которое он принимает.

if ( empty($_GET['page']) || !is_numeric($_GET['page'])) {
    # если передаваемое значение пусто или не число
    $curr_page = 0;
} elseif ($_GET['page']>=$max_pages){
    # если не превышает максимально допустимого числа страниц
    $curr_page = ($max_pages-1);
} else {
    # если входит в область допустимых значений
    $curr_page = $_GET['page'];
}

Для того чтобы выбрать необходимые элементы для вывода на страницу теперь достаточно выполнить следующего рода запрос:

SELECT *
FROM `content`
LIMIT ".($curr_page*ITEM_PER_PAGE).", ".ITEM_PER_PAGE;

(выделенная жирным часть обязательно должна присутствовать 🙂

Теперь организуем генерацию меню навигации.

$_nav_text = '';
# ссылка на первую страницу
if ($curr_page>0) {
    # если текущая страница не первая
    $_nav_text .= '<a href="/phone/0" mce_href="/phone/0">«</a>  ...';
} 

for ($k=0;$k&lt;3;$k++) {
    # номер страницы, содержащейся в ссылке
    $_link_id = $curr_page+($k-1);

    if (($_link_id < $max_pages) && ($_link_id>=0)) {
        if ($_link_id != $curr_page) {
            # выводим ссылки на предыдущие и следующие страницы
            $_nav_text .= ' <a href="index.php?page='.$_link_id.'" mce_href="index.php? page='.$_link_id.'">'.($_link_id+1).'</a> ';
        } else {
            # выводим номер текущей страницы
            $_nav_text .= ' <b>'.($_link_id+1).'</b>';
        }
    }
}

// ссылка на последнюю страницу
if ($curr_page < ($max_pages-1)) {
    # если текущая страница не последняя
    $_nav_text .= '  ...  <a href="index.php?page='.($max_pages-1).'" mce_href="index.php?page='.($max_pages-1).'">»</a>; ';
}

Теперь в переменной $_nav_text содержится код ссылок меню навигации.
UPD.1. В данной статье принято считать страницы с нуля. Чтобы получить человеко понятную нумерацию, нужно изменить $curr_page = $_GET[‘page’]; на $curr_page = $_GET[‘page’]-1; .

2 Responses to “Постраничный вывод”

  1. dar says:

    SELECT *
    2 FROM `content`
    3 LIMIT “.($curr_page*ITEM_PER_PAGE).”, “.ITEM_PER_PAGE;

    Как это так? Допустим страница у нас 1 ($curr_page =1)
    выходит вывод должен быть 1 * 4 = 4 с 4ой до 8 записи?
    Ничо не перепутали?

Leave a Reply




*