Пример работы с виджетом GridView. Хороший инструмент для вывода данных в табличной форме. В этом примере я разберу как построить интерфейс для отображения данных в виде таблицы материалов с детальным просмотром каждого из материалов при помощи GridView Yii2.
Контроллер
public function actionMypage()
{
return $this->render('list');
}
Модель
public static function my_list()
{
return new ActiveDataProvider([
'query' => self::find(),
'pagination' => [
'pageSize' => 20,
],
]);
}
Представление
public static function act_list()
{
return new ActiveDataProvider([
'query' => self::find(),
'pagination' => [
'pageSize' => 20,
],
]);
}
Нумерация строк - виджет SerialColumn
При добавлении этого виджета появляется новая колонка в таблице с последовательной нумерацией.
echo GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'ID',
....
'SomeColumn',
[
'class' => 'yii\grid\SerialColumn'
],
],
]);
Добавление классов таблицы.
Чтобы таблица приобрела какое-нибудь оформление, например Bootstrap, можно добавить в нее класс.
echo GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'ID',
....
'SomeColumn',
[
'class' => 'yii\grid\ActionColumn'
],
],
'tableOptions' => [
'class' => 'table table-striped table-bordered'
],
]);
Управляющие кнопки для таблицы реализованы через ActionColumn
echo GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'ID',
....
'SomeColumn',
[
'class' => 'yii\grid\ActionColumn','template' => '{view} {update} {delete}'],
],
]);
По умолчанию выводятся такие действия как просмотр, удаление, редактирование.
Сделаю только просмотр, кастомизировав шаблон ActionColumn.
echo GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'ID',
....
'SomeColumn',
[
'class' => 'yii\grid\ActionColumn','template' => '{view}'
],
],
]);
Колонки было бы неплохо озаглавить, делается это через attributeLabels в модели.
Пример:
public function attributeLabels()
{
return [
'State' => 'Статус',
.....
];
}
Замена значения
Бывают ситуации когда в таблице находится некий код, например State : n, а должно быть как-то так: State : новый
В этом случае выручит замена значения.
Лучше всего сделать join с таблицей, но не всегда это возможно.
echo GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'ID',
'State',
// вариант №1
[
'attribute' => 'State',
'value' => function ($model){
if($model->State == 'n'){
return 'Новый';
}
}
],
// вариант №2
[
'attribute' => 'State',
'value' => function ($model) {
return $model->State == 'n' ? 'Новый' : 'Старый';
},
],
// вариант №3
[
'attribute' => 'State',
'value' => 'statusText',
],
В модели необходимо создать метод с названием:
getStatusText()
{
switch($this->State){
case 'n':
return 'новый';
// и так далее
}
}
Указать ссылку в ActionColumn на просмотр материала с параметром ID материала.
$url - сюда передавать ссылку.
echo GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'ID',
[
'attribute' => 'State',
'value' => 'statusText',
],
[
'class' => 'yii\grid\ActionColumn',
'template' => '{view}',
'buttons' => [
'view' => function ($url, $model) {
return Html::a('<span class="glyphicon glyphicon-search"></span>', $url, [
'title' => Yii::t('app', 'view_material'),
]);
},
]
],
],
]);