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
Dec 14 PHP
给apache2.2加上mod_encoding模块後 php5.2.0 处理url出现bug
Apr 12 PHP
Discuz 模板引擎的封装类代码
Jul 18 PHP
PHP读取XML值的代码(推荐)
Jan 01 PHP
php通过array_merge()函数合并两个数组的方法
Mar 18 PHP
PHP记录搜索引擎蜘蛛访问网站足迹的方法
Apr 15 PHP
PHP中抽象类、接口的区别与选择分析
Mar 29 PHP
PHP入门教程之表单与验证实例详解
Sep 11 PHP
简单谈谈PHP中的Reload操作
Dec 12 PHP
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
Apr 09 PHP
解决php extension 加载顺序问题
Aug 16 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
Jun 06 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
收音机发烧友应当熟知的100条知识
2021/03/02 无线电
PHP中实现进程间通讯
2006/10/09 PHP
thinkphp使用phpmailer发送邮件的方法
2014/11/24 PHP
YII Framework框架教程之使用YIIC快速创建YII应用详解
2016/03/15 PHP
php计算多个集合的笛卡尔积实例详解
2017/02/16 PHP
YII2框架中查询生成器Query()的使用方法示例
2020/03/18 PHP
Mootools 1.2教程 输入过滤第二部分(字符串)
2009/09/15 Javascript
js获取元素相对窗口位置的实现代码
2014/09/28 Javascript
AngularJS中的Directive自定义一个表格
2016/01/25 Javascript
全面解析jQuery $(document).ready()和JavaScript onload事件
2016/06/08 Javascript
js运动事件函数详解
2016/10/21 Javascript
js判断PC端与移动端跳转
2020/12/24 Javascript
JavaScript之iterable_动力节点Java学院整理
2017/06/29 Javascript
vue-router 导航钩子的具体使用方法
2017/08/31 Javascript
vue登录注册及token验证实现代码
2017/12/14 Javascript
vue 组件的封装之基于axios的ajax请求方法
2018/08/11 Javascript
vue-cli history模式实现tomcat部署报404的解决方式
2019/09/06 Javascript
python如何让类支持比较运算
2018/03/20 Python
Django处理文件上传File Uploads的实例
2018/05/28 Python
解决python2 绘图title,xlabel,ylabel出现中文乱码的问题
2019/01/29 Python
python命令行参数用法实例分析
2019/06/25 Python
python批量图片处理简单示例
2019/08/06 Python
python 一维二维插值实例
2020/04/22 Python
Python实现敏感词过滤的4种方法
2020/09/12 Python
HTML5 placeholder属性详解
2016/06/22 HTML / CSS
html5录音功能实战示例
2019/03/25 HTML / CSS
Space NK美国站:英国高端美妆护肤商城
2017/05/22 全球购物
GafasWorld哥伦比亚:网上购买眼镜
2017/11/28 全球购物
Ralph Lauren意大利官方网站:时尚界最负盛名的品牌之一
2018/10/18 全球购物
迪卡侬中国官网:Decathlon中国
2020/08/10 全球购物
如何用JQuery进行表单验证
2013/05/29 面试题
《尊严》教学反思
2014/02/11 职场文书
医德医魂心得体会
2014/09/11 职场文书
南京市纪委监察局整改方案
2014/09/16 职场文书
公司车辆维修管理制度
2015/08/05 职场文书
年会邀请函的格式及范文五篇
2019/11/02 职场文书