Yii2 gridviews (SqlDataProvider) как организовать поиск?

В представлении:
GridView::widget([
         'dataProvider' => $dataProvider,
         'filterModel' => $modelSearch,
         'columns' => [
                'id',
                [
                    'label' => 'Логин',
                    'attribute' => 'username',
                ],
                [
                    'label' => 'Имя',
                    'attribute' => 'firstname',
                ],
                [
                    'label' => 'Фамилия',
                    'attribute' => 'lastname',
                ],
                [
                    'label' => 'E-Mail',
                    'attribute' => 'email',
                ],
         ],
]);


В контроллере:
$totalCount = Yii::$app->db->createCommand('SELECT COUNT(*) 
                                                                           FROM Users 
                                                                           Where validation_email=:status', [':status' => 'confirmed'])
                                             ->queryScalar();
$sql = 'SELECT * FROM Users Where validation_email=:status';
$dataProvider = new SqlDataProvider([
'sql' => $sql,
'params' => [':status' => 'confirmed'],
'totalCount' => (int)$totalCount,
'sort' => [
         'attributes' => [
                        'id',
                        'username',
                        'lastname',
                        'firstname',
                        'email',
            ],
],
'pagination' => [
              'pageSize' => 10,
],
]);


Работает сортировка, как организовать поиск? В представлении указано 'filterModel' => $modelSearch
  • Вопрос задан
  • 1174 просмотра
Решения вопроса 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Через modelSearch. При генерации crud через gii должен был даже файл с фильтрами создаться (Если указывали serchmodel). Файл _search.php в папке views
с приблизительно следующим кодом:
<?php $form = ActiveForm::begin([
        'action' => ['index'],
        'method' => 'get',
    ]); ?>

    <div class="col-xs-3"><?= $form->field($model, 'text') ?></div>
    <div class="col-xs-3"><?= $form->field($model, 'cat') ?></div>
    <div class="col-xs-3"><?= $form->field($model, 'status')->dropDownList($model->getStatusList(),['prompt'=>''])
     ?></div>
    <div class="col-xs-3"><?= $form->field($model, 'email') ?></div>

    <div class="form-group col-xs-12">
        <?= Html::submitButton(Yii::t('app', 'Search'), ['class' => 'btn btn-primary']) ?>
        <?= Html::resetButton(Yii::t('app', 'Reset'), ['class' => 'btn btn-default']) ?>
        <?= Html::a(Yii::t('app', 'Создать Запрос'), ['create'], ['class' => 'btn btn-success']) ?>
    </div>

    <?php ActiveForm::end(); ?>

А экшен куда уходит форма, стандартно это index приблизительно следующий:
public function actionIndex()
    {
        $searchModel = new RequestSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }

При этом вся логика фильтрации и поиска вынесена в RequestSearch, который наследован от Request. Опять таки все это автоматом делает gii.
Почитайте:
www.yiiframework.com/doc-2.0/guide-output-data-wid...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@yura_born
Такая же проблема по созданию поиска в связке SQLdataProvider+GridViews
Пересмотрел кучу статей, я так и не понял как организовать поиск или фильтр.
Контроллер и вид переделывал после gii руками, файл _search есть.
Может кто-нить покажет нормальный, рабочий пример (контроллер вид модель). Я так понял с SQLdataProvider вообще фильтр сделать нельзя.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы