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重新实现PHP脚本引擎内置函数
Mar 06 PHP
一个PHP数组应该有多大的分析
Jul 30 PHP
PHP之COOKIE支持详解
Sep 20 PHP
Zend的AutoLoad机制介绍
Sep 27 PHP
php之Memcache学习笔记
Jun 17 PHP
php调用nginx的mod_zip模块打包ZIP文件
Jun 11 PHP
ThinkPHP采用实现三级循环代码实例
Jul 18 PHP
thinkphp在模型中自动完成session赋值示例代码
Sep 09 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
Jan 30 PHP
php curl常用的5个经典例子
Jan 20 PHP
Yii2中简单的场景使用介绍
Jun 02 PHP
PHP超全局变量实现原理及代码解析
Sep 01 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一些公用函数的集合
2008/03/27 PHP
Laravel6.18.19如何优雅的切换发件账户
2020/06/14 PHP
JS JavaScript获取Url参数,src属性参数
2021/03/09 Javascript
理解Javascript_10_对象模型
2010/10/16 Javascript
同一页面多个商品倒计时JS 基于面向对象的javascript
2012/02/16 Javascript
js 实现在离开页面时提醒未保存的信息(减少用户重复操作)
2013/01/16 Javascript
跟我学Node.js(四)---Node.js的模块载入方式与机制
2014/06/04 Javascript
jQuery Validate插件实现表单强大的验证功能
2015/12/18 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
JavaScript浏览器对象之一Window对象详解
2016/06/03 Javascript
JavaScript 数组- Array的方法总结(推荐)
2016/07/21 Javascript
jQuery ajax 当async为false时解决同步操作失败的问题
2016/11/18 Javascript
vue.js移动端tab组件的封装实践实例
2017/06/30 Javascript
使用 vue-i18n 切换中英文效果
2018/05/23 Javascript
JavaScript栈和队列相关操作与实现方法详解
2018/12/07 Javascript
微信小程序封装多张图片上传api代码实例
2019/12/30 Javascript
Element实现表格嵌套、多个表格共用一个表头的方法
2020/05/09 Javascript
[39:32]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第二场
2014/05/23 DOTA
详解Python中的元组与逻辑运算符
2015/10/13 Python
Python使用Redis实现作业调度系统(超简单)
2016/03/22 Python
python学习 流程控制语句详解
2016/06/01 Python
django js实现部分页面刷新的示例代码
2018/05/28 Python
对Python3.6 IDLE常用快捷键介绍
2018/07/16 Python
在Python中append以及extend返回None的例子
2019/07/20 Python
Django使用Jinja2模板引擎的示例代码
2019/08/09 Python
pytorch中使用cuda扩展的实现示例
2020/02/12 Python
使用keras根据层名称来初始化网络
2020/05/21 Python
Python3.7安装pyaudio教程解析
2020/07/24 Python
css3 按钮 利用css3实现超酷下载按钮
2013/03/18 HTML / CSS
使用HTML5捕捉音频与视频信息概述及实例
2018/08/22 HTML / CSS
澳大利亚领先的武术用品和健身器材供应商:SMAI
2019/03/24 全球购物
小学家长评语大全
2014/04/16 职场文书
2014大学生批评与自我批评思想汇报
2014/09/21 职场文书
工程竣工验收申请报告
2015/05/15 职场文书
2015年网管个人工作总结
2015/05/22 职场文书
德生2P3收音机开箱评测
2022/04/30 无线电