Yii: 扩展CGridView增加导出CSV功能

本文介绍如何为Yii框架中的CGridView组件添加CSV数据导出功能,包括派生子类、实现CSV输出逻辑、添加导出按钮及配置视图。

Yii提供的CGridView组件没有内置数据导出功能,不过我们可以通过扩展该组件来添加该功能。

具体方法如下:

1、首先派生一个子类,添加一个action成员,在该视图的init函数中判断是浏览动作还是数据导出动作,如果是浏览动作者则保持默认行为,否则输出csv文件。

[php]  view plain copy
 
  1. public function init()  
  2. {  
  3.     if($this->action == 'export')  
  4.     {  
  5.         parent::init();  
  6.         $this->genCsv();  
  7.     }  
  8.     else  
  9.     {  
  10.         parent::init();  
  11.     }  
  12. }  

 

2、处理csv文件的输出:

 

[php]  view plain copy
 
  1.         protected function genCsv()  
  2.         {  
  3.             header("Content-Type: text/csv; charset=GB2312");  
  4.             header('Content-Disposition: attachment; filename="'.$this->fileName.'"');  
  5.               
  6.             //add your content dump codes here  
  7.   
  8.             flush();  
  9.   
  10.         }  

 

 

3、然后在表格控件界面上添加一个csv导出按钮

 

覆盖其renderItems()方法如下:

[php]  view plain copy
 
  1. public function renderItems()  
  2. {  
  3.     if(Yii::app()->user->checkAccess('administrator'))  
  4.     {  
  5.         echo '<div class="toolBar">';  
  6.         echo '<form action="'.CHtml::normalizeUrl(array($this->action)).'&id='.$this->id.'" method="post">';  
  7.         foreach($this->getController()->getActionParams() as $name => $value)  
  8.         {  
  9.             echo '<input type="hidden" name="'.addcslashes($name,'"').'" value="'.addcslashes($value,'"').'" />';  
  10.         }  
  11.         echo '<input type="image" title="'.Yii::t('ifCMS','Export to CSV').'" src="'.Yii::app()->theme->BaseUrl.'/images/ico-csv.png" alt="Submit">';  
  12.         echo '</form>';  
  13.         echo '</div>';  
  14.     }  
  15.     parent::renderItems();  
  16.      }  

 

4、然后在点击CSV的动作处理比如actionCsv()中render单个表格视图,模板如下

 

[php]  view plain copy
 
  1. <?php   
  2.     $this->widget('application.extensions.grid.MyGridView', array(  
  3.     'id'=>'grid',  
  4.     'action'=>'export',  
  5.     'dataProvider'=>$dp,  
  6.     'columns'=>array(  
  7.         array(  
  8.             'header'=>Yii::t('Statistics','Phone'),  
  9.             'name'=>'phone',  
  10.         ),  
  11.         array(  
  12.             'header'=>Yii::t('Statistics','Count'),  
  13.             'name'=>'count',  
  14.         ),  
  15.     )  
  16. ));?>  

 

 

注意上述第2步csv输出函数中的header设置语句之前不要有任何的输出,包括如下函数:

 

[plain]  view plain copy
 
  1. print, echo, printf, trigger_error, vprintf, ob_flush, var_dump, readfile, passthru  

 

 

否则内容只会在浏览器中输出,但不会出现文件下载。

by iefreer

 

参考:

http://stackoverflow.com/questions/8028957/headers-already-sent-by-php

转载于:https://www.cnblogs.com/DaBing0806/p/4747610.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值