Yii2 GridView 分页 + 搜索过滤器

Yii2 GridView Pagination + Search Filter

尝试在网格视图中同时启用分页和搜索过滤器。我知道我在下面的代码中覆盖了 dataProvider,但我不确定我该如何做。当然,问题是目前如果我更改页面或进行筛选搜索,分页就会消失。

public function actionLibrary()
{
    $query = FileEntry::find();

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

    $searchModel = new FileEntrySearch();

    if(Yii::$app->request->isAjax)
    {
        $dataProvider = $searchModel->search(Yii::$app->request->get());

    }

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

$dataProvider = $searchModel->search(Yii::$app->request->queryParams);

这假设您的 $searchModel 已经是 ActiveDataProvider 的一个实例,我假设您在 FileEntrySearch 模型中定义了它。所以您的操作可能看起来像这样:

public function actionLibrary()
{
    $searchModel = new FileEntrySearch();
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

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

和您的 FileEntrySearch:

class FileEntrySearch extends FileEntry
{
    // [...] rules, scenarios etc.

    public function search($params)
    {
        $query = FileEntry::find();

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

        // you can add sorting here

        $this->load($params);

        // you can define your filters here

        return $dataProvider; // this will become your $searchModel
    }
}

没有 dataProvider 以这种方式覆盖。

您可以在创建数据提供程序后更改分页配置:

public function actionLibrary() {
    $searchModel = new FileEntrySearch();
    $dataProvider = $searchModel->search(Yii::$app->request->get());
    $dataProvider->pagination->pageSize = 10;

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