Heim  >  Artikel  >  php教程  >  Yii2的相关学习记录,Gridview小部件使用及kartik-v/yii2-grid扩展(五),yii2gridview

Yii2的相关学习记录,Gridview小部件使用及kartik-v/yii2-grid扩展(五),yii2gridview

WBOY
WBOYOriginal
2016-06-13 08:42:241331Durchsuche

Yii2的相关学习记录,Gridview小部件使用及kartik-v/yii2-grid扩展(五),yii2gridview

现在记录下Gridview的相关内容,也是强迫症犯了,Yii2自带的Gridview虽然不错,但是过滤栏如果一些字段用不着,不会自动合并成一行,当然也可以过滤栏不用,而是在最上方自己写一些需要检索的数据,但是这样很麻烦,还要自己去规划样式,写检索什么的。正好在搜索将检索栏和标题合并时,看到了kartik-v/yii2-grid可以实现这些功能,而且还自带导出excel、csv等数据,所以也顺便试了下它的功能,调出了自己喜欢的样式。在用kartik-v的Gridview之前我们还是要了解Yii2自带的Gridview的功能的,大体常用的一些方法如下:

1、Yii默认有四种样式的列,分别为Data column(默认)、Action column(操作)、Checkbox column(可选中)、Serial column(带序列号)

2、标题名字会根据Model中的attributeLabels()方法,来自动替换成对应的中文。当然也可以通过‘label’来自己定义,而‘attribute’则是指定根据哪个字段排序。其它的像是'visible'来隐藏显示,'header'显示头部内容,'headerOptions'来定义css或style样式等等。

<span>[
    </span>'label'=>'你想要的名称',
    'attribute'=>'id',<span>//</span><span>可以排序的字段</span>
<span>]
</span>

3、自定义显示页数和排序字段,如果用到了searchModel,则需要在searchModel的search方法中定义,否则,需要在Controller中定义:

<span>$dataProvider</span> = <span>new</span><span> ActiveDataProvider([
    </span>'query' => <span>$query</span>,
    'pagination' =><span> [
        </span>'pageSize' => 15,<span>//</span><span>如果不定义,默认为20</span>
    ],
    'sort' => ['attributes' => ['id']],<span>//</span><span>如果定义,则只能按照id来排序,否则所有字段都可以</span>
]);

4、下拉菜单检索,好比根据下拉菜单检索用户状态,则需要先在model中定义相关的方法,然后在Gridview中再做处理:

<span>//</span><span>Model中,定义一个静态方法</span>
<span>const</span> STATUS_DELETED = 0<span>;
</span><span>const</span> STATUS_ACTIVE = 10<span>;
</span><span>public</span> <span>static</span> <span>function</span> getZhStatus(<span>$status</span>=<span>false</span><span>){
    </span><span>$status_array</span>=<span> [
        </span>''=>'请选择',<span>
        self</span>::STATUS_DELETED=>'禁止',<span>
        self</span>::STATUS_ACTIVE=>'正常'<span>
    ];
    </span><span>return</span> <span>$status</span>==<span>false</span>?<span>$status_array</span>:ArrayHelper::getValue(<span>$status_array</span>,<span>$status</span>,'未知'<span>);
} 
</span><span>//</span><span>Gridview中</span>
<span>[ 
    </span>'attribute' => 'status',
    'filter'=>Html::activeDropDownList(<span>$searchModel</span>,'status',User::getZhStatus(),['class' => 'form-control ']),
    'value'=><span>function</span>(<span>$data</span><span>){
        </span><span>return</span> User::getZhStatus(<span>$data</span>-><span>status);
    }</span>,<span>
]</span>,   

5、格式化时间,有好几种方法:

方法一:类似上面的定义回调函数

<span>[
    </span>'attribute'=>'created_at',
    'value'=><span>function</span>(<span>$data</span><span>){
        </span><span>return</span> <span>date</span>('Y-m-d',<span>$data</span>-><span>created_at);   
   }</span>,<span>
]</span>

