Когда на одной странице слишком много данных, общая стратегия заключается в том, чтобы отображать их на нескольких страницах, и на каждой странице отображается только небольшая часть данных. Эта стратегия называется разбиение на страницы.

Yii использует объект yii\data\Pagination для представления информации о схеме разбиения на страницы. В частности:

  • total count указывает общее количество элементов данных. Обратите внимание, что это обычно намного больше, чем количество элементов данных, необходимых для отображения на одной странице.
  • page size указывает, сколько элементов данных содержится на каждой странице. Значение по умолчанию - 20.
  • current page дает номер текущей страницы (нулевой). Значение по умолчанию равно 0, что означает первую страницу.

С полностью указанным объектом yii\data\Pagination вы можете частично получать и отображать данные. Например, если вы извлекаете данные из базы данных, вы можете указать предложение OFFSET и LIMIT запроса DB с соответствующими значениями, предоставленными разбиением на страницы. Ниже приведен пример:

use yii\data\Pagination;

// build a DB query to get all articles with status = 1
$query = Article::find()->where(['status' => 1]);

// get the total number of articles (but do not fetch the article data yet)
$count = $query->count();

// create a pagination object with the total count
$pagination = new Pagination(['totalCount' => $count]);

// limit the query using the pagination and retrieve the articles
$articles = $query->offset($pagination->offset)
    ->limit($pagination->limit)
    ->all();

Какая страница статей будет возвращена в приведенном выше примере? Это зависит от того, указан ли параметр запроса с именем page. По умолчанию разбиение на страницы будет пытаться установить текущую страницу в качестве значения параметра page. Если параметр не указан, то по умолчанию он будет равен 0.

Чтобы облегчить создание элемента пользовательского интерфейса, который поддерживает разбиение на страницы, Yii предоставляет виджет yii\widgets\LinkPager, который отображает список кнопок страницы, по которым пользователи могут щелкнуть, чтобы указать, какая страница данных должна отображаться. Виджет принимает объект разбиения на страницы, чтобы он знал, что такое текущая страница и сколько кнопок страницы должно отображаться. Например:

use yii\widgets\LinkPager;

echo LinkPager::widget([
    'pagination' => $pagination,
]);

Если вы хотите вручную создать элемент пользовательского интерфейса, вы можете использовать yii\data\Pagination::createUrl() для создания URL-адресов, которые приводят к разным страницам. Для этого метода требуется параметр страницы и будет создан правильно отформатированный URL, содержащий параметр страницы. Например:

// specifies the route that the URL to be created should use
// If you do not specify this, the currently requested route will be used
$pagination->route = 'article/index';

// displays: /index.php?r=article%2Findex&page=100
echo $pagination->createUrl(100);

// displays: /index.php?r=article%2Findex&page=101
echo $pagination->createUrl(101);