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

22. Виджет cListView

CListView — это стандартный виджет для отображения записей. В отличии от виджета CDetailView, данный виджет выводит все записи по заданному условию выборки. Поддерживает сортировку по определенным атрибутам и постраничную навигацию.

Виджет расположен в /framework/zii/widgets/CListView.php.

Минимальный код необходимый для вызова виджета:

Использование CListView. Листинг 22.1

$dataProvider = new CActiveDataProvider('Model');

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

'dataProvider'=>$dataProvider,

'itemView'=>'_view',

)); ?>

Разберем, какие параметры передаются в CListView.

dataProvider — запрос в модель.

itemView — представление, в котором будет рендерится каждая запись выводимая в CListView.

sortableAttributes — атрибуты, по которым происходит сортировка. Параметр принимает массив значений.

sortableAttributes. Листинг 22.2

$dataProvider = new CActiveDataProvider('Model');

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

'dataProvider'=>$dataProvider,

'itemView'=>'_view',

'sortableAttributes'=>array(

'rating',

'create_time',

),

)); ?>

emptyText – выводимый текст, если не найдено записей.

summaryText – подсчет элементов. Формат использования: {start} - {end} из общего количества {count}.

Использование CListView. Листинг 22.3

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

'dataProvider'=>$dataProvider,

'itemView'=>'_view',

summaryText’ => {start} – {end} из {count}

'sortableAttributes'=>array(

'rating',

'create_time',

),

)); ?>

Рассмотрим объявление $dataProvider в контроллере, с ограничением записей и с формированием постраничной навигации.

Уточненный запрос и постраничная навигация в $dataProvider. Листинг 22.4

$criteria = new CDbCriteria;

$criteria->condition = 'id<10';

$criteria->order = 'id DESC';

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

'criteria' => $criteria,

'pagination' => array(

'pageSize' => 1

)

));

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

'dataProvider' => $dataProvider

));

23. Виджет cGridView, таблица администратора

Данный виджет используется в экшне admin:

Рассмотрим вызов данного виджета:

Уточненный запрос и постраничная навигация в $dataProvider. Листинг 23.1

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

'id'=>'candidats-grid',

'dataProvider'=>$model->search(),

'filter'=>$model,

'columns'=>array(

'id',

'picture',

'name',

'about',

array(

'class'=>'CButtonColumn',

),

),

)); ?>

Чтобы виджет работал, необходимо передать в параметр dataProvider объект CActiveDataProvider.

Рассмотрим параметры элемента columns. Это значения ассоциаций модели, которые необходимо вывести на экран. Вместо ассоциации можно использовать массив. Рассмотрим пример использования:

Использование массива настроек. Листинг 23.2

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

'id'=>'candidats-grid',

'dataProvider'=>$model->search(),

'filter'=>$model,

'columns'=>array(

'id',

array(

‘name’=>’picture’,

‘header’=> ‘Изображение’,

cssClassExpression’ => ‘($data->id > 5) ? ’my’ : ‘’ ’,

‘headerHTMLOptions’=> array(‘width’=>30),

‘value’=>'CHtml::image(Yii::app()->request->baseUrl."/images/".$data->picture,"", array("width"=>"200px"))'

)

'name',

'about',

array(

'class'=>'CButtonColumn',

),

),

)); ?>

Разберем значение атрибута cssClassExpression:

‘($data->id > 5) ? ’my’ : ‘’ ’ – значит создать класс с именем my для записей с id > 5, в противном случае класс не создавать.

Также необходимо обратить внимание на атрибут value, в котором вместо значения, мы вывели изображение. Обратите внимание на одинарные ковычки. Любые php-конструкции в этом параметре необходимо заключать в такие ковычки. Внутри этих ковычек мы можем использовать двойные.

Мы можем к каждой записи добавить элемент формы checkbox.

Добавляем к каждой записи checkbox. Листинг 23.3

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

'id'=>'candidats-grid',

'dataProvider'=>$model->search(),

'selectableRows'=>2,

'filter'=>$model,

'columns'=>array(

array(

'class'=>'CCheckBoxColumn',

'id'=>'checked',

),

array(

'name'=>'picture',

'header'=> 'Изображение',

'type' => 'raw',

'headerHtmlOptions'=> array('width'=>200),

'value'=>'$data->picture'

),

'name',

'about',

array(

'class'=>'CButtonColumn',

),

),

)); ?>

Новый массив содержит класс CCheckBoxColumn, который непосредственно и создает чекбоксы. Кроме этого можем указать атрибут selectableRaws, содержащий количество отмеченных чекбоксов.

24. ORM

Задача ORM – это организация связей между моделями.

При генерации модели Gii создает метод relations, содержащий пустой массив:

Метод relations. Листинг 24.1

public function relations()

{

return array(

);

}

Чтобы данную модель связать с другой моделью, нужно в массиве создать ассоциацию необходимой модели с нужной связью:

BELONGS_TO

Связь BELONGS_TO. Листинг 24.2

public function relations()

{

return array(

'Candidat'=>array(self::BELONGS_TO, 'Candidats', 'candidat_id')

);

}

Вывод данных из другой модели осуществляется так:

Вывод данных из другой модели, связь BELONGS_TO. Листинг 24.3

$data->Candidat->name

Чтобы перевести ассоциации на русский язык, можно использовать labels.

HAS_MANY

Связь HAS_MANY. Листинг 24.4

public function relations()

{

return array(

'Candidat'=>array(self::HAS_MANY, 'Candidats', 'candidat_id')

);

}

Т.к. связь HAS_MANY возвращает массив данных, то для прохода по массиву нужно использовать foreach:

Вывод данных из другой модели, связь HAS_MANY. Листинг 24.5

foreach($data->Candidat as $one){

echo $one->name;

echo “<hr />”;

}

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