Фильтрация сразу нескольких полей в GridView

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
julick
Сообщения: 45
Зарегистрирован: 2015.05.18, 12:07

Фильтрация сразу нескольких полей в GridView

Сообщение julick »

Есть табличка с данными
вывожу через гридВью
сделал фильтр по полям, но в модель передаётся значение только из одного параметра, а остальные сбрасываются. Фильтры сделал выпадающим списком через АррейМап. Т.е. при выборе нового селекта сразу идёт сабмит.
Что делать, куда копать? Получается что только один фильтр срабатывает на одно поле.
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: Фильтрация сразу нескольких полей в GridView

Сообщение astronin »

скорей всего не правильно настроен search, попробуйте использовать gii
julick
Сообщения: 45
Зарегистрирован: 2015.05.18, 12:07

Re: Фильтрация сразу нескольких полей в GridView

Сообщение julick »

фильтМодель был неверно настроен, разобрался, спс
julick
Сообщения: 45
Зарегистрирован: 2015.05.18, 12:07

Re: Фильтрация сразу нескольких полей в GridView

Сообщение julick »

тогда вопрос, как сделать так чтоб при выборе одного фильтра после перезагрузки страницы в других фильтрах отображались данные относящиеся только к этому выбраному полю?
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: Фильтрация сразу нескольких полей в GridView

Сообщение astronin »

там у вас данные из главной моделе не переходят в модель поиска
я ж говорю, создайте разочек через gii crud, это быстрый способ разобраться как это все работает
julick
Сообщения: 45
Зарегистрирован: 2015.05.18, 12:07

Re: Фильтрация сразу нескольких полей в GridView

Сообщение julick »

что мне именно нужно создать через gii crud?
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: Фильтрация сразу нескольких полей в GridView

Сообщение astronin »

да хоть тот же grid, что сейчас делаете
julick
Сообщения: 45
Зарегистрирован: 2015.05.18, 12:07

Re: Фильтрация сразу нескольких полей в GridView

Сообщение julick »

я не понимаю что вы имеете ввиду, объясните пожалуйста как создать grid, т.к. мне это не очевидно...
Аватара пользователя
lesha20
Сообщения: 28
Зарегистрирован: 2014.12.09, 00:46

Re: Фильтрация сразу нескольких полей в GridView

Сообщение lesha20 »

CRUD Generator создат для вас готовый контроллер, вьюхи и модель для поиска, что-то вроде этого:

контроллер:

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

class UserController extends Controller

....
    /**
     * Lists all User models.
     * @return mixed
     */
    public function actionIndex()
    {
        $searchModel = new UserSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
        $statusArray = User::getStatusArray();

        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
            'statusArray' => $statusArray,
        ]);
    }
....
часть вьюхи index.php:

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

<?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'layout' => "{items}\n{summary}\n{pager}",
        'columns' => [
            'id',
            'username',
            'email:email',
            [
                'attribute' => 'status',
                'format' => 'html',
                'value' => function ($model) {
                    if ($model->status === $model::STATUS_ACTIVE) {
                        $class = 'label-success';
                    } elseif ($model->status === $model::STATUS_INACTIVE) {
                        $class = 'label-warning';
                    } else {
                        $class = 'label-danger';
                    }

                    return '<span class="label ' . $class . '">' . $model->statusName . '</span>';
                },
                'filter' => Html::activeDropDownList(
                    $searchModel,
                    'status',
                    $statusArray,
                    ['class' => 'form-control', 'prompt' => 'Выбрать...']
                )
            ],
            [
                'attribute' => 'created_at',
                'format' => ['date', 'dd.MM.yyyy'],
                'filter' => DatePicker::widget(
                    [
                        'model' => $searchModel,
                        'attribute' => 'created_at',
                        'dateFormat' => 'dd.MM.yyyy',
                        'language' => 'ru',
                        'options' => [
                            'class' => 'form-control'
                        ],
                    ]
                )
            ],
            [
                'attribute' => 'updated_at',
                'format' => ['date', 'dd.MM.yyyy'],
                'filter' => DatePicker::widget(
                    [
                        'model' => $searchModel,
                        'attribute' => 'updated_at',
                        'dateFormat' => 'dd.MM.yyyy',
                        'language' => 'ru',
                        'options' => [
                            'class' => 'form-control'
                        ],
                    ]
                )
            ],
            ['class' => 'yii\grid\ActionColumn'],
        ],
    ]); ?>
модель:

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

class UserSearch extends User
{
    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
             // String
            [['username', 'email'], 'string'],
            // Status
            ['status', 'in', 'range' => array_keys(self::getStatusArray())],
            // Date
            [['created_at', 'updated_at'], 'date', 'format' => 'dd.MM.yyyy']
        ];
    }

    /**
     * @inheritdoc
     */
    public function scenarios()
    {
        // bypass scenarios() implementation in the parent class
        return Model::scenarios();
    }

    /**
     * Creates data provider instance with search query applied
     *
     * @param array $params
     *
     * @return ActiveDataProvider
     */
    public function search($params)
    {
        $query = User::find();

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);

        $this->load($params);

        if (!$this->validate()) {
            // uncomment the following line if you do not want to return any records when validation fails
            // $query->where('0=1');
            return $dataProvider;
        }

        $query->andFilterWhere([
            'id' => $this->id,
            'status' => $this->status,
            'FROM_UNIXTIME(created_at, "%d.%m.%Y")' => $this->created_at,
            'FROM_UNIXTIME(updated_at, "%d.%m.%Y")' => $this->updated_at
        ]);

        $query->andFilterWhere(['like', 'username', $this->username])
            ->andFilterWhere(['like', 'email', $this->email]);

        return $dataProvider;
    }
}
Ответить