Yii: 扩展CGridView增加导出CSV功能
2024-08-25 16:08:55
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
否则内容只会在浏览器中输出,但不会出现文件下载。
by iefreer
参考:
http://stackoverflow.com/questions/8028957/headers-already-sent-by-php
最新文章
- css实现分割线
- JAVA 编程规范(上)
- Intent启动一个新的页面
- How to locate a path? - Unix &; Linux Stack Exchange
- LLVM,Clang
- 剑指offer--面试题14--收获
- Delphi异形窗口之PNG
- Java更新XML的四种常用方法简介
- dijkstra算法(迪杰斯特拉算法)
- 作业.把c语言输出的基础差不多都概括了!
- Java多线程——线程同步
- Java设计模式---(动态)代理模式
- JavaWeb框架的基石
- 【JAVAWEB学习笔记】11_XML&;反射
- Spring学习笔记5——注解方式AOP
- 关于QT下资源使用和资源占用…
- 七、Json格式的对象都可以通过遍历来获得里面的value值
- html5 缓存实例
- console输出选择器的问题
- 【Scheme】元循环求值