Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PHP для продвинутых.docx
Скачиваний:
16
Добавлен:
01.07.2025
Размер:
12.54 Mб
Скачать

15. Постраничная навигация и cActiveDataProvider

В версиях 1.0.х для вывода записей какой-нибудь таблицы с разбивкой на страницы (пагинацией) использовался следующий код.

Постраничная навигация в версиях 1.0.x. Листинг 15.1

$criteria=new CDbCriteria;

$pages=new CPagination(Screenshots::model()->count($criteria));

$pages->pageSize=self::PAGE_SIZE;

$pages->applyLimit($criteria);

$sort=new CSort('Screenshots');

$sort->applyOrder($criteria);

$models=Screenshots::model()->findAll($criteria);

$this->render('admin',array(

'models'=>$models,

'pages'=>$pages,

'sort'=>$sort,

));

Здесь создаются экземпляры CDbCriteria, CPagination и CSort. При этом с помощью CDbCriteria мы можем изменять SQL запросы, которые создаёт модель (Screenshots). CPagination используется для настройки пагинации, а CSort – сортировки записей. Массив с объектами CActiveRecord возвращает метод findAll модели. Обратите внимание, что для настройки, которые хранятся в CDbCriteria используются всеми остальными классами.

Сделаем тоже самое, но с помощью класса CactiveDataProvider

Постраничная навигация с помощью CActiveDataProvider. Листинг 15.2

$dataProvider=new CActiveDataProvider('Screenshots', array(

'pagination'=>array(

'pageSize'=>self::PAGE_SIZE,

),

));

$this->render('admin',array(

'dataProvider'=>$dataProvider,

));

Объем кода значительно уменьшился за счет того, что все экземпляры объектов CPagination, CSort и CDbCriteria находятся внутри CactiveDataProvider.

Обратите внимание, что в первом параметре конструктора мы передаём название модели, данные которой нужно получить. CActiveDataProvider сам вызовет соответствующие методы find() или findAll().

Чтобы настраивать запрос и постраничную навигацию нужно передать массив с соответствующими параметрами в конструкторе. Например.

Использование элементов массива criteria и pagination . Листинг 15.3

$dataProvider=new CActiveDataProvider('Post', array(

'criteria'=>array(

'condition'=>'status=1 AND tags LIKE :tags',

'params'=>array(':tags'=>$_GET['tags']),

'with'=>array('author'),

),

'pagination'=>array(

'pageSize'=>20,

),

));

Т.е. мы можем использовать документацию по CDbCriteria при настройке CActiveDataProvider.

Кроме того, если возникнет необходимость, можно использовать методы getCriteria(), setCriteria(), getSort(), setSort() для чтения и установки соответствующих объектов.

В версиях 1.0.х необходимо было передавать три параметра: с данными, настройками пагинации и сортировки. В новом варианте передаётся только один – сам объект CActiveDataProvider.

В версию 1.1 входят компоненты zii, один из которых (zii.widgets.grid.CGridView) специально разработан для использования вместе с CActiveDataProvider. Т.е. вы передаёте ему экземпляр CActiveDataProvider и заголовки столбцов, а он на основе этих данных формирует таблицу.

Вывод на экран:

Вывод постраничной навигации на экран. Листинг 15.4

<?php $this->widget('zii.widgets.CListView', array(

'dataProvider'=>$dataProvider,

'itemView'=>'_view',

)); ?>

В элементе масссива itemView подключается подшаблон вывода для цикла.

Подшаблон _vew. Листинг 15.5

<div class="view">

<b><?php echo CHtml::encode($data->getAttributeLabel('id')); ?>:</b>

<?php echo CHtml::link(CHtml::encode($data->id), array('view', 'id'=>$data->id)); ?>

<br />

<b><?php echo CHtml::encode($data->getAttributeLabel('name')); ?>:</b>

<?php echo CHtml::encode($data->name); ?>

<br />

<b><?php echo CHtml::encode($data->getAttributeLabel('about')); ?>:</b>

<?php echo CHtml::encode($data->about); ?>

<br />

</div>

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]