Виджет в качестве фильтра GridView

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Pitonn
Сообщения: 41
Зарегистрирован: 2013.09.08, 17:35

Виджет в качестве фильтра GridView

Сообщение Pitonn »

Приветствую. Подскажите, каким образом правильно задать другой виджет в качестве фильтра?

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

GridView::widget(
        [
            'dataProvider' => $dataProvider,
            'filterModel'  => $searchModel,
            'columns'      => [
                ['class' => 'yii\grid\SerialColumn'],

                'id',
                'name',
                'alias',
                [
                    'attribute' => 'category_id',
                    'filter'    => TreeViewInput::widget(
                        [
                            'attribute'  => 'category_id',
                            'name'       => '',
                            'headingOptions' => [
                                'label' => Yii::t('/modules/catalog', 'Categories')
                            ],
                            'rootOptions'    => [
                                'label' => '<i class="fa fa-tree"></i>',  // custom root label
                                'class' => 'text-success'
                            ],
                            'query'      => Catalog::find()->addOrderBy('root, lft'),
                            'asDropdown' => true,
                            'multiple' => false,
                        ]
                    ),
                    'format'    => 'raw',
                    'value'     => function ($model) {
                        $catalog = Catalog::find()->andWhere(['id' => $model->category_id])->one();
                        return $catalog->name ?? $model->category_id;
                    }
                ],
            ],
       ]
);
В целом таким образом он выводится, но при выборе значения фильтр все равно отображается как пустой (т.е. как будто ничего не выбрано) да и фильтрация не отрабатывает.

Если делать так:

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

GridView::widget(
        [
            'dataProvider' => $dataProvider,
            'filterModel'  => $searchModel,
            'columns'      => [
                ['class' => 'yii\grid\SerialColumn'],

                'id',
                'name',
                'alias',
                [
                    'attribute' => 'category_id',
                    'class'    => TreeViewInput::class
                ],
            ],
       ]
);
то не получается, т.к. TreeViewInput не имеет параметра 'grid', который обязателен для построения колонки в GridView->initColumns()

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

$column = Yii::createObject(array_merge([
    'class' => $this->dataColumnClass ?: DataColumn::className(),
    'grid' => $this,
], $column));
TreeViewInput это виджет от Картика, может кто-то делал похожее или есть идея в какую сторону копать? Спасибо.
Pitonn
Сообщения: 41
Зарегистрирован: 2013.09.08, 17:35

Re: Виджет в качестве фильтра GridView

Сообщение Pitonn »

Разобрался, мало ли кому понадобится.

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

'filter'    => TreeViewInput::widget(
                        [
                            'attribute'      => 'category_id',
                            'name'           => 'CatalogItemSearch[category_id]',
                            'headingOptions' => [
                                'label' => Yii::t('/modules/catalog', 'Categories')
                            ],
                            'rootOptions'    => [
                                'label' => '<i class="fa fa-tree"></i>',  // custom root label
                                'class' => 'text-success'
                            ],
                            'query'          => Catalog::find()->addOrderBy('root, lft'),
                            'asDropdown'     => true,
                            'multiple'       => true,
                            'value'          => Yii::$app->request->getQueryParam(
                                    'CatalogItemSearch'
                                )['category_id'] ?? false,
                        ]
                    ),
'name' - указываем поисковую модель,
'value' - получаем выбранное значение и устанавливаем в качестве предвыбранного,
'multiple' - true - чтобы можно было сбрасывать значения, т.к. если использовать false, то при выборе значения, потом его никак не скинуть до пустого.
Ответить