Разберем пример вывода списка статей (таблица posts) и данных об авторе статьи (таблица user, для примера сортировки по связанным таблицам). Структуру таблиц описывать не будем (в таблице posts данные о статьях, в таблице user данные об авторах).
Модели для таблиц user и posts стандартные, единственное, что необходимо заметить - это в модели posts необходимо добавить связь с авторами (по id автора) для примера сортировки по связанной таблице (путь к модели: /protected/models/Posts.php
):
<?php class Posts extends CActiveRecord { //...код модели ... public function relations() { return array( 'user' => array(self::BELONGS_TO, 'User', 'userId'), ); } //...код модели ... }
Код контроллера PostsController (путь к файлу: /protected/controllers/PostsController.php
):
<?php class PostsController extends Controller { public function actionIndex() { $criteria = new CDbCriteria(array( 'condition' => 'visibility=1', 'with' => 'user', )); $dataProvider = new CActiveDataProvider('Posts', array( 'pagination' => array( //количество элементов на странице 'pageSize' => 5, ), 'criteria' => $criteria, //настройки для сортировки 'sort' => array( //атрибуты по которым происходит сортировка 'attributes' => array( //заголовок 'header' => array( 'asc' => 'header ASC', 'desc' => 'header DESC', //по умолчанию, сортируем поле header по убыванию (desc) 'default' => 'DESC', ), 'user' => array( 'asc' => 'user.name ASC', 'desc' => 'user.name DESC', //по умолчанию, сортируем поле user по убыванию (desc) 'default' => 'DESC', ), 'date' => array( 'asc' => 't.date ASC', 'desc' => 't.date DESC', //по умолчанию, сортируем поле date по убыванию (desc) 'default' => 'DESC', ), ), //сортировка по умолчанию 'defaultOrder' => array( 'date' => CSort::SORT_DESC, ) ), )); $this->render('index', array( 'dataProvider' => $dataProvider, )); } //... код контроллера ... }
Код представления (view, путь к файлу: /themes/themeName/views/posts/index.php
):
<?php $this->widget('zii.widgets.CListView', array( 'dataProvider' => $dataProvider, 'itemView' => '_list', // представление для одной записи 'ajaxUpdate' => true, // true - ajax обновление данных, false - без ajax 'emptyText' => 'В данной категории записей.', 'summaryText' => "{start} — {end} из {count}", 'template' => '{pager} {summary} {sorter} {items} <hr/> {pager}', 'sorterHeader' => 'Сортировать по:', // ключи, которые были описаны $sort->attributes // если не описывать $sort->attributes, можно использовать атрибуты модели // настройки CSort перекрывают настройки sortableAttributes 'sortableAttributes' => array('header', 'user' => 'Автор', 'date'), 'pagerCssClass' => 'text-center', 'loadingCssClass' => 'preloader', 'pager'=>array( 'nextPageLabel' => '<span>»</span>', 'prevPageLabel' => '<span>«</span>', 'lastPageLabel' => '<span>»»</span>', 'firstPageLabel' => '<span>««</span>', 'selectedPageCssClass' => 'active', 'hiddenPageCssClass' => 'disabled', 'htmlOptions' => array('class' => 'pagination'), 'class' => 'CLinkPager', 'header' => false, ), ));
Код представления для записи (itemView, путь к файлу: /themes/themeName/views/posts/_list.php
):
<div class="media-body-list"> <h3 class="media-heading mrgn-btn-10"> <a href="<?php echo $data->url; ?>" class="link-h3"><?php echo $data->name; ?></a> </h3> <?php echo $data->shortText; ?> <div class="overflow-hidden"> <a href="<?php echo $data->url; ?>" class="detail btn btn-default pull-right">Подробнее...</a> </div> </div>
Список записей готов.
Основные свойства виджета для настройки вывода данных:
Свойство | Тип | Описание |
---|---|---|
afterAjaxUpdate | string | JavaScript функция, которая будет вызвана после успешного выполнения AJAX запроса. |
ajaxType | string | Тип AJAX запроса, "GET" или "POST". |
ajaxUpdate | mixed | ID контейнера в который будет записаны данные из ответа AJAX. false - отключит AJAX обновление данных. |
ajaxUpdateError | string | JavaScript функция, которая будет вызываться при возникновении ошибки обновления AJAX. |
ajaxUrl | mixed | URL для AJAX запросов. |
ajaxVar | string | Имя GET переменной, что указывает на AJAX запрос который вызван из текущего виджета. |
beforeAjaxUpdate | string | JavaScript функция, которая будет вызвана, перед AJAX запросом. |
cssFile | string | Путь к CSS файлу для виджета. |
emptyCssClass | string | Имя CSS класса для контейнера при пустом списке. |
emptyTagName | string | Имя HTML тега для контейнера при пустом списке. |
emptyText | string | Сообщение, которое отображается при пустом списке. |
htmlOptions | array | HTML атрибуты для контейнера списка. |
itemView | string | Вид (view) для рендеринга элемента списка. |
itemsCssClass | string | CSS класс элемента списка. |
itemsTagName | string | HTML тег для контейнера списка. |
loadingCssClass | string | CSS класс, который будет назначен в виджет элемента контейнера при обновлении контента AJAX запросом. |
pager | array|string | Конфигурация постраничного навигатора. |
pagerCssClass | string | CSS класс постраничного навигатора. |
sortableAttributes | array | Список атрибутов сортировки. |
sorterCssClass | string | CSS класс для контейнера сортировки. |
sorterHeader | string | Текст, отображаемый до сортировки. |
sorterFooter | string | Текст, отображаемый после сортировки. |
summaryCssClass | string | CSS класс для суммарного текста контейнера. |
summaryTagName | string | HTML тег суммарного контейнера. |
summaryText | string | Шаблон текста для суммарного контейнера. |
tagName | string | Тег контейнера списка. |
template | string | Шаблон, использоваться для управления размещением различных компонентов. |
viewData | array | Дополнительные данные которые будут переданы в itemView. |
Комментарии
А можно передать дополнительные параметры в код представления записи (_list.php)? Например начальный url, т.е. параметр одинаковый для всех записей
ОтветитьИспользуйте парамеьр viewData в виджете CListView. Пример:
Ответитьфайл index.php
$this->widget('zii.widgets.CListView', array(
'dataProvider' => $dataProvider,
'itemView' => '_list',
//...
'viewData' => array('startUrl' => 'myURL', 'value1' => $value1),
//...
));
?>
файл _list.php
<?php
echo $startUrl . $value1;
Спасибо, то что надо
ОтветитьА как передать дополнительный параметр в список _list?
ОтветитьВ index.php:
Ответить<?php
$this->widget( 'CListView', array(
'dataProvider' => $dataProvider,
//...
'viewData' => array( 'text' => 'text', 'id' => 7),
'itemView' => '_list',
) );
В _list
<?php
echo $text . $id;
А как передать инкремент в CListView, т.е. получить номер записи?
ОтветитьВывод номера записи в _list можно получить $index (начинается с 0):
Ответить<?php
echo $index;
Спасибо, у меня еще вопрос. А как получить количество позиций в $dataProvider?
ОтветитьВ том месте где вызывается CListView можно получить так:
Ответить$dataProvider->totalItemCount;
или так:
$dataProvider->getTotalItemCount();
Передать в _list так:
<?php
$this->widget('CListView',
array(
'dataProvider' => $dataProvider,
//...
'viewData' => array('itemCount' => $dataProvider->totalItemCount),
'itemView' => '_list',
)
);
В _list.php:
<?php
echo $itemCount;
Все получилось, спасибо за помощь
Ответить