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")