Как сделать GridView на данных из json?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Grazio
Сообщения: 124
Зарегистрирован: 2015.01.24, 15:31

Как сделать GridView на данных из json?

Сообщение Grazio »

Всем доброго!

Подскажите, коллеги, есть ли возможность реализовать таблицу GridView, cо столбцами header, phrase, data, если данные
хранятся в таком виде:

Код: Выделить всё

[{"header":"a","phrase":"aa","data":"aaaaaaaaaaaaaaa"},{"header":"b","phrase":"bb","data":"bbbbbbbbbb"},{"header":"d","phrase":"dd","data":"ddddd"}]
Всмысле мне нужна функциональная таблица с сортировкой и фильтрами, а не просто table циклом :)
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Как сделать GridView на данных из json?

Сообщение urichalex »

ArrayDataProvider
Grazio
Сообщения: 124
Зарегистрирован: 2015.01.24, 15:31

Re: Как сделать GridView на данных из json?

Сообщение Grazio »

urichalex писал(а): 2017.10.16, 23:02 ArrayDataProvider
ага, так... сортировка работает. а searchModel как сделать? чтобы фильтр работал.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как сделать GridView на данных из json?

Сообщение ElisDN »

Вручную через array_filter.
Grazio
Сообщения: 124
Зарегистрирован: 2015.01.24, 15:31

Re: Как сделать GridView на данных из json?

Сообщение Grazio »

ElisDN писал(а): 2017.10.17, 03:14 Вручную через array_filter.
мм.. не понимаю. Есть какой-нибудь пример адекватный?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как сделать GridView на данных из json?

Сообщение ElisDN »

Код: Выделить всё

$array = array_filter($array, function ($item) {
    $allow = true;
    if (!empty($this->header)) {
        $allow = $allow && mb_strpos($this->header, $item['header']) !== false;
    }
    if (!empty($this->phrase)) {
        $allow = $allow && mb_strpos($this->phrase, $item['phrase']) !== false;
    }
    if (!empty($this->data)) {
        $allow = $allow && mb_strpos($this->data, $item['data']) !== false;
    }
    return $allow;
});

return new ArrayDataProvider(['allModels' => $array]);
Grazio
Сообщения: 124
Зарегистрирован: 2015.01.24, 15:31

Re: Как сделать GridView на данных из json?

Сообщение Grazio »

Чё-то не то.

Код: Выделить всё

$array = array_filter($model->phrases, function ($item) {
    $allow = true;
    if (!empty($this->header)) {
        $allow = $allow && mb_strpos($this->header, $item['header']) !== false;
    }
    if (!empty($this->phrase)) {
        $allow = $allow && mb_strpos($this->phrase, $item['phrase']) !== false;
    }
    if (!empty($this->data)) {
        $allow = $allow && mb_strpos($this->data, $item['data']) !== false;
    }
    return $allow;
});

$searchModel = new ArrayDataProvider(['allModels' => $array]);

?>

	<?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,

        'columns' => [
            ['class' => 'kartik\grid\SerialColumn'],

        	'header',
            'phrase',
            'data',

        ],
    ]); ?>

Если мы выведем searchModel то выглядеть будет так:

Код: Выделить всё

yii\data\ArrayDataProvider Object ( [key] => [allModels] => Array ( [0] => Array ( [header] => Header1 [phrase] => Phrase one [data] => data one ) [1] => Array ( [header] => Header2 [phrase] => Phrase two [data] => data two ) ) [modelClass] => [id] => dp-1 [_sort:yii\data\BaseDataProvider:private] => [_pagination:yii\data\BaseDataProvider:private] => [_keys:yii\data\BaseDataProvider:private] => [_models:yii\data\BaseDataProvider:private] => [_totalCount:yii\data\BaseDataProvider:private] => [_events:yii\base\Component:private] => Array ( ) [_behaviors:yii\base\Component:private] => )
Однако, во вьюхе отсутствуют инпуты:
Изображение

p.s.
dataprovider соответственно вот так:

Код: Выделить всё

$dataProvider = new ArrayDataProvider([
    'allModels' => $model->phrases,
    'pagination' => [
        'pageSize' => 10,
    ],
    'sort' => [
        'attributes' => ['header', 'phrase', 'data'],
    ],
]);
Ответить