unchanged
Title
simple CSV export
<html>
<div style='padding: 3px; background-color: #fe9; border: #aaa;
border-radius: 3px;'>
Por: <b><a href='https://plus.google.com/107716720815385421516'
rel='author' title='author profile'><span itemprop='name'>Christian
Salazar</span></a></b>
<a href="https://twitter.com/salazarchris74"
class="twitter-follow-button" data-show-count="false"
data-lang="es">Follow @salazarchris74</a>
</div>
<script>!function(d,s,id){var
js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-5791317089514247";
/* firma */
google_ad_slot = "6843698352";
google_ad_width = 234;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</html>
Hello everyone, this simple component extract data to CSV. The main difference
with others is the ability to format each column using Yii::app()->format
functions in a very similar way as CGridView does.
1. **This component can output the result directly to your browser as a
downloadble CSV**, so use the input arguments to provide a filename, if not, the
output will be returned as a string.
2. **The input argument to be converted to CSV must be any array of CModel
objects**, or any indexed array like $ar['key1'],$ar['key2']. You can pass an
CActiveRecord array to this component too.
3. example usage:
~~~
[php]
public function actionExport(){
CsvExport::export(
People::model()->findAll(), // a CActiveRecord array OR any CModel array
array('idpeople'=>array('number'),'birthofdate'=>array('date')),
true, // boolPrintRows
'registers-upto--'.date('d-m-Y H-i').".csv"
);
}
in a view put a link:
echo CHtml::link('Download CSV',array('site/export'));
~~~
4. **please note the input**: People::model()->findAll(), this component is
not limited to CActiveRecord, you could pass any array or any CModel objects
array to it.
5. **for each column definition you can concatenate formats**:
array('idpeople'=>array('number','fixed8'),'birthofdate'=>array('date')),
please note 'fixed8' this will invoke Yii::app()->format->formatFiexed8,
this method must exist in your CFormatter implementation in order to work, you
can extend CFormatter and implement the required methods.
6. copy this class into your protected/components/CsvExport.php:
~~~
[php]
<?php
/**
CsvExport
helper class to output an CSV from a CActiveRecord array.
example usage:
CsvExport::export(
People::model()->findAll(), // a CActiveRecord array OR any
CModel array
array(
'idpeople'=>array('number'), 'number' and 'date' are
strings used by CFormatter
'birthofdate'=>array('date'),
)
,true,'registros-hasta--'.date('d-m-Y H-i').".csv");
Please refer to CFormatter about column definitions, this class will use
CFormatter.
@author Christian Salazar <christiansalazarh@gmail.com> @bluyell
@yiienespanol (twitter)
@licence Protected under MIT Licence.
@date 07 october 2012.
*/
class CsvExport {
/*
export a data set to CSV output.
Please refer to CFormatter about column definitions, this class will use
CFormatter.
@rows CModel array. (you can use a CActiveRecord array because it
extends from CModel)
@coldefs example: 'colname'=>array('number') (See also CFormatter
about this string)
@boolPrintRows boolean, true print col headers taken from coldefs
array key
@csvFileName if set (defaults null) it echoes the output to browser
using binary transfer headers
@separator if set (defaults to ';') specifies the separator for each CSV
field
*/
public static function export($rows, $coldefs, $boolPrintRows=true,
$csvFileName=null, $separator=';')
{
$endLine = '\r\n';
$returnVal = '';
if($csvFileName != null)
{
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment;
filename=".$csvFileName);
header("Content-Type: application/octet-stream");
header("Content-Transfer-Encoding: binary");
}
if($boolPrintRows == true){
$names = '';
foreach($coldefs as $col=>$config){
$names .= $col.$separator;
}
$names = rtrim($names,$separator);
if($csvFileName != null){
echo $names.$endLine;
}else
$returnVal .= $names.$endLine;
}
foreach($rows as $row){
$r = '';
foreach($coldefs as $col=>$config){
if(isset($row[$col])){
$val = $row[$col];
foreach($config as $conf)
if(!empty($conf))
$val = Yii::app()->format->format($val,$conf);
$r .= $val.$separator;
}
}
$item = trim(rtrim($r,$separator)).$endLine;
if($csvFileName != null){
echo $item;
}else{
$returnVal .= $item;
}
}
return $returnVal;
}
}
~~~
- personal blog:
[http://trucosdeprogramacionmovil.blogspot.com/](http://trucosdeprogramacionmovil.blogspot.com/)
"http://trucosdeprogramacionmovil.blogspot.com/"
- yii en espaƱol:
[http://www.yiiframeworkenespanol.org](http://www.yiiframeworkenespanol.org)"http://www.yiiframeworkenespanol.org"
twitter: @yiienespanol
Need advanced RBAC UI functionality in Yii ? use
Cruge...[https://bitbucket.org/christiansalazarh/cruge](https://bitbucket.org/christiansalazarh/cruge
"https://bitbucket.org/christiansalazarh/cruge")