【问题标题】:Yii2 GridView Pagination + Search FilterYii2 GridView 分页 + 搜索过滤器
【发布时间】:2020-05-19 15:09:47
【问题描述】:

尝试在网格视图中同时启用分页和搜索过滤器。我知道我在下面的代码中覆盖了 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,
    ]);    
}

【问题讨论】:

  • 只需在FileEntrySearch模型的search()方法中添加pagination参数,如果你覆盖它,你为什么要初始化dataProvider
  • 我同意@MuhammadOmerAslam,在您的FileEntrySearch() 模型中添加dataProvider 初始化。

标签: yii2


【解决方案1】:

$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 以这种方式覆盖。

【讨论】:

    【解决方案2】:

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

    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,
        ]);    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-09
      • 2018-08-17
      • 2017-02-12
      • 1970-01-01
      • 2017-09-22
      • 1970-01-01
      相关资源
      最近更新 更多