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 中国大陆许可协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。
如果这篇文章对您有帮助,不妨微信小额赞助我一下,让我有动力继续写出高质量的教程。