Класс Pagination онлайн урок.


Создадим класс Pagination, в котором будет всего одно свойство, которое будет содержать массив кнопок (экземпляры класса Button).

class Pagination
{
public $buttons = array();
}


Создадим конструктор, в который передадим значения, необходимые для определения количества кнопок и текущей кнопки:
- общее количество элементов (например, статей, продукции, комментариев и т.п.)
- количество элементов на страницу
- значение текущей страницы

class Pagination
{
public $buttons = array();

public function __construct(Array $options = array('itemsCount' => 257, 'itemsPerPage' => 10, 'currentPage' => 1))
{
extract($options);
}
}


Наш конструктор зависит от списка параметров - массива $options. В этом массиве должны быть записаны значения общего количества элементов, количество элементов на странице и текущей страницы. Для удобства мы по умолчанию передаем конкретные значения. Очевидно, что в отдельной ситуации параметры будут свои. Далее мы используем функцию extract(), которая превращает значения массива в переменные с названиями в виде ключей соответствующих элементов массива. В нашем случае появятся переменные $itemsCount, $itemsPerPage, $currentPage.

Теперь подсчитаем количество страниц. Для этого надо разделить общее количество элементов на количество элементов на странице и округлить вверх,т.е. :
- Делим 257 на 10, получаем 25.7. Это значит, что 7 последних элементов будут размещены на 26 странице.
- Округляем вверх 25.7, получаем 26 - нужное количество страниц.

class Pagination
{
public $buttons = array();

public function __construct(Array $options = array('itemsCount' => 257, 'itemsPerPage' => 10, 'currentPage' => 1))
{
extract($options);

$pagesCount = ceil($itemsCount / $itemsPerPage);
}
}


Осталось добавить в свойство buttons экземпляры класса Button. Для начала добавим кнопки с явными номерами. Для этого запишем следующий цикл после определения переменной $pagesCount:

for ($i = 1; $i <= $pagesCount; $i++) {
$active = $currentPage != $i;
$this->buttons[] = new Button($i, $active);
}


Тут записан обычный цикл for от 1 до вычисленного количества кнопок. На каждом шаге мы создаем новый экземпляр класса Button. При этом, кнопка, которая соответствует текущей странице - неактивна. Это определяется в переменной $active.

Осталось разобраться с кнопками для перехода на предыдущую и следующую страницу.

$this->buttons[] = new Button($currentPage - 1, $currentPage > 1, 'Previous');

$this->buttons[] = new Button($currentPage + 1, $currentPage < $pagesCount, 'Next');


Тут мы передаем специальные значения параметров по умолчанию активности кнопки и надписи на ней. Активность этих кнопок определяется значением текущей страницы: кнопка "предыдущая" неактивна, когда мы на первой странице и кнопка "следующая" неактивна, когда мы на последней странице. Мы определяем это при помощи логических выражений $currentPage > 1 и $currentPage < $pagesCount.

Между этими двумя операциями, мы должны разместить цикл для определения свойства buttons:

$this->buttons[] = new Button($currentPage - 1, $currentPage > 1, 'Previous');

for ($i = 1; $i <= $pagesCount; $i++) {
$active = $currentPage != $i;
$this->buttons[] = new Button($i, $active);
}

$this->buttons[] = new Button($currentPage + 1, $currentPage < $pagesCount, 'Next');


Нам осталось перестраховаться от некоторых неприятных ситуаций, например, нулевая текущая страница или количество страниц равное 1. В последнем случае нам просто не нужны кнопки страниц. Прервем работу конструктора, если эти случаи будут иметь место:

if (!$currentPage) {
return;
}

if ($pagesCount == 1) {
return;
}


Также, рассмотрим случай, когда номер текущей страницы превышает номер последней. Например, будем считать в таком случае, что текущая страница - последняя:

if ($currentPage > $pagesCount) {
$currentPage = $pagesCount;
}


Таким образом класс Pagination будет выглядеть так: