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 UTF8中文字符截断函数代码
Sep 11 PHP
php中的注释、变量、数组、常量、函数应用介绍
Nov 16 PHP
PHP中设置一个严格30分钟过期Session面试题的4种答案
Jul 30 PHP
PHP统计目录大小的自定义函数分享
Nov 18 PHP
smarty简单入门实例
Nov 28 PHP
PHP将session信息存储到数据库的类实例
Mar 04 PHP
php开发中的页面跳转方法总结
Apr 26 PHP
如何解决phpmyadmin导入数据库文件最大限制2048KB
Oct 09 PHP
利用PHP生成CSV文件简单示例
Dec 21 PHP
php使用PDO获取结果集的方法
Feb 16 PHP
在thinkphp5.0路径中实现去除index.php的方式
Oct 16 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 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
星际实力自我测试
2020/03/04 星际争霸
php内嵌函数用法实例
2015/03/20 PHP
php版微信js-sdk支付接口类用法示例
2016/10/12 PHP
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
php基于环形链表解决约瑟夫环问题示例
2017/11/07 PHP
很可爱的输入框
2008/08/03 Javascript
javascript div 弹出可拖动窗口
2009/02/26 Javascript
JS 时间显示效果代码
2009/08/23 Javascript
网页中的图片的处理方法与代码
2009/11/26 Javascript
window.location 对象所包含的属性
2014/10/10 Javascript
js中的事件捕捉模型与冒泡模型实例分析
2015/01/10 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
2015/06/05 Javascript
实现高性能JavaScript之执行与加载
2016/01/30 Javascript
jQuery设置图片等比例缩小的方法
2017/04/29 jQuery
浅谈JS和jQuery的区别
2019/03/27 jQuery
使用js实现一个简单的滚动条过程解析
2019/09/10 Javascript
vue中监听路由参数的变化及方法
2019/12/06 Javascript
javascript实现前端分页效果
2020/06/24 Javascript
vue实现一个6个输入框的验证码输入组件功能的实例代码
2020/06/29 Javascript
不依任何赖第三方,单纯用vue实现Tree 树形控件的案例
2020/09/21 Javascript
[01:06:26]全国守擂赛第二周 Team Coach vs DeMonsTer
2020/04/28 DOTA
Python实现动态图解析、合成与倒放
2018/01/18 Python
python 对txt中每行内容进行批量替换的方法
2018/07/11 Python
windows下python 3.6.4安装配置图文教程
2018/08/21 Python
Django组件之cookie与session的使用方法
2019/01/10 Python
详解python中的生成器、迭代器、闭包、装饰器
2019/08/22 Python
Python-jenkins 获取job构建信息方式
2020/05/12 Python
Python爬虫实战案例之爬取喜马拉雅音频数据详解
2020/12/07 Python
英国日常交易网站:Wowcher
2018/09/04 全球购物
介绍一下except的用法和作用
2015/01/22 面试题
与美同行演讲稿
2014/09/13 职场文书
辩论赛主持人开场白
2015/05/29 职场文书
新郎婚礼致辞
2015/07/27 职场文书
孩子满月酒答谢词
2015/09/30 职场文书
一个成功的互联网创业项目,必须满足这些要求
2019/08/23 职场文书
使用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())
2021/05/14 Python