abei1982 2017-02-12 09:53:19 7201次浏览 7条回复 32 9 0

GridView-睡衣篇

书接上回,这节我们将扒掉GridView的睡衣,越来越少了~

上回我兴高采烈的拿着修改后的结果给客户看,结果客户看后露出了囧字脸,说了句:"小北啊,再改改吧"。

上回结果

这次客户说了这些话

  • 为何没有会员的时候显示"No results found.",应该显示"当前没有会员"啊,对对,字体是红色,加粗,必须加粗。
  • 为啥显示"Showing 1-2 of 4 items.",这些都去掉吧。
  • 啊对,为啥没有数据的时候表格还是显示,不要,整个表格消失,只是显示"当前没有会员"
  • 能不能每行加个选择,然后还有个全选,批量删除,那样多高大上~

回到自己的MAC前,烧根香,祝客户今天去厕所忘记带纸,开始改吧~

( ̄. ̄)( ̄. ̄)( ̄. ̄)( ̄. ̄)( ̄. ̄)( ̄. ̄)

第一条很好改,GridView提供了emptyText和emptyTextOptions两个字段可以实现,emptyText代表$dataProvider没有数据时候显示的信息,emptyTextOptions决定这个显示信息的Html属性,emptyTextOptions接受一个数组。

开始修改。

    <?= 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'
        ],
        'emptyText'=>'当前没有会员',
        'emptyTextOptions'=>['style'=>'color:red;font-weight:bold']
    ]);?>

两行搞定,看看结果

GridView2-01.png

( ̄. ̄)( ̄. ̄)( ̄. ̄)( ̄. ̄)( ̄. ̄)( ̄. ̄)

第二条客户要去掉"Showing 1-2 of 4 items."

GridView2-02.png

我知道GridView提供了一个layout布局属性,可以用这个满足客户的需求,先啰嗦几句,我们知道GridView渲染到浏览器后有3部分

  • 一个表格,承载控制器传来的数据
  • 一个分页,在表格下放
  • 一个简介,类似于Showing 1-2 of 4 items.这样

GridView2-03.png

类似于上图这样,而layout就是决定这些部分的摆放位置(堆积木),layout接收字符串,默认情况为。

    'layout' => "{summary}\n{items}\n{pager}"

如代码所示,GridView自上而下是简介,表格,分页。那么我们知道了,解决客户需求只需要重新布局layout,去掉{summary}即可。

    <?= 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'
        ],
        'emptyText'=>'当前没有会员',
        'emptyTextOptions'=>['style'=>'color:red;font-weight:bold'],
        'layout'=>"{items}\n{pager}"
    ]);?>

刷新浏览器

GridView2-04.png

太酷了,轻松搞定,去休息下~

最近北哥在看一本书叫做《把时间当做朋友》李笑来著,讲心智的力量,推荐大家读读。

10分钟后,我回到了MAC前继续我的工作。现在要处理的是当无数据时表格也消失的问题。

我不得不为yii2点个赞,太多细节点ta都想到了,showOnEmpty贴心小属性正式露脸。 通过设置showOnEmpty的true/false可以决定当数据不存在的时候,表格是否出现,默认为真(显示)。

修改前无数据时: GridView2-05.png

现在开始改代码(增加showOnEmpty为false)

    <?= 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'
        ],
        'emptyText'=>'当前没有会员',
        'emptyTextOptions'=>['style'=>'color:red;font-weight:bold'],
        'layout'=>"{items}\n{pager}",
        'showOnEmpty'=>false
    ]);?>

看看修改后的结果

GridView2-06.png

真的没了,用yii2,一起变得简单,和谐社会就是好~

( ̄. ̄)( ̄. ̄)( ̄. ̄)( ̄. ̄)( ̄. ̄)( ̄. ̄)

Last One,最后一条 能不能每行加个选择,然后还有个全选,批量删除,那样多高大上~,当然删除的具体功能是其他人的事情,我只解决全选问题,这里要多说一些话。 大家一定记得在大衣篇里,我们将GridView的columns接收一个数组,每个数组项代表一列,我们可以为列传递一个模型的属性值,也可以传递一个数组。

    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'columns' => [            
            [
                'attribute'=>'create_time',
                'format'=>['date', 'php:Y-m-d H:i:s']
            ],            
        ]
    ]);?>

类似于上面代码,其实对于每列的这个数组,ta是有类别的,我们默认使用其中的DataColumn,代表显示数据。DataColumn还有几个兄弟,分别是

  • ActionColumn 显示操作按钮等
  • CheckboxColumn 显示复选框
  • RadioButtonColumn 显示单选框
  • SerialColumn 显示行号

好,就用CheckboxColumn来解决,看全部代码

    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'columns' => [
            [
                'class'=>'yii\grid\CheckboxColumn'
            ],
            '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'
        ],
        'emptyText'=>'当前没有会员',
        'emptyTextOptions'=>['style'=>'color:red;font-weight:bold'],
        'layout'=>"{items}\n{pager}",
        'showOnEmpty'=>false
    ]);?>

刷新浏览器看结果 GridView2-07.png

方便的不要不要的~( ̄▽ ̄)~( ̄▽ ̄)~,至于其他几个属性,大家可以替换试试,真心很方便。