方法二:用Gridview自带的format配置

<span>[
    </span>'attribute'=>'created_at',
    'format'=>['date','php:Y-m-d'],
    'value'=>'created_at',<span>
]</span>,

方法三:首先在config中配置好你的时间格式,否则会是英文格式的,然后再在Gridview中处理。

<span>//</span><span>在common/config/main.php中定义自己的时间、金钱等的格式</span>
'components' =><span> [
    </span>'formatter' =><span> [
        </span>'dateFormat' => 'yyyy-MM-dd',
        'datetimeFormat' => 'yyyy-MM-dd HH:mm:ss',
        'decimalSeparator' => ',',
        'thousandSeparator' => ' ',
        'currencyCode' => 'CNY',<span>
    ]</span>,<span>
]</span>,

这里用到了快速写的一种方式:“attribute:format:label”(属性:格式:标签)这种格式,详情点击这里的api文档。所以我们这样就可以了:(如果定义了上方,则方法二可以直接'format'=>'date'即可以正确显示)

'created_at:date',

6、显示超链接或图片,都是用的回调函数的方法,这里以超链接为例,注意format需要为'raw’,不对结果做任何格式化处理,具体的格式化方面可以点这里看看。

<span>[ 
    </span>'attribute'=>'id',
    'value'=><span>function</span>(<span>$model</span>, <span>$key</span>, <span>$index</span>, <span>$column</span><span>){
        </span><span>return</span> Html::a(<span>$model</span>->id,['user/view','id'=><span>$model</span>->id],['class' => 'profile-link','target'=>'_blank'<span>]);
    }</span>,
    'format' => 'raw',<span>
]</span>,

7、关联表单显示,这个地方直接看指南吧,点这里看,总之就是如果管理表单设置好后,直接用类似order.name这种就可以直接显示使用,如果想要检索排序,则需要在searchModel的rulers规则方法和attributes属性方法中将此字段写入,在search方法中添加andFilterWhere的检索,以及用$query->joinWith关联字段,$dataProvider->sort->attributes[]添加排序等。

8、自定义Action Column按钮,

<span>[
    </span>'class' => 'yii\grid\ActionColumn',
    'header'=>'操作',
    'headerOptions'=>['width'=>'120'],
    'template' => '{view} {update} {delete} {forbid} ',
    'buttons'=><span>[
        </span>'forbid'=><span>function</span>(<span>$url</span>,<span>$model</span><span>){
            </span><span>return</span> Html::<span>a('<i class="glyphicon glyphicon-remove-circle"></i>',['user/forbid','id'=>$model->id]);     
        }
    ]</span>,<span>
]</span>

 以上是Yii2自带的Gridview的用法。再说下kartik-v/yii2-grid,官方文档及demo讲的比较全了,它比原生的多了几个列的形式,例如Editable Column(可编辑)、Radio Column(单选框)等,还多了一些其它功能,例如滚动时可以固定标题栏方便查看、可以总计、导出svn,excel等格式。这里稍微说下:

一开始安装完成后可能会报错pdf错误,因为这些关联的还没有安装,可以按照提示安装也可以先配置'export'=>false来取消导出功能,下面导出时会详细配置。

1、整体结构如下图:

2、上图中各个部分非常灵活的显示或隐藏,例如我不想要header,但是还想显示共多少页这个summary,可以将其放在before中,可以如下设置:

'panel' =><span> [
    </span>'heading'=><span>false</span>,<span>//</span><span>不要了</span>
    'before'=>'<div>//</span><span>放在before中,前面的div主要是想让它好看</span>
],

当然上面的需求我们也可以直接用panelHeadingTemplate和panelBeforeTemplate来重新组装,具体可以查看Layout Templates小章节

3、一些有用的小设置

