Yii2,GridView,在会话中保存过滤器值

Yii2, GridView, save filters value in session

是否有任何解决方案可以保存过滤器(在会话中)以便用户回来时可以看到 "last used filters"?

请link在手册或文档中,或您的代码中。我没有搜索到这个问题。

在模型搜索 class 中,在搜索函数的开头添加此代码:

if (!isset($params["MyModelSearch"])) {
   if (isset(Yii::$app->session["mymodelsearch"])){
      $params["MyModelSearch"]=Yii::$app->session["mymodelsearch"];
   }
}
else{
   Yii::$app->session["mymodelsearch"]=$params["MyModelSearch"];
}

In the model Search class, at the beginning of search function add this code:

if (!isset($params["MyModelSearch"])) {
 if (isset(Yii::$app->session["mymodelsearch"])){
  $params["MyModelSearch"]=Yii::$app->session["mymodelsearch"];
}
}
else{
   Yii::$app->session["mymodelsearch"]=$params["MyModelSearch"];
}

你好, 感谢您的解决方案。它适用于值过滤器,但不适用于排序过滤器。我们该如何解决这个问题?

这有点破解,但这为我节省了过滤器、页面和排序。

将它放在您的控制器中,假设您的模型名为 Customer:

    $searchModel = new CustomerSearch();

    $params = Yii::$app->request->queryParams;

    if (count($params) <= 1) {
      $params = Yii::$app->session['customerparams'];
      if(isset(Yii::$app->session['customerparams']['page']))
        $_GET['page'] = Yii::$app->session['customerparams']['page'];
      } else {
        Yii::$app->session['customerparams'] = $params;
    }

    $dataProvider = $searchModel->search($params);

我无法评论 Herbert Maschke 的代码,我实现了它并且运行良好,但后来我发现如果我 select 我的 gridview 的一个选项,如编辑然后返回,过滤器保持它们的值和分页也是如此,但在下一次单击另一个页码时,过滤器会丢失。我做了一个对我有用的改进。

$searchModel = new CustomerSearch();

$params = Yii::$app->request->queryParams;

if (count($params) <= 1) {
  $params = Yii::$app->session['customerparams'];
  if(isset(Yii::$app->session['customerparams']['page'])) <<------
    $_GET['page'] = Yii::$app->session['customerparams']['page']; <<------
  } else {
    Yii::$app->session['customerparams'] = $params;
}

$dataProvider = $searchModel->search($params);

似乎只有页面参数恢复为$_GET(后来$_GET用于分页并丢失了所有过滤器)所以我更改了这两行:

if(isset(Yii::$app->session['customerparams'])) {
    $_GET = Yii::$app->session['customerparams'];

我进行更改以更正页面更改

$searchModel = new MyModelSearch();

$params = Yii::$app->request->queryParams;

if(count($params) <= 1){
    //si es menor o igual a uno osea no ha realizado busqueda alguna          
    if(isset(Yii::$app->session['MyModelSearch'])) {
        $params = Yii::$app->session['MyModelSearch'];
    }else{
        Yii::$app->session['MyModelSearch'] = $params;
    }
}else{  
    if(isset(Yii::$app->request->queryParams['MyModelSearch'])){
        Yii::$app->session['MyModelSearch'] = $params;
    }else{
        $params = Yii::$app->session['MyModelSearch'];
    }       
}

$dataProvider = $searchModel->search($params);