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 相关文章推荐
利用Memcached在php下实现session机制 替换PHP的原生session支持
Aug 21 PHP
php&amp;mysql 日期操作小记
Feb 27 PHP
PHP 查找字符串常用函数介绍
Jun 07 PHP
php上传图片到指定位置路径保存到数据库的具体实现
Dec 30 PHP
教你如何在CI框架中使用 .htaccess 隐藏url中index.php
Jun 09 PHP
PHP不使用递归的无限级分类简单实例
Nov 05 PHP
PHP实现的简单适配器模式示例
Jun 22 PHP
PHP开发中解决并发问题的几种实现方法分析
Nov 13 PHP
php实现socket推送技术的示例
Dec 20 PHP
PHP各种常见经典算法总结【排序、查找、翻转等】
Aug 05 PHP
关于Yii中模型场景的一些简单介绍
Sep 22 PHP
tp5.1 框架join方法用法实例分析
May 26 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中文处理 中文字符串截取(mb_substr)和获取中文字符串字数
2011/11/10 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
2014/08/23 PHP
jQuery实现切换页面布局使用介绍
2011/10/09 Javascript
js局部刷新页面时间具体实现
2013/07/04 Javascript
jquery实现的图片点击滚动效果
2014/04/29 Javascript
JS的encodeURI和java的URLDecoder.decode使用介绍
2014/05/08 Javascript
jQuery响应鼠标事件并隐藏与显示input默认值
2014/08/24 Javascript
jQuery设置指定网页元素宽度和高度的方法
2015/03/25 Javascript
javascript实现点击后变换按钮显示文字的方法
2015/05/13 Javascript
基于ajax实现文件上传并显示进度条
2015/08/03 Javascript
jquery ajax双击div可直接修改div中的内容
2016/03/04 Javascript
javascript时间差插件分享
2016/07/18 Javascript
浅谈jquery中使用canvas的问题
2016/10/10 Javascript
JQ图片文件上传之前预览功能的简单实例(分享)
2017/11/12 Javascript
在vue中多次调用同一个定义全局变量的实例
2018/09/25 Javascript
[04:05]TI9战队采访 - Natus Vincere
2019/08/22 DOTA
python实现带声音的摩斯码翻译实现方法
2015/05/20 Python
python中requests小技巧
2017/05/10 Python
python实现指定文件夹下的指定文件移动到指定位置
2018/09/17 Python
在matplotlib的图中设置中文标签的方法
2018/12/13 Python
python3.6环境安装+pip环境配置教程图文详解
2019/06/20 Python
Python 在OpenCV里实现仿射变换—坐标变换效果
2019/08/30 Python
详解python 降级到3.6终极解决方案
2020/02/06 Python
python实现图像拼接功能
2020/03/23 Python
去加拿大的旅行和假期:Canadian Affair
2016/10/25 全球购物
iHerb香港:维生素、补充剂和天然保健品
2017/08/01 全球购物
个人求职信范例
2014/01/29 职场文书
人力资源本科毕业生求职信
2014/06/04 职场文书
2014年出纳工作总结与计划
2014/12/09 职场文书
学生检讨书怎么写
2015/05/07 职场文书
2015年小学语文工作总结
2015/05/25 职场文书
文明礼貌主题班会
2015/08/14 职场文书
Angular CLI发布路径的配置项浅析
2021/03/29 Javascript
分析ZooKeeper分布式锁的实现
2021/06/30 Java/Android
VUE之图片Base64编码使用ElementUI组件上传
2022/04/09 Vue.js
centos7安装mysql5.7经验记录
2022/05/02 Servers