欢迎访问宙启技术站
智能推送

怎么在yii2中使用gridView在下拉列表中筛选数据

发布时间:2023-05-14 01:05:22

在Yii2中,我们可以使用GridView来显示和进行数据的筛选操作。GridView可以在表格中显示数据,并提供了许多有用的筛选选项,如文本输入,下拉列表,日期选择器等。

在下拉列表中筛选数据是一种常见需求,这里有一个简单的示例来演示如何在GridView中使用下拉列表筛选数据。

首先,我们需要一个包含数据的模型类,假设我们有一个名为"Product"的模型类,其中包含产品名称(name)和产品状态(status)两个属性。我们可以使用Gii生成基本的ActiveRecord类和CRUD操作代码。

然后,我们需要在控制器中为GridView提供数据。我们可以使用ActiveDataProvider将模型数据包装在一个数据提供程序中,然后将其传递给GridView。

use yii\data\ActiveDataProvider;
use app\models\Product;

public function actionIndex()
{
    $dataProvider = new ActiveDataProvider([
        'query' => Product::find(),
    ]);

    return $this->render('index', [
        'dataProvider' => $dataProvider,
    ]);
}

在视图文件中,我们可以使用GridView来显示数据和筛选选项。下面是一个简单的GridView代码示例:

use yii\grid\GridView;
use yii\helpers\Html;

echo GridView::widget([
    'dataProvider' => $dataProvider,
    'columns' => [
        'id',
        'name',
        'status',
    ],
]);

我们可以看到,GridView默认显示了一个包含"ID","Name"和"Status"列的表格。但是,我们需要添加一个下拉列表来筛选产品状态。

要添加一个下拉列表,我们需要使用GridView的filterModel属性。该属性接受一个包含筛选条件的模型类,该类可以通过ActiveRecord生成。这种模型类通常称为“搜索模型”。

首先,我们需要创建一个包含状态属性的搜索模型:

namespace app\models;

use yii\base\Model;

class ProductSearch extends Product
{
    public function rules()
    {
        return [
            [['status'], 'integer'],
        ];
    }

    public function attributeLabels()
    {
        return [
            'status' => 'Product Status',
        ];
    }
}

在这个ProductSearch类中,我们继承了Product类,然后添加了一个名为"status"的属性和相应的rules()和attributeLabels()方法。这些规则是用于验证状态属性的,attributeLabels()方法用于显示标签名称。

接下来,我们修改原有的控制器:

use app\models\ProductSearch;

public function actionIndex()
{
    $searchModel = new ProductSearch();
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

    return $this->render('index', [
        'searchModel' => $searchModel,
        'dataProvider' => $dataProvider,
    ]);
}

在这里,我们创建了一个ProductSearch实例,并将查询参数传递给search()方法。search()方法返回一个ActiveDataProvider实例,该实例包含与查询参数匹配的数据。

然后,我们在视图文件中更新GridView代码,以添加一个下拉列表筛选器:

use yii\grid\GridView;
use yii\helpers\Html;
use app\models\ProductSearch;

echo GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [
        'id',
        'name',
        [
            'attribute' => 'status',
            'value' => function($model) {
                return $model->status === 1 ? 'Active' : 'Inactive';
            },
            'filter' => Html::activeDropDownList($searchModel, 'status', [1 => 'Active', 0 => 'Inactive'], ['class' => 'form-control', 'prompt' => 'Filter by Status']),
        ],
    ],
]);

在这里,我们添加了一个包含状态属性的搜索模型作为filterModel。然后,我们在状态列中使用了attribute属性来指定状态列和filter属性来添加下拉列表筛选器。

Html::activeDropDownList方法被用于生成下拉列表动态筛选器,其中ProductSearch的status属性被用作筛选条件。筛选器选项是一个数组,键是状态值,值是标签名。最后一个参数是HTML属性,可以用于样式自定义。

value属性用于将状态值转换为易于阅读的字符串,这里使用一个简单的三元表达式将1转换为“Active”,0转换为“Inactive”。

现在,当我们在下拉列表中选择一个状态,GridView将只显示该状态的产品。

总之,筛选可以使数据的处理更加高效和准确,而在Yii2中使用GridView内置组件,我们可以轻而易举地实现各种类型的筛选,包括文本,下拉列表和日期选择器等。在实践中,我们可以根据应用程序的需要自由选择不同的筛选方式。