
Пагинация в Yii2
Когда записей выбирается из базы данных много, то в Yii предусмотрено постраничное разбиение.
Подключаем в контроллере класс для пагинации
use yii\data\Pagination;
Далее в контроллере, где нужное действие, описываем ещё и пагинацию
function actionIndex() { // выполняем запрос $query = Companies::find()->where(['status' => 3]); // делаем копию выборки $countQuery = clone $query; // подключаем класс Pagination, выводим по 10 пунктов на страницу $pages = new Pagination(['totalCount' => $countQuery->count(), 'pageSize' => 10]); // приводим параметры в ссылке к ЧПУ $pages->pageSizeParam = false; $models = $query->offset($pages->offset) ->limit($pages->limit) ->all(); // Передаем данные в представление return $this->render('index', [ 'models' => $models, 'pages' => $pages, ]); }
В Yii2 появился pageSizeParam, который в $_GET запросе передает установленный
pageSize и его можно обрабатывать из $_GET запроса. Отключается
строкой $pages->pageSizeParam = false;
В виде
// подключаем виджет постраничной разбивки use yii\widgets\LinkPager; // проходим цикл по данным модели, тут упрощённо, у вас может быть сложнее html-оформление foreach ($models as $model) { // выводим название организации (пример) echo $model->name; } // отображаем постраничную разбивку echo LinkPager::widget([ 'pagination' => $pages, 'registerLinkTags' => true ]);
registerLinkTags - параметр, прописывает в хедер ссылки на текущую, предыдущую и следующую страницы. По-умолчанию он выключен в false, чтобы не было конфликтов, если у вас несколько пагинаций на одной странице. Нам это пока не грозит, поэтому включаем. Если вы используете включение пагинации сразу в виде и с настройками по-умолчанию, то там тоже можно задавать эти настройки.
<?= ListView::widget([ 'dataProvider' => $dataProvider, 'itemOptions' => ['class' => 'item'], 'itemView' => '_view', 'layout' => '{items}{pager}', 'pager' => ['registerLinkTags' => true], ]) ?>
Пагинация в Yii1
Для Yii1 в контроллере
$criteria = new CDbCriteria(); ... $count = Post::model()->count($criteria); $pages=new CPagination($count); $pages->pageSize = Yii::app()->params['per_page']; $pages->applyLimit($criteria); $post = Post::model()->findAll($criteria); $this->render('index', array( 'post' => $post, 'paginator' => $pages, ));
Создаем критерии выборки. С помощью метода count(), считаем сколько
записей выбирутся по этим критериям. Создаем объект пагинации и
передаем ему общее число записей $count. Устанавливаем количество записей на
странице (pageSize) и применяем пагинатор к нашим критериям. В этот
момент в критерии добавятся limit и offset в зависимости от текущей
старницы (приватная переменная объекта CPagination $_currentPage
устанавливается в зависимости от $_GET параметра, задаваемого переменной
$pageVar и по умолчанию равного ‘page’). В Yii2 теперь критерии limit и offset мы устанавливаем сами явно.
В представлении используем виджет пагинатора так
<?php $this->widget('CLinkPager', array( 'pages' => $paginator, 'htmlOptions'=> array('class'=>'pagination'), )) ?>
AJAX постраничная навигация
Перезагружаться будет только блок с записями, а не вся страница. Для этого добавляется класс Pjax и внутрь этого блока вставляется список записей.
// подключаем класс таблицы use yii\grid\GridView; // подключаем класс Pjax use yii\widgets\Pjax; // Начало блока Pjax Pjax::begin(); echo GridView::widget([ 'dataProvider' => $dataProvider, 'columns' => [ ['class' => 'yii\grid\SerialColumn'], 'id', 'name', 'city' 'address', //..... ['class' => 'yii\grid\ActionColumn'], ], ]); // конец блока Pjax Pjax::end();
Ещё читать источник: http://developer.uz/blog/pagination-in-yii2-and-in...
5 августа 2016, Программирование, веб-кодинг / Метки: Pagination LinkPager пагинация
По мотивам – http://www.webapplex.ru/postranichnaya-navigacziya-v-yii-2.x

