【问题标题】:Default Filter in GridView with Yii2Yii2 在 GridView 中的默认过滤器
【发布时间】:2016-02-10 01:54:27
【问题描述】:

我不知道如何设置 GridView 的过滤器默认值。这意味着当页面加载时,它将加载具有我设置的特定条件的过滤器。

对此有什么想法吗? 谢谢

【问题讨论】:

  • SearchModel 类中提供您的特定条件

标签: php sorting gridview filter yii2


【解决方案1】:

Yii2 ActiveDataProvider 它自己需要一个query builder,这意味着您可以在将查询对象传递给它时过滤您的结果,例如:

$query = Post::find()->where['status' => 'published'];
// Todo and more conditions with $query object
$provider = new ActiveDataProvider([
    'query' => $query,
    'pagination' => [
        'pageSize' => 20,
    ],
]);

【讨论】:

    【解决方案2】:

    有点晚了,但只是为了记录一下SO。

    在 Yii2 GridView 小部件中设置允许的过滤器的一种方法是使用其 filterModel 对象的 rules 函数返回使用 save 属性设置的所需过滤字段。因此,您可以从此列表中删除所有不需要在 GridView 中显示的不需要的过滤器。

    然后您可以在filterModelsearch 函数下自定义ActiveDataProvider 查询,以正确构建请求的过滤数据。

    【讨论】:

      【解决方案3】:

      一个简单的方法是使用搜索模型。

      我使用 Default Gii 生成的代码来解释方法

      public function actionIndex()
      {
           $searchModel = new UserSearch(); 
           $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
      
           return $this->render('index', [
              'searchModel' => $searchModel,
              'dataProvider' => $dataProvider,
           ]);
      }
      

      假设你在页面加载时想要一个动态过滤器

      使用链接作为

      ../index.php?r=user/index&UserSearch[id]=7

      这将添加一个过滤器,其中 id = 7 即在我的情况下,因为 id 是主键,只会列出一个用户

      如果您想始终应用过滤器而不在 url 中显示任何内容,请说明

      public function actionIndex()
      {
           $searchModel = new UserSearch(); 
           $searchModel->name = 'mid'; 
           $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
      
           return $this->render('index', [
              'searchModel' => $searchModel,
              'dataProvider' => $dataProvider,
           ]);
      }
      

      这将创建一个过滤器,其中用户名包含字符串“mid”

      如果你想要更高级的过滤器

      您可以在 UserSearch 类中编辑 search() 函数,用于填充数据的查询和 ActiveDataProvider 将可供您使用。 说你不想列出不活跃的用户。

          public function search($params)
          {
               $query = User::find();
      
               $dataProvider = new ActiveDataProvider([
                   'query' => $query,
                ]);
      
               $this->load($params);
               $query->andFilterWhere(['active_status' => 1]);
               ....
      

      此方法将为您提供无限的方法来过滤您的结果.. 希望这会有所帮助..

      【讨论】:

      • 我的收藏中有数千份文档。最初我只想加载在createdAt 中具有当前日期 的文档。但是索引页面应该稍后可以加载所有文档。你的答案可以做到这一点吗?请。
      【解决方案4】:

      我遇到了同样的问题,它对我有用

      public function actionIndex()
      {
           $searchModel = new UserSearch(); 
           $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
           $dataProvider->query->andFilterWhere(['status'=>1]); 
           return $this->render('index', [
              'searchModel' => $searchModel,
              'dataProvider' => $dataProvider,
           ]);
      }
      

      这有助于执行过滤器以获取所需的操作,并且对于所有人而言,在我的情况下,我需要在环境中单独使用它

      【讨论】:

      • 如果我有ArrayDataProvider,如何使用它?
      【解决方案5】:
      public function actionIndex()
      {
      
           $searchModel = new UserSearch(); 
      
           // Filtro por Defecto y Reflejado en Formulario de Filtrado en Grid 
           $params = Yii::$app->request->queryParams;  
           if (!isset($params['UserSearch'])) {
              $params['UserSearch']['status']=1;            
           }   
           $dataProvider = $searchModel->search($params);   
      
           // -----------------------------------------------------------     
      
           return $this->render('index', [
              'searchModel' => $searchModel,
              'dataProvider' => $dataProvider,
           ]);
      }
      

      NOTA: Usar (!isset($params['UserSearch'])) para que solo se aplique como búsqueda por defecto ('Si no se ha definido ninguna condición de filtrado')

      注意:使用 (**! Isset ($ params ['UserSearch']) **) 使其仅适用于默认搜索('如果没有定义过滤条件')

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-12
        • 1970-01-01
        • 2020-05-23
        • 1970-01-01
        • 2020-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多