Поместить массив в dropDown список GridView

188
02 марта 2018, 18:29

Есть представление с вот таким GridView

GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'rowOptions' => function ($model, $key, $index, $grid) {
},
'columns' => [
    ['class' => 'yii\grid\SerialColumn'],
    [
        'label' => 'День новости',
        'format' => 'date',
        'attribute' => 'day',
        'format' => ['datetime', 'php:j'],
        'contentOptions' => ['style' => 'width: 15%'],
        'value' => 'news_date',
        'filter' => function ($searchModel) {
            $num = cal_days_in_month(CAL_GREGORIAN, date('m', $searchModel->month), date('Y', $searchModel->cdate));
            $dates_month = array();
            for ($i = 1; $i <= $num; $i++) {
                $mktime = mktime(0, 0, 0, date('m', $searchModel->month), $i, date('Y', $searchModel->cdate));
                $date = date("d", $mktime);
                $dates_month[$i] = $date;
            }
            return $dates_month;
        },
    ],
    [
        'label' => 'Месяц новости',
        'format' => 'date',
        'attribute' => 'month',
        'format' => ['datetime', 'php:F'],
        'contentOptions' => ['style' => 'width: 15%;'],
        'value' => 'news_date',
    ],
    [
        'label' => 'Заголовок новости',
        'format' => 'html',
        'attribute' => 'news_name',
        'value' => function($data) {
            return Html::a($data->news_name, $data->news->getNewsUrl());
        },
    ],
    ['class' => \yii\grid\ActionColumn],
],
'layout' => "<div class='table-responsive'>{summary}\n{items}</div>\n{pager}"
]);

У первого стоблца таблицы "День новости" в параметре 'filter' находится функция которая возвращает кол-во дней в месяце массивом. Я взял ее здесь. Возвращается массив вида

array(31) { [1]=> string(2) "01" [2]=> string(2) "02" [3]=> string(2) "03" [4]=> string(2) "04" [5]=> string(2) "05" [6]=> string(2) "06" [7]=> string(2) "07" [8]=> string(2) "08" [9]=> string(2) "09" [10]=> string(2) "10" [11]=> string(2) "11" [12]=> string(2) "12"

... и т.д до конца дней в месяце.

Я хочу чтобы указанный массив появился у меня в качестве dropDown списка для фильтрации по дням. Но вместо него там пустой input. В тоже время в другом модуле реализовала вот такая конструкция для фильтрации по типу мессенджера/соц. сети:

'filter' => ['tg' => 'Telegram', 'fb' => 'Facebook', 'wa' => 'WhatsApp', 'vb' => 'Viber', 'ins' => 'Instagram', 'od' => 'Одноклассники', 'tw' => 'Twitter', 'vk' => 'ВКонтакте'],

И тогда в поле для фильтра у GridView появляется выпадающий список с пунктами из массива.

Как мне добиться такого же результата от моего кода?

Answer 1

Вставьте что то подобное в filter

'filter' => Html::activeDropDownList(
    $searchModel,
    'news_date',
    [__ВАШ МАССИВ__],
    ['class' => 'form-control', 'prompt' => '-']
),

P.S. Не нужно передавать в filter анонимную функцию, это не сработает. Лучше получите массив где-нибудь отдельно и позже вставьте его вместо [__ВАШ МАССИВ__] в моём примере.

READ ALSO
Парсинг яндекс-такси

Парсинг яндекс-такси

Хотел попробовать спарсить цену на сайте

210
Преобразовать в массив json

Преобразовать в массив json

Помогите преобразовать строку в массив json такой запрос

206
Не видит классы autoload.php

Не видит классы autoload.php

Вчера ВК выпустили PHP SDK для взаимодействия со своим APIЗашел в документацию и увидел, что библиотеку надо ставить через composer

244
Порядок выполнения функций в PHP

Порядок выполнения функций в PHP

Всем приветПо запросу "порядок выполнения", интернет показывает статьи с арифметическими действиями

230