[yii2小心肝儿]GridView-睡衣篇 [ 技术分享 ]
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']
]);?>
两行搞定,看看结果
( ̄. ̄)( ̄. ̄)( ̄. ̄)( ̄. ̄)( ̄. ̄)( ̄. ̄)
第二条客户要去掉"Showing 1-2 of 4 items."
我知道GridView提供了一个layout布局属性,可以用这个满足客户的需求,先啰嗦几句,我们知道GridView渲染到浏览器后有3部分
- 一个表格,承载控制器传来的数据
- 一个分页,在表格下放
- 一个简介,类似于Showing 1-2 of 4 items.这样
类似于上图这样,而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}"
]);?>
刷新浏览器
太酷了,轻松搞定,去休息下~
最近北哥在看一本书叫做《把时间当做朋友》李笑来著,讲心智的力量,推荐大家读读。
10分钟后,我回到了MAC前继续我的工作。现在要处理的是当无数据时表格也消失的问题。
我不得不为yii2点个赞,太多细节点ta都想到了,showOnEmpty贴心小属性正式露脸。 通过设置showOnEmpty的true/false可以决定当数据不存在的时候,表格是否出现,默认为真(显示)。
修改前无数据时:
现在开始改代码(增加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
]);?>
看看修改后的结果
真的没了,用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
]);?>
刷新浏览器看结果
方便的不要不要的~( ̄▽ ̄)~( ̄▽ ̄)~,至于其他几个属性,大家可以替换试试,真心很方便。
不说了,快下班了~赶紧拿给客户看~
看着客户(郑讯)诡异的眼神和贱贱的表情,我内心如滔滔江水~~~,管他那,我是下班了,等到 GridView-底裤篇在和你继续折腾吧。
原文谅解:http://www.maomaonv.com/question-view.html?id=10 小心肝儿系列Github开源书:https://github.com/abei2017/small-yii2 欢迎帮忙点星星
共 7 条回复
-
HatakeKakashi 回复于 2017-02-24 10:09 举报
你好大神,我在gridview在动作列yii\grid\ActionColumn下新建了几个自定义按钮,目前这些按钮都默认绑定了一个action,操作结束并不能返回提示,我的问题是如何让这些自定义按钮实现ajax操作,我好接收返回的json来给前台给出提示。
共 12 条回复HatakeKakashi 回复于 2017-02-24 11:36 回复@abei1982
'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方法就提示找不到这个方法。HatakeKakashi 回复于 2017-02-24 11:44 回复@abei1982 其实我的问题现在比较清晰了,也很弱智,就是你的方法中的jquery绑定,我现在是绑定不了
方法1
可以绑定,我给你贴个代码'class' => 'btn btn-primary btn-xs',然后写一个
$('.btn-xs').click(function(){ var url = "你的url"; $.getJSON(url,{},function(d){ //返回后的逻辑 }); });
方法2 F12,看看控制台错误。
HatakeKakashi 回复于 2017-02-24 11:56 回复@abei1982
你提到的这种方法的确可以实现,我试过了
我写的这种就绑定不到了
//a标签的 'onclick' => 'test('.$model->id.');'
function test(id) {alert("操作id:" + id);
}
@HatakeKakashi
控制台没报错么,或是检查下函数生命和函数调用的先后位置。HatakeKakashi 回复于 2017-02-24 12:09 回复@abei1982
我的问题解决了,用的你的方法,能传参进来了,多谢你一直回复我,再次感谢大神!HatakeKakashi 回复于 2017-02-24 12:11 回复@abei1982
控制台提示 test()方法未定义 我换成点击$("#test").on()来实现了@HatakeKakashi 客气了,我要不要做个广告?可以关注我的公众号,每天有yii2文章分享。
HatakeKakashi 回复于 2017-02-24 13:40 回复@abei1982
那必须得关注一下!哈哈哈@HatakeKakashi 太给面儿了,tks
-
hero_world 回复于 2017-03-21 16:49 举报
北哥,
单选框不成功啊,怎么回事?
共 1 条回复你yii版本是?这个是 2.0.11引入的。http://www.yiiframework.com/doc-2.0/yii-grid-radiobuttoncolumn.html
abei1982 河南洛阳
最后登录:2020-04-14
在线时长:128小时48分
- 粉丝307
- 金钱4935
- 威望50
- 积分6715