4

增删改查,数据库操作的四大法宝中最常用的就是查了,一条记录、几条记录、一大堆记录。对于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 - 睡衣篇》


阿北
4.1k 声望913 粉丝