'responsive'=><span>true</span>,<span>//</span><span>自适应,默认为true</span>
'hover'=><span>true</span>,<span>//</span><span>鼠标移动上去时,颜色变色,默认为false</span>
'floatHeader'=><span>true</span>,<span>//</span><span>向下滚动时,标题栏可以fixed,默认为false</span>
'showPageSummary'=><span>true</span>,<span>//</span><span>显示统计栏,默认为false
//column中的一些设置</span>
'columns' =><span> [
    [
        </span>'class' => '\kartik\grid\CheckboxColumn',
        'rowSelectedClass' => GridView::TYPE_INFO,
        'visible'=><span>true</span>,<span>//</span><span>不显示,代码也没有</span>
        'hidden'=><span>true</span>,<span>//</span><span>隐藏,代码还有,导出csv等时还存在</span>
        'hiddenFromExport'=><span>true</span>,<span>//</span><span>虽然显示,但导出csv时忽略掉</span>
        'pageSummary'=>'总计',<span>//</span><span>可以是字符串,当为true时,自动合计</span>
        'mergeHeader'=><span>true</span>,<span>//</span><span>合并标题和检索栏</span>
    ],<span>
]</span>

 4、{toggleData}设置,主要是用来显示分页还是全部数据显示

'toggleDataOptions'=><span>[
    </span>'maxCount' => 200,<span>//</span><span>当超过200条时,此按钮隐藏,以免数据太多造成加载问题
    // 'minCount' => 10,//当超过10条,点击时才会下面的提示</span>
    'confirmMsg' => '总共'. <span>number_format</span>(<span>$dataProvider</span>->getTotalCount()).'条数据,确定要显示全部?',<span>//</span><span>点击时的确认</span>
],

 5、{export}设置,可导出excel,csv,pdf等各种类型的文件,下面为导出csv的格式,如果在exportConfig只配置了csv,则只显示导出csv,如果还想导出excel等格式,需要在exportConfig中添加。我在这里导出csv时,不管设置编码是gbk还是utf,用excel2013打开时都是中文乱码,而用sublime等编辑器打开则正常,(导出excel格式则正常),有知道此问题的朋友,麻烦留言指教。

'export'=><span>[
    </span>'fontAwesome'=>'fa fa-share-square-o',<span>//</span><span>图标</span>
    'target'=>'_blank',<span>//</span><span>在新标签打开</span>
    'encoding'=>'gbk',<span>//</span><span>编码</span>
],
'exportConfig' =><span> [
    GridView</span>::CSV =><span> [
        </span>'label' => '导出CSV',
        'iconOptions' => ['class' => 'text-primary'],
        'showHeader' => <span>true</span>,
        'showPageSummary' => <span>true</span>,
        'showFooter' => <span>true</span>,
        'showCaption' => <span>true</span>,
        'filename' => '用户表'.<span>date</span>("Y-m-d"),
        'alertMsg' => '确定要导出CSV格式文件?',
        'options' =><span> [
            </span>'title'=>'',<span>
        ]</span>,
        'mime' => 'application/csv',
        'config' =><span> [
            </span>'colDelimiter' => ",",
            'rowDelimiter' => "\r\n",<span>
        ]</span>,<span>
    ]</span>,<span>       
]</span>,       

 基本也就这么多,附上我自己还比较满意设置的样式截图:(kartik-v/yii2-grid的样式依赖于bootstrap,与adminlte的表格样式相冲突,尤其是在合并标题栏和检索栏时,合并的下方边框会变粗,试了好多设置让其全部都加粗都不行,最后只能妥协,修改kartik-v/yii2-grid的kv-merged-header的默认样式,加了这一段:$this->registerCss(".kv-merged-header{border-bottom:1px solid #eee !important}");,勉强看得过去。)

 本来还想继续写下美化alert,confirm等弹出框及自动关闭什么的扩展以及批量删除等的代码来着,但是kartik-v/yii2-dialog这个就是安装时不停出错。再找找有什么替代的到时候再补充吧。写这个途中火狐崩溃两次,重写了好大段内容,哭死!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn