Yii 2网格视图过滤器不能正常工作。选择一个过滤器会影响其他过滤器。更改一个过滤器(下拉列表)会自动选择其他过滤器(下拉列表)的值。这个问题也存在于URL中,更改一个过滤器会将其他过滤器附加到URL中,结果显示为组合。但实际上只有一个过滤器应该被应用,正在更改。
//搜索模型,添加虚拟表名
public function search($params)
{
$query = Model::find()->with('model_b');
if (empty($params['sort'])) {
$query->orderBy("group, " . Model::getSortByType() . ', "title"');
}
$dataProvider = new ActiveDataProvider([
'query' => $query,
'sort' => [
'attributes' => [
'code',
'title',
'updated_at'
]
]
]);
$this->load($params);
if (!$this->validate()) {
// uncomment the following line if you do not want to return any records when validation fails
// $query->where('0=1');
return $dataProvider;
}
// grid filtering conditions
$query->andFilterWhere([
'type' => $this->type,
'price_type' => $this->price_type,
'status' => $this->status,
'terms_related' => $this->terms_related,
'required' => $this->required,
'group' => $this->group,
]);
$query->andFilterWhere(['ilike', 'title', $this->title]);
$query->andFilterWhere(['is_qr' => $this->is_qr]);
return $dataProvider;
}
//控制器
public function actionIndex()
{
$searchModel = new ModelSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render("index", [
"searchModel" => $searchModel,
"dataProvider" => $dataProvider,
]);
}
//在View中,我更改的筛选器
[
'attribute' => 'is_qr',
'format' => 'boolean',
'filter' => [1 => 'TRUE', 0 => 'FALSE'],
'content' => function ($service) { return ((int) $service->is_qr === 1) ? 'TRUE' : 'FALSE'; }
],
//用上述过滤器更换的过滤器
[
'attribute' => 'terms_related',
'filter' => array(0 => 'FALSE', 1 => 'TRUE'),
'content' => function ($service) { return ((int) $service->terms_related === 1) ? 'TRUE' : 'FALSE'; }
]
意见:假设我在GridView中有5个过滤器。
操作1:我更改了一个过滤器,只有该过滤器是第一次应用,但在页面重新加载后,其他过滤器被填充为值“0”。因为在选择一个过滤器时,所有过滤器都被推送到URL中,而不是选择一个空值。具有空值的过滤器被应用到具有“0”值的其余过滤器
问题问题是,一旦我选择了筛选器,gridview将发送URL中所有可能的筛选器。我没有选择的筛选器具有空值。
Yii::$app->request->queryParams
这包含所有筛选器,并且除我选择的筛选器之外的筛选器具有空值,并且
$this->load($params);
in search()
将空值作为0处理。因此,我没有接触的过滤器将使用“0”值填充。
1条答案
按热度按时间iyzzxitl1#
我已经找到了解决方案,这是一个自定义的解决方案,但为我工作。我创建了一个特质
在此之前
我称之为trait的函数。
trait解决方案背后的原因是,这个问题也可能发生在其他清单中。要解决这个问题,我们只需要
use
trait并调用函数从参数中删除空值。