不说了,快下班了~赶紧拿给客户看~

看着客户(郑讯)诡异的眼神和贱贱的表情,我内心如滔滔江水~~~,管他那,我是下班了,等到 GridView-底裤篇在和你继续折腾吧。

原文谅解:http://www.maomaonv.com/question-view.html?id=10 小心肝儿系列Github开源书:https://github.com/abei2017/small-yii2 欢迎帮忙点星星

觉得很赞
  • 回复于 2017-02-12 14:01 举报

    马云跟马化腾不是同一个人么

    1 条回复
    回复于 2017-02-12 14:25 回复

    不是,是表兄弟。

    觉得很赞
  • 回复于 2017-02-12 14:54 举报

    'exptyText'=>['style'=>'color:red;font-weight:bold'],
    这是什么意思

    1 条回复
    回复于 2017-02-12 15:08 回复

    sorry,笔误,是exptyTextOptions这个字段。已经修正。

  • 回复于 2017-02-12 15:05 举报

    大致看完了,要是有全选删除的具体功能就好了,可以一起研究下

    1 条回复
    回复于 2017-02-12 15:10 回复

    删除功能我一般的方案是,在GridView外层包一个Form,然后在GridView下面加一个全删除按钮,点击后将Form 都ajax post给后台。

    觉得很赞
  • 回复于 2017-02-16 09:48 举报

    我又来收藏了。支持北哥。感谢你的分享。

    2 条回复
    回复于 2017-02-16 10:04 回复

    多谢支持,我的视频课程也即将发布,到时候记得捧场哦。

    回复于 2017-02-16 11:59 回复

    嗯。这些我都知道。再看一遍又学了点。如:exptyTextOptions 。。 期待下一篇。

  • 回复于 2017-02-24 10:09 举报

    你好大神,我在gridview在动作列yii\grid\ActionColumn下新建了几个自定义按钮,目前这些按钮都默认绑定了一个action,操作结束并不能返回提示,我的问题是如何让这些自定义按钮实现ajax操作,我好接收返回的json来给前台给出提示。

    12 条回复
    回复于 2017-02-24 10:24 回复

    我说我喜欢的方法,给每个按钮设置不懂的class和标识,比如data-xxx="" 然后jquery绑定,传到一个action里,在action通过对xxx的判断来具体编码,然后返回json::encode,不知道我是否明白你的意思了?

    回复于 2017-02-24 10:25 回复

    如果我没理解,你可以贴代码过来。

    回复于 2017-02-24 11:36 回复


    'test' => function($url, $model, $key){

    return Html::a('<i class="fa fa-ban"></i> 测试按钮',
    				"javascript:;",
    				[
                	    //'id' => 'test',
    					'class' => 'btn btn-primary btn-xs',
    					"onclick" => "alert('操作id:".$model->id."')",
    				]
    			);
    

    },

    现在是这么写的,思路是a标签的onclick来绑定js文件中的ajax函数,让ajax的url设定为需要执行的action,通过success和error函数来给出提示。应该就是你的思路了。
    现在的问题是Html::a的onclick中我只能直接写js代码(如贴出来的代码),我要是换成js方法就提示找不到这个方法。

    回复于 2017-02-24 11:44 回复

    其实我的问题现在比较清晰了,也很弱智,就是你的方法中的jquery绑定,我现在是绑定不了

    回复于 2017-02-24 11:45 回复

    方法1

    可以绑定,我给你贴个代码'class' => 'btn btn-primary btn-xs',然后写一个

    $('.btn-xs').click(function(){
        var url = "你的url";
       $.getJSON(url,{},function(d){
           //返回后的逻辑
        });     
    });
    

    方法2 F12,看看控制台错误。

    回复于 2017-02-24 11:56 回复


    你提到的这种方法的确可以实现,我试过了
    我写的这种就绑定不到了
    //a标签的 'onclick' => 'test('.$model->id.');'
    function test(id) {

    alert("操作id:" + id);
    

    }

    回复于 2017-02-24 12:03 回复


    控制台没报错么,或是检查下函数生命和函数调用的先后位置。

    回复于 2017-02-24 12:09 回复


    我的问题解决了,用的你的方法,能传参进来了,多谢你一直回复我,再次感谢大神!

    回复于 2017-02-24 12:11 回复


    控制台提示 test()方法未定义 我换成点击$("#test").on()来实现了

    回复于 2017-02-24 12:27 回复

    客气了,我要不要做个广告?可以关注我的公众号,每天有yii2文章分享。

    qrcode.jpg

    回复于 2017-02-24 13:40 回复


    那必须得关注一下!哈哈哈

    回复于 2017-02-24 13:45 回复

    太给面儿了,tks

  • 回复于 2017-03-21 16:49 举报

    北哥,QQ截图20170321164851.png

    单选框不成功啊,怎么回事?

    1 条回复
    回复于 2017-03-21 17:41 回复

    你yii版本是?这个是 2.0.11引入的。http://www.yiiframework.com/doc-2.0/yii-grid-radiobuttoncolumn.html

  • 回复于 2017-05-17 16:36 举报

    北哥视频出来了吗

    1 条回复
    回复于 2017-05-17 18:48 回复

    我的小站 nai8.me

    觉得很赞
您需要登录后才可以回复。登录 | 立即注册