增删改查,数据库操作的四大法宝中最常用的就是查了,一条记录、几条记录、一大堆记录。对于yii2而言,尤其后台,GridView是最常用且好用的数据列表部件,今天就说一说。
yiigridGridView;
GridView将结果集显示为表格(table),我们从一个项目开始开始。
一天客户老郑(郑讯)来到这里,说要我做一个页面,将所有的会员分页显示在列表里,每页10条数据,并且能按照表头排序。
好吧~
我查询了数据库的user表
id | username | password | create_time | sex | province | city |
---|---|---|---|---|---|---|
1 | abei | dWRvDOMGjvGQZMGlxFR2xfhsfGpzu8Rx | 1479876598 | 1 | 北京 | 北京 |
2 | 郑讯 | dWRvDOMGjvGQZMGlxFR2xfhsfGpzu8Rx | 1479876698 | 0 | 黑龙江 | 哈尔滨 |
11 | 马化腾 | dWRvDOMGjvGQZMGlxFR2xfhsfGpzu8Rx | 1479877598 | 1 | 黑龙江 | 齐齐哈尔 |
19 | 马云 | dWRvDOMGjvGQZMGlxFR2xfhsfGpzu8Rx | 1479886598 | 1 | 黑龙江 | 嫩江 |
然后我决定使用GridView来显示这些数据,这样分页、排序都直接搞定了,我知道需要两步
第一步是在控制器UserController.php里获得结果集
public function actionIndex(){
$query = User::find();
$dataProvider = new ActiveDataProvider([
'query'=>$query,
'pagination'=>[
'pagesize'=>10
]
]);
return $this->render('index',[
'dataProvider'=>$dataProvider
]);
}
第二部渲染视图
index.php
use yii\grid\GridView;
<?= GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'id',
'username',
'create_time',
'sex',
'province',
'city'
]
]);?>
完活了,聪明的GridView会搞定一切,我只需要将$dataProvider传递给ta,并且告诉他都要显示User模型(user表)的那些属性,放到columns数组中即可。
就这样,表格出来了,且每个表都都能排序,客户的需求达到了。
30分钟后我拿给郑讯看,见他默默无语,说了几句话。
表头改成编号、用户名、生成时间等,不要英文。
会员生成时间我看不懂,改成年月日十分秒吧
性别改成男or女
省市两列合并,像province-city这样
恩,客户是上帝,改改吧~,主要是我知道:"这个其实很简单,GridView都能轻松搞定"
对于表头的显示,GridView是根据User模型的attributeLabels函数来决定的,现在就改
User.php
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'create_time' => 'Create Time',
'username'=>'Username',
'password'=>'Password',
'sex'=>'Sex',
];
}
现在就改,60秒过去了
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => '编号',
'create_time' => '生成时间',
'username'=>'用户名',
'password'=>'Password',
'sex'=>'性别',
];
}
但是,我发现省市怎么没有,哦,想起来了,province和city是我后来添加到数据表的,并没有更新User模型,那我直接加上就可以了。
最终版
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => '编号',
'create_time' => '生成时间',
'username'=>'用户名',
'password'=>'Password',
'sex'=>'性别',
'province'=>'省',
'city'=>'市'
];
}
???搞定,在运行程序,"表头改成编号、用户名、生成时间等,不要英文"这个问题搞定了。
继续把,现在要处理"会员生成时间我看不懂,改成年月日十分秒吧"这个问题,它也很简单,因为我知道除了向GridView的 columns传递每个属性名字外,我们还能传递一个自定义的数组,格式化数据、逻辑处理,啥都能干出来,相当禽兽。
开始改视图index.php,我只花了10秒钟
index.php
use yii\grid\GridView;
<?= GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'id',
'username',
[
'attribute'=>'create_time',
'format'=>['date', 'php:Y-m-d H:i:s']
],
'sex',
'province',
'city'
]
]);?>
'attribute'=>'create_time'
attribute要填写,代表你在操作那个属性,且在这里排序也是根据他来的。
format是代表对create_time进行什么样的格式化,默认yiii18nFormatter 来对其处理。
刷新浏览器
又一个山头给我们攻克了。
这里要提一下,[]的功能很强大,上面的实现也可以根据以下代码来实现
index.php
use yii\grid\GridView;
<?= GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'id',
'username',
[
'attribute'=>'create_time',
'value'=>function($data){
return date('Y-m-d H:i:s',$data->create_time);
}
],
'sex',
'province',
'city'
]
]);?>
"性别改成男女",不多言,直接代码
index.php
use yii\grid\GridView;
<?= GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'id',
'username',
[
'attribute'=>'create_time',
'format'=>['date', 'php:Y-m-d H:i:s']
],
[
'attribute'=>'sex',
'value'=>function($data){
return $data->sex == 1 ? '男' : '女';
}
],
'province',
'city'
]
]);?>
刷新浏览器
value是一个很好的属性,当你不知道有没有提供内置命令的时候,都可以使用value去用自己的思路实现需求。
还有最后一个,"省市两列合并,像province-city这样",胜利就在前方,我想你已经有了思路。
只需要改一点
[
'attribute'=>'province',
'value'=>function($data){
return $data->province."-".$data->city;
}
]
是的,你的思路是对的。但是发现一个问题,表头显示"省",ta应该显示"省市"才对,不要紧,我们热烈欢迎label属性出场。
[
'label'=>'省市',
'attribute'=>'province',
'value'=>function($data){
return $data->province."-".$data->city;
}
]
最后我看了下。
不错不错,喝杯茶,一会去给客户看。
10分钟后,我郁闷的回来了,知道这回客户提了那些乱七八糟的需求么?且听下回分解《GridView - 睡衣篇》
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。