Бортовой журнал Ктулху

Пример создания в Yii2 списка материалов с детальным просмотром при помощи виджета GridView

Пример работы с виджетом 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,

                ],

           ]);

}

screenshot 2019 11 20 13 47 54

 

Нумерация строк -  виджет 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 материала.

https://stackoverflow.com/questions/38692362/how-to-change-view-update-and-delete-url-on-action-column-in-yii2

$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'),

                                                      ]);

                                                },

                     ]

                   ],

                   ],

]);