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 采集心得技巧
May 15 PHP
PHP 作用域解析运算符(::)
Jul 27 PHP
php+MySQL判断update语句是否执行成功的方法
Aug 28 PHP
PHP+iFrame实现页面无需刷新的异步文件上传
Sep 16 PHP
PHP中的命名空间相关概念浅析
Jan 22 PHP
php禁止某ip或ip地址段访问的方法
Feb 25 PHP
详解 PHP加密解密字符串函数附源码下载
Dec 18 PHP
PHP实现的浏览器检查类
Apr 11 PHP
老生常谈PHP 文件写入和读取(必看篇)
May 22 PHP
PHP实现的XXTEA加密解密算法示例
Aug 28 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
Aug 14 PHP
php设计模式之观察者模式定义与用法经典示例
Sep 19 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查询分页的实现代码
2017/06/09 PHP
Laravel访问出错提示:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or di解决方法
2019/04/02 PHP
php设计模式之适配器模式原理、用法及注意事项详解
2019/09/24 PHP
PHP实现抽奖功能实例代码
2020/06/30 PHP
php提高脚本性能的4个技巧
2020/08/18 PHP
JS 自动安装exe程序
2008/11/30 Javascript
JQuery读取XML文件数据并显示的实现代码
2009/12/16 Javascript
html中table数据排序的js代码
2011/08/09 Javascript
HTML复选框和单选框 checkbox和radio事件介绍
2012/12/12 Javascript
JavaScript设计模式之原型模式(Object.create与prototype)介绍
2014/12/28 Javascript
浅谈javascript 函数内部属性
2015/01/21 Javascript
javascript实现input file上传图片预览效果
2015/12/31 Javascript
jQuery实现div拖拽效果实例分析
2016/02/20 Javascript
js判断手机系统是android还是ios
2017/03/07 Javascript
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
2017/07/05 jQuery
HTML5+JS+JQuery+ECharts实现异步加载问题
2017/12/16 jQuery
js getBoundingClientRect使用方法详解
2019/07/17 Javascript
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS OG
2018/03/30 DOTA
使用Python的Bottle框架写一个简单的服务接口的示例
2015/08/25 Python
详解python时间模块中的datetime模块
2016/01/13 Python
Python内置函数——__import__ 的使用方法
2017/11/24 Python
Python中pygal绘制雷达图代码分享
2017/12/07 Python
python语言中with as的用法使用详解
2018/02/23 Python
利用python将图片版PDF转文字版PDF
2019/05/03 Python
浅谈django2.0 ForeignKey参数的变化
2019/08/06 Python
python2.7的flask框架之引用js&amp;css等静态文件的实现方法
2019/08/22 Python
python实现双色球随机选号
2020/01/01 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
2020/11/17 Python
Python解析m3u8拼接下载mp4视频文件的示例代码
2021/03/03 Python
北美最大的零售退货翻新商:VIP Outlet
2019/11/21 全球购物
Oral-B荷兰:牙医最推荐的品牌
2020/02/25 全球购物
护士自荐信范文
2013/12/15 职场文书
面试后的感谢信范文
2014/02/01 职场文书
小学新教师个人总结
2015/02/05 职场文书
Python探索生命起源 matplotlib细胞自动机动画演示
2022/04/21 Python
JAVA 线程池(池化技术)的实现原理
2022/04/28 Java/Android