Yii2 ArrayDataProvider 使用以及实现搜索

技巧库 · forecho · 于 6年前 发布 · 13831 次阅读

Yii 的 Grid 是一个非常强大的小部件,那么有时候我们的数据是一个数组,但是视图也想使用 Grid 怎么办呢?

其实官方有提供 ArrayDataProvider 让我们实现此功能,使用很简单。

如果你不需要搜索功能,可以直接在控制器中这样写:

$resultData = [
    ["id"=>1,"name"=>"Cyrus","email"=>"risus@consequatdolorvitae.org"],
    ["id"=>2,"name"=>"Justin","email"=>"ac.facilisis.facilisis@at.ca"],
    ["id"=>3,"name"=>"Mason","email"=>"in.cursus.et@arcuacorci.ca"],
    ["id"=>4,"name"=>"Fulton","email"=>"a@faucibusorciluctus.edu"]
];

$dataProvider = new ArrayDataProvider([
    'key'=>'id',
    'allModels' => $resultData,
    'pagination' => false, // 可选 不分页
    'sort' => [
        'attributes' => ['id', 'name', 'email'],
    ],
]); 

但是如果想实现 Gii 默认生成的 Grid 效果的话,会稍微有点麻烦,但是也很容易,无非就是写点代码:

你需要新建一个 SearchModel,里面要包含

<?php

namespace common\models\search;

use Yii;
use yii\base\Model;

class UserSearchModel extends Model
{
    public $id;
    public $name;
    public $email;

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['id'], 'integer'],
            [['name', 'email'], 'safe'],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'name' => 'Name',
            'email' => 'Email',
        ];
    }

     /**
     * @param $params
     * @return ArrayDataProvider
     */
    public function search($params)
    {
        $items = [
            ["id"=>1,"name"=>"Cyrus","email"=>"risus@consequatdolorvitae.org"],
            ["id"=>2,"name"=>"Justin","email"=>"ac.facilisis.facilisis@at.ca"],
            ["id"=>3,"name"=>"Mason","email"=>"in.cursus.et@arcuacorci.ca"],
            ["id"=>4,"name"=>"Fulton","email"=>"a@faucibusorciluctus.edu"]
        ];

        if ($this->load($params)) {
            $name = strtolower(trim($this->name));
            $items = array_filter($items, function ($role) use ($name) {
                return (empty($name) || strpos((strtolower(is_object($role) ? $role->name : $role['name'])), $name) !== false);
            });
        }

        $dataProvider = new ArrayDataProvider([
            'key'=>'id',
            'allModels' => $items,
            'pagination' => false, // 可选 不分页
            'sort' => [
                'attributes' => ['id', 'name', 'email'],
            ],
        ]);
    }
}

控制器这样使用:

public function actionIndex()
{
    $searchModel = new UserSearchModel();

    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

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

视图部分该怎么用就怎么用,我就省略掉了。

本文由 forecho 创作,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。


如果这篇文章对您有帮助,不妨微信小额赞助我一下,让我有动力继续写出高质量的教程。

本帖已被设为精华帖!
共收到 1 条回复 Widgets Grid
没有找到数据。
添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册