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 相关文章推荐
ThinkPHP写第一个模块应用
Feb 20 PHP
教你如何解密 “ PHP 神盾解密工具 ”
Jun 20 PHP
9条PHP编程小知识及易犯的小错误
Jan 22 PHP
php实现QQ空间获取当前用户的用户名并生成图片
Jul 25 PHP
PHP几个实用自定义函数小结
Jan 25 PHP
PHP将二维数组某一个字段相同的数组合并起来的方法
Feb 26 PHP
PHP中Socket连接及读写数据超时问题分析
Jul 19 PHP
PHP Cookie学习笔记
Aug 23 PHP
PHP中Notice错误常见解决方法
Apr 28 PHP
PHP实现的分页类定义与用法示例
Jul 05 PHP
php脚本守护进程原理与实现方法详解
Jul 20 PHP
PHP 7.4 新语法之箭头函数实例详解
May 09 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
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
2012/10/24 PHP
laravel csrf排除路由,禁止,关闭指定路由的例子
2019/10/21 PHP
JQuery从头学起第三讲
2010/07/06 Javascript
基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果)
2011/09/28 Javascript
图片延迟加载的实现代码(模仿懒惰)
2013/03/29 Javascript
jQuery 浮动导航菜单适合购物商品类型的网站
2014/09/09 Javascript
一个JavaScript操作元素定位元素的实例
2014/10/29 Javascript
js实现鼠标滑过文字链接色彩变化的效果
2015/05/06 Javascript
js简单判断移动端系统的方法
2016/02/25 Javascript
jQuery添加options点击事件并传值实例代码
2016/05/18 Javascript
BootStrap中Datepicker控件带中文的js文件
2016/08/10 Javascript
B/S(Web)实时通讯解决方案分享
2017/04/06 Javascript
解决VUEX刷新的时候出现数据消失
2017/07/03 Javascript
angular之ng-template模板加载
2017/11/09 Javascript
[43:47]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第一局
2016/03/05 DOTA
Python urlopen 使用小示例
2008/09/06 Python
详尽讲述用Python的Django框架测试驱动开发的教程
2015/04/22 Python
Python实现简单的四则运算计算器
2016/11/02 Python
python 图片去噪的方法示例
2019/07/09 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
2019/07/23 Python
对Pytorch神经网络初始化kaiming分布详解
2019/08/18 Python
Python Celery多队列配置代码实例
2019/11/22 Python
python适合做数据挖掘吗
2020/06/16 Python
Python常用类型转换实现代码实例
2020/07/28 Python
Python3读写ini配置文件的示例
2020/11/06 Python
马来西亚在线购物市场:PGMall.my
2019/10/13 全球购物
Marlies Dekkers内衣荷兰官方网店:荷兰奢侈内衣品牌
2020/03/27 全球购物
将"引用"作为函数参数有哪些特点
2013/04/05 面试题
个人自我鉴定
2013/11/07 职场文书
法学专业毕业生求职信
2014/06/12 职场文书
大学生先进个人主要事迹材料
2015/11/04 职场文书
《我和小伙伴》教学反思
2016/02/20 职场文书
MySql存储过程之逻辑判断和条件控制
2021/05/26 MySQL
详解JVM系列之内存模型
2021/06/10 Javascript
CSS三大特性继承性、层叠性和优先级详解
2022/01/18 HTML / CSS
小喇叭开始广播了! 四十多年前珍贵老照片
2022/05/09 无线电