You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Yii2 GridView如何启用Active/Inactive状态筛选功能

实现Yii2 GridView状态列的筛选功能

没问题,我来帮你搞定这个状态列的筛选需求,既支持下拉选择也能兼容文本输入筛选,分两步来做就行:

1. 修改GridView中的状态列配置,添加下拉筛选框

首先在你的Status列里加上filter属性,用下拉框提供可选的状态选项,这样用户可以直接选择筛选,同时也支持手动输入文本(不过下拉框已经能覆盖大部分场景啦)。记得先引入yii\helpers\Html类哦。

修改后的列代码如下:

[
    'label' => 'Status',
    'attribute' => 'activeStatus',
    'format' => 'html',
    'value' => function ($data) {
        return $data->activeStatus ? '<span class="label label-success">Active</span>' : '<span class="label label-danger">Inactive</span>';
    },
    // 新增的筛选下拉框配置
    'filter' => \yii\helpers\Html::activeDropDownList(
        $searchModel, // 这里传入你的搜索模型实例,比如$userSearch
        'activeStatus',
        ['1' => 'Active', '0' => 'Inactive'], // 选项映射:数值对应显示文本
        ['prompt' => 'All'] // 默认显示的提示选项
    )
]

2. 在搜索模型(SearchModel)中处理筛选逻辑

接下来要确保搜索模型能正确识别用户选择或输入的状态值,把文本(Active/Inactive)转换成数据库对应的数值(1/0):

第一步:添加安全验证规则

在你的搜索模型(比如UserSearch.php)的rules()方法里,给activeStatus加上安全验证,让它能接收用户输入:

public function rules()
{
    return [
        // 其他已有的规则...
        ['activeStatus', 'safe'], // 新增这条规则
    ];
}

第二步:修改search()方法的查询逻辑

在search()方法里,处理activeStatus的筛选条件,把可能的文本输入转换成对应的数值:

public function search($params)
{
    $query = User::find(); // 替换成你的模型类

    // 其他查询初始化代码...

    $this->load($params);

    // 处理状态筛选的转换逻辑
    if ($this->activeStatus === 'Active') {
        $this->activeStatus = 1;
    } elseif ($this->activeStatus === 'Inactive') {
        $this->activeStatus = 0;
    }

    // 应用筛选条件
    $query->andFilterWhere([
        // 其他条件...
        'activeStatus' => $this->activeStatus,
    ]);

    // 其他查询代码...

    return new ActiveDataProvider([
        'query' => $query,
        // 分页排序配置...
    ]);
}

这样配置之后,用户既可以通过下拉框选择Active/Inactive来筛选,也可以手动输入这两个文本(不过下拉框已经更直观啦),系统会自动把文本转换成对应的数据库数值进行精准筛选,完美匹配你原来的状态显示逻辑~

内容的提问来源于stack exchange,提问作者Dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:14:40