When there's too much data to be displayed on a single page at once it's often divided into parts each containing some data items and displayed one part at a time. Such parts are called pages thus the name pagination.

If you're using data provider with one of the data widgets pagination is already sorted out for you automatically. If not, you need to create [[\yii\data\Pagination]] object, fill it with data such as [[\yii\data\Pagination::$totalCount|total item count]], [[\yii\data\Pagination::$pageSize|page size]] and [[\yii\data\Pagination::$page|current page]], apply it to the query and then feed it to [[\yii\widgets\LinkPager|link pager]].

First of all in controller action we're creating pagination object and filling it with data:

function actionIndex()
    $query = Article::find()->where(['status' => 1]);
    $countQuery = clone $query;
    $pages = new Pagination(['totalCount' => $countQuery->count()]);
    $models = $query->offset($pages->offset)

    return $this->render('index', [
         'models' => $models,
         'pages' => $pages,

Then in a view we're outputting models for the current page and passing pagination object to the link pager:

foreach ($models as $model) {
    // display $model here

// display pagination
echo LinkPager::widget([
    'pagination' => $pages,