Yii框架扩展CGridView增加导出CSV功能的方法


Posted in PHP onMay 24, 2017

本文实例讲述了Yii框架扩展CGridView增加导出CSV功能的方法。分享给大家供大家参考,具体如下:

Yii提供的CGridView组件没有内置数据导出功能,不过我们可以通过扩展该组件来添加该功能。

具体方法如下:

1、首先派生一个子类,添加一个action成员,在该视图的init函数中判断是浏览动作还是数据导出动作,如果是浏览动作者则保持默认行为,否则输出csv文件。

public function init()
{
  if($this->action == 'export')
  {
    parent::init();
    $this->genCsv();
  }
  else
  {
    parent::init();
  }
}

2、处理csv文件的输出:

protected function genCsv()
{
  header("Content-Type: text/csv; charset=GB2312");
  header('Content-Disposition: attachment; filename="'.$this->fileName.'"');
  //add your content dump codes here
  flush();
}

3、然后在表格控件界面上添加一个csv导出按钮

覆盖其renderItems()方法如下:

public function renderItems()
{
  if(Yii::app()->user->checkAccess('administrator'))
  {
    echo '<div class="toolBar">';
    echo '<form action="'.CHtml::normalizeUrl(array($this->action)).'&id='.$this->id.'" method="post">';
    foreach($this->getController()->getActionParams() as $name => $value)
    {
      echo '<input type="hidden" name="'.addcslashes($name,'"').'" value="'.addcslashes($value,'"').'" />';
    }
    echo '<input type="image" title="'.Yii::t('ifCMS','Export to CSV').'" src="'.Yii::app()->theme->BaseUrl.'/images/ico-csv.png" alt="Submit">';
    echo '</form>';
    echo '</div>';
  }
  parent::renderItems();
}

4、然后在点击CSV的动作处理比如actionCsv()中render单个表格视图,模板如下

<?php
  $this->widget('application.extensions.grid.MyGridView', array(
  'id'=>'grid',
  'action'=>'export',
  'dataProvider'=>$dp,
  'columns'=>array(
    array(
      'header'=>Yii::t('Statistics','Phone'),
      'name'=>'phone',
    ),
    array(
      'header'=>Yii::t('Statistics','Count'),
      'name'=>'count',
    ),
  )
));?>

注意上述第2步csv输出函数中的header设置语句之前不要有任何的输出,包括如下函数:

print, echo, printf, trigger_error, vprintf, ob_flush, var_dump, readfile, passthru

否则内容只会在浏览器中输出,但不会出现文件下载。

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP类中Static方法效率测试代码
Oct 17 PHP
PHP编码规范的深入探讨
Jun 06 PHP
PHP写的资源下载防盗链类分享
May 12 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
Sep 30 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
Mar 22 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
Jan 12 PHP
如何用PHP做到页面注册审核
Mar 02 PHP
php 根据自增id创建唯一编号类
Apr 06 PHP
PHP获取二叉树镜像的方法
Jan 17 PHP
Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
Feb 13 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
Jun 03 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
Aug 03 PHP
[原创]php正则删除html代码中class样式属性的方法
May 24 #PHP
PHP 年月日的三级联动实例代码
May 24 #PHP
php验证码生成器
May 24 #PHP
php批量修改表结构实例
May 24 #PHP
php 人员权限管理(RBAC)实例(推荐)
May 24 #PHP
老生常谈PHP面向对象之命令模式(必看篇)
May 24 #PHP
php实现查询功能(数据访问)
May 23 #PHP
You might like
php 异常处理实现代码
2009/03/10 PHP
php生成的html meta和link标记在body标签里 顶部有个空行
2010/05/18 PHP
php设计模式 Strategy(策略模式)
2011/06/26 PHP
让Firefox支持event对象实现代码
2009/11/07 Javascript
ExtJs的Date格式字符代码
2010/12/30 Javascript
javascript淡入淡出效果的实现思路
2012/03/31 Javascript
基于mootools插件实现遮罩层新手引导
2012/05/24 Javascript
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
2014/10/16 Javascript
JS基于clipBoard.js插件实现剪切、复制、粘贴
2016/05/03 Javascript
jQuery鼠标移动图片上实现放大效果
2017/06/25 jQuery
详解Vue路由History mode模式中页面无法渲染的原因及解决
2017/09/28 Javascript
AngularJS下$http服务Post方法传递json参数的实例
2018/03/29 Javascript
vue安装和使用scss及sass与scss的区别详解
2018/10/15 Javascript
移动端手指操控左右滑动的菜单
2019/09/08 Javascript
[02:27]刀塔重生降临
2015/10/14 DOTA
[01:04:22]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 IG vs EG
2018/04/01 DOTA
[39:18]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第二场 12.17
2020/12/19 DOTA
python读取注册表中值的方法
2013/04/08 Python
python如何实现反向迭代
2018/03/20 Python
python实现逐个读取txt字符并修改
2018/12/24 Python
python爬虫开发之selenium模块详细使用方法与实例全解
2020/03/09 Python
华为旗下电子商务平台:华为商城
2016/08/06 全球购物
佳能加拿大网上商店:Canon eStore Canada
2018/04/04 全球购物
美国现代家具网站:Design Within Reach
2018/07/19 全球购物
手工制作的意大利皮革运动鞋:KOIO
2020/01/05 全球购物
统计员岗位职责
2013/11/14 职场文书
公司收款委托书范本
2014/09/20 职场文书
统计工作个人总结
2015/03/03 职场文书
2015年度班主任自我评价
2015/03/11 职场文书
简单的辞职信模板
2015/05/12 职场文书
优秀班干部主要事迹材料
2015/11/04 职场文书
2016计算机专业毕业生自荐信
2016/01/28 职场文书
聊聊golang中多个defer的执行顺序
2021/05/08 Golang
MySQL 全文索引使用指南
2021/05/25 MySQL
5行Python代码实现一键批量扣图
2021/06/29 Python
十大最强火系宝可梦,喷火龙上榜,第一名有双火属性
2022/03/18 日漫