资讯专栏INFORMATION COLUMN

[yii2小心肝儿]GridView - 大衣篇

skinner / 827人阅读

摘要:最终版编号生成时间用户名性别省市搞定,在运行程序,表头改成编号用户名生成时间等,不要英文这个问题搞定了。是代表对进行什么样的格式化,默认来对其处理。分钟后,我郁闷的回来了,知道这回客户提了那些乱七八糟的需求么且听下回分解睡衣篇

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22343.html

相关文章

  • Yii2使用GridView实现数据全选及批量删除按钮

    摘要:先来看看实现的效果关键代码设置显示最下面的设置每行数据的复选框属性删除设置删除按钮垮列显示其他列每个都要增加项,设置为,达到隐藏单元格的目的启用禁用管理操作获取选择的数据最后我们就可以提交到相应的控制器。 先来看看实现的效果 showImg(https://segmentfault.com/img/bVJIqC?w=658&h=279); 关键代码 获取选择的数据 var i...

    lykops 评论0 收藏0
  • Yii2实现跨mysql数据库关联查询排序功能

    摘要:于是就会报出这样一个错误要在两个数据库同一台服务器上进行关联数据查询,纯语句如下转化成语句时默认不会在表明前添加数据库名,于是在执行语句时就会默认此表在数据库下。默认是这样的只需要在表明前添加数据库名为了提高代码稳定性,可以这样写 背景:在一个mysql服务器上(注意:两个数据库必须在同一个mysql服务器上)有两个数据库: memory (存储常规数据表) 中有一个 use...

    lx1036 评论0 收藏0
  • Yii2实现跨mysql数据库关联查询排序功能

    摘要:于是就会报出这样一个错误要在两个数据库同一台服务器上进行关联数据查询,纯语句如下转化成语句时默认不会在表明前添加数据库名,于是在执行语句时就会默认此表在数据库下。默认是这样的只需要在表明前添加数据库名为了提高代码稳定性,可以这样写 背景:在一个mysql服务器上(注意:两个数据库必须在同一个mysql服务器上)有两个数据库: memory (存储常规数据表) 中有一个 use...

    netScorpion 评论0 收藏0
  • yii2 ActiveRecord多表关联以及多表关联搜索的实现

    摘要:今天把这个问题讲明白了,看看是怎么个多表关联以及如何去优化这个关联。现需要在列表展示表的来源渠道,且该渠道可搜索。关联表字段增加查询中的搜索模型也是通过实现的,该模型通过控制着哪个字段可搜索,哪个字段不可搜索。 作者:白狼 出处:http://www.manks.top/yii2_many_ar_relation_search.html 本文版权归作者,欢迎转载,但未经作者同意必须保留...

    venmos 评论0 收藏0
  • 就写SQL咋的了~在Yii2中使用SqlDataProvider的方法

    摘要:一般应用和需求的复杂程度,我们使用都可以搞定,除非我们实在无法通过来构造一个复杂的的时候,就是你的好伙伴了。和名字一样,接收一个原生的语句并且能生成一个带有参数的,并且前台的等都可以很好的使用它。 一般应用和需求的复杂程度,我们使用ActiveDataProvider都可以搞定,除非我们实在无法通过QueryBuilder来构造一个复杂的SQL的时候,SqlDataProvider就是...

    MarvinZhang 评论0 收藏0

发表评论

0条评论

skinner

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<