Amir
Amir

Reputation: 573

Yii2 - Grid view shows all the datas when using search

I have created a Global Search with grid view displaying, but this is the problem for the first time that the search page loads or when the search field is empty and you search, all the data in the db will be displayed.

and I have used the _search.php view inside another view.
_search view:

<?php $form = ActiveForm::begin([
    'action' => ['index'],
    'method' => 'get',
]); ?>


<?= $form->field($model, 'globalSearch') ?> 


<div class="form-group">
    <?= Html::submitButton('Search', ['class' => 'btn btn-primary']) ?>
    <?= Html::resetButton('Reset', ['class' => 'btn btn-default']) ?>
</div>

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

the main view:

<?php echo $this->render("../ads/_search", ['model' => $model]); ?>

<?php Pjax::begin(); ?>

<?= GridView::widget([

    'dataProvider'  => $dataProvider,
    'filterModel'   => $model,
    'showOnEmpty'   => false,
    'summary'       => '',
    'showFooter'    => false,
    'showHeader'    => false,
    'columns'       => [
        'name',
        'type',
        'explanation',
        'address',
        'province_name',
        'cost',
    ],

]);?>

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

Anything else is needed? Let me know.

Upvotes: 0

Views: 928

Answers (2)

Barry
Barry

Reputation: 3733

If you want to display the grid, let the filter model return a data provider with no results when global search is empty

class FilterModel extends Model {
    public $globalSearch;
    ::
    ::
    public function search($params) {
        $provider = new ActiveDataProvider(
            $query = SomeModel::find();
        );

        if (!$this->globalSearch) {
            $query->where('1=0'); // returns no results
            return $provider;
        }

        // other code to return results with filter applied
        ::
        ::
        return $provider;
    }   
} 

Upvotes: 1

IStranger
IStranger

Reputation: 2041

I don't know how you applied this globalSearch filter, but this is default behavior of grid filters: when filters not defined - GridView will display matched data items (=== all items).

But if you want change this behavior you can simply not render GridView in the case of empty filter:

<?php echo $this->render("../ads/_search", ['model' => $model]); ?>

<?php 

if(!empty($model->globalSearch)){

    Pjax::begin(); 

    echo GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $model,
        'showOnEmpty'=>false,
        'summary'=>'',
        'showFooter'=>false,
        'showHeader' => false,

        'columns' => [
            'name',
            'type',
            'explanation',
            'address',
            'province_name',
            'cost',
        ],
    ]);

    Pjax::end(); 
}

?>  

Upvotes: 0

Related Questions