Exportar del CGridView a PDF

He leído varios temas en los que preguntan por un paso a paso de como exportar la información de un registro del CGridView a pdf, a continuación les muestro como hacerlo con la librería MPDF

  • Lo primero que hacemos es bajarnos la ultima versión de MPDF de su pagina oficial http://www.mpdf1.com/mpdf/ y la colocamos en protected/extensions

  • Copiamos en el controlador de la tabla a la que se hará el reporte la siguiente función:


   public function actionPdf($id)

    {

        $this->render('pdf',array(

            'model'=>$this->loadModel($id),

        ));

    }

  • Colocamos pdf en la funcion accessRules() del mismo controlador para que los usuarios puedan acceder a la acción

  • En la vista admin sustituir el arreglo de los botones por el siguiente:


 array(

            'class'=>'CButtonColumn',

                    'template' => '{view} {update} {delete} {pdf}',

                'buttons'=>array(

                        'pdf' => array(

                                'label'=>'Generar PDF', 

                                'url'=>"CHtml::normalizeUrl(array('pdf', 'id'=>\$data->id))",

                                'imageUrl'=>Yii::app()->request->baseUrl.'/images/pdf_icon.png', 

                                'options' => array('class'=>'pdf'),

                        ),

                ),

        ),

  • En la vista view agregamos la vista de nuestro pdf en el menu:

 array('label'=>'Crear PDF', 'url'=>array('pdf','id'=>$model->id)),

  • En mi caso la clave primaria del registro la puse como id en la base de datos, si en tu caso es "id_producto" o algo por el estilo debes cambiarlo cuando se pasa el dato a la vista.

  • Y por ultimo tenemos el archivo pdf.php que estará en las vistas:


<?php

$pdf = Yii::createComponent('application.extensions.MPDF52.mpdf');


$html='

<link rel="stylesheet" type="text/css" href="'.Yii::app()->request->baseUrl.'/css/pdf.css" />


<table id="yw0" class="detail-view2">

<tr class="principal">

<td colspan="2" align="center"><b>DATOS DEL CONTRATO</b></td>

<tr>

<tr class="odd"><td> <b>N° Control</b> </td><td> '.$model->num_control.'</td></tr>

<tr class="even"><td> <b>Trimestre Ejecucion</b> </td><td> '.$model->trimestre_ejecucion.'</td></tr>

<tr class="odd"><td> <b>Nombre Estado</b> </td><td> '.$model->estado0["nombre_estado"].'</td></tr>

<tr class="even"><td> <b>Empresa</b> </td><td> '.$model->empresa.'</td></tr>

<tr class="odd"><td> <b>Personal Actuante</b> </td><td> '.$model->personal_actuante.'</td></tr>

<tr class="even"><td> <b>Nombre Tipo Informe</b> </td><td> '.$model->informe0["nombre_tipo_informe"].'</td></tr>

<tr class="even"><td> <b>N° Contrato</b> </td><td> '.$model->num_contrato.'</td></tr>

<tr class="odd"><td> <b>Monto Contratado</b> </td><td> '.$model->monto_contratado.'</td></tr>

<tr class="even"><td> <b>Monto Auditado</b> </td><td> '.$model->monto_auditado.'</td></tr>

<tr class="odd"><td> <b>Porcentaje Ejecucion</b> </td><td> '.$model->porcentaje.'</td></tr>

<tr class="even"><td> <b>Objeto Contrato</b> </td><td> '.$model->objeto_contrato.'</td></tr>

<tr class="odd"><td> <b>Observaciones</b> </td><td> '.$model->observaciones.'</td></tr>

<tr class="even"><td> <b>Recomendaciones</b> </td><td> '.$model->recomendaciones.'</td></tr>

<tr class="odd"><td> <b>Monto Hallazgo</b> </td><td> '.$model->monto_hallazgo.'</td></tr>

<tr class="even"><td> <b>Origen Tramite</b> </td><td> '.$model->origen0["nombre_origen_tramite"].'</td></tr>

</table>


';

$mpdf=new mPDF('win-1252','LETTER','','',15,15,25,12,5,7);

$mpdf->WriteHTML($html);

$mpdf->Output('Ficha-Contrato-'.$model->num_control.'.pdf','D');

exit;

?>

  • El icono del pdf se los dejo anexado.

Espero que les sea de mucha ayuda, mpdf es muy potente para encabezados y pie de pagina y la documentación está buenisima.

Twitter: @gabrielduarte77

Correo: gabrielduarte77@gmail.com

Otros Temas:

  • Reportes en Yii a partir de una busqueda

No entiendo cuando dice:

Muy buen tutorial, a ver si alguna vez llego a usarlo, que creo que es bastante probable :P

en el controlador hay una función ‘accessRules’ casi al inicio del archivo, allí defines los permisos que tiene cada usuario para acceder a las diferentes acciones, lo que indica eso es que debes definir en esa función quien tiene permiso para acceder a la acción ‘pdf’, digamos que si queremos que todos los usuarios puedan hacerlo entonces seria así:




array('allow',  // allow all users to perform 'index', 'view', 'postSurvey', 'getSurveyConditions' actions

	'actions'=>array('index','view','pdf'),

	'users'=>array('*'),

),



si queremos que solo administradores pueda usar esta función, entonces seria algo así:




array('allow',  // allow all users to perform 'index', 'view', 'postSurvey', 'getSurveyConditions' actions

	'actions'=>array('admin','delete','pdf'),

	'users'=>array('admin'),

),



podrias cambiar el nombre de la acción ‘actionPdf’ por ‘actionGeneratePdf’ y en la función accessRules deberías entonces poner los permisos para ‘generatePdf’ y no ‘pdf’.

Hola a todos. Disculpen por revivir el tema, pero ¿hay alguna forma de imprimir solamente los datos contenidos en una vista, es decir que no me imprima todos los valores de la tabla de la base de datos? Y si es colocandole un botón para imprimir, a la vista mejor =D. Gracias y saludos.

Excelente tutorial, me a servido un montón, ya estoy generando un PDF, pero hay cosas que aún no he logrado solucionar.

  • Como agregar un header y/o header?

Gracias y Saludos!

Hermano yo en la vista pdf.php coloque esta línea para agregar el header:


$header='<div><center><img src="'.Yii::app()->request->baseUrl.'/css/banner.png"/ height="145" width="100%"></center></div>';

Para el footer esta:


$mpdf->SetFooter(' {DATE j/m/Y}|Página {PAGENO}|Nombre cualquiera');

Igualmente si puedes explicarme como hiciste tus reportes me sería de gran ayuda. Necesito reportes individuales =/. Saludos y espero te haya servido.

Saludos comunidad,

Gracias por las respuesta, pero tengo una gran duda, y es que de un momento a otro, ya no me funciona el PDF

la URL que me aparece es:

index.php?r=empleados/pdf&id=1

lo cual es correcto, pero me sale un error

No se encontró una página web para la siguiente dirección web: http://localhost/proyecto/index.php?r=empleados/pdf&id=1

Lo raro es que antes me funcionaba :S

A que se puede deber esto?

Saludos

Gracias por el aporte comunidad, gran tuto…

Soy recien llegado y muy novato, asi que espero ayudar en lo pueda. Me gustaria que me indicaran algún post donde pueda generar el reporte a pdf con todo el grid.

Muchas gracias!!

Amigo me podria ayudar a ponerle un encabezado y un pie de pagina el codigo que proporcionaron no me sirvio.

hola!

te paso una copia de una vista que hice para generar pdf,




<?php ini_set('memory_limit', '-1'); ?>

<?php $contador=  count($model); if ($model !== null):?>

<html>


<!-- aquí comienza el css para la generación del informe -->    

  <head>

<style>

 body {font-family: sans-serif;

 font-size: 9pt;

 }

 p { margin: 0pt;

 }

 td { vertical-align: top; }

 .items td {

 border-left: 0.3mm solid #FFFFFF;

 border-right: 0.3mm solid #FFFFFF;

 }

 table thead td { bckground-color: #EEEEEE;

 text-align: left;

 border: 0.3mm solid #FFFFFF;

 }

 .items td.blanktotal {

 background-color: #FFFFFF;

 border: 0mm none #000000;

 border-top: 0.1mm solid #000000;

 }

 .items td.totals {

 text-align: right;

 border: 0.1mm solid #000000;

 }

 .centrarimg {

 text-align:center;

 display:block;

 }

  

</style>

</head>

<!-- aquí finaliza el css para la generación del reporte -->

<body>

    

<htmlpageheader name="myheader"> //acá la cabecera

 <table width="100%">

 <tr> 

	<td width="50%" style="color:#0000BB;">   

		<div class="centrarimg">

		<img src="C:\wamp\www\proyect_99\images\logo.png">

		</div>

	</td> 

 </tr> 

 </table>

</htmlpageheader>   


<htmlpagefooter name="myfooter"> //acá el pie

 <div style="border-top: 0px solid #000000; font-size: 8pt; text-align: center; padding-top: 1mm; ">

 Página {PAGENO} de {nb}

 </div>

 </htmlpagefooter>




<sethtmlpageheader name="myheader" value="on" show-this-page="1" />

<sethtmlpagefooter name="myfooter" value="on" />


<div style="text-align: right">

    Fecha: <?php echo date("d/m/Y"); ?>

</div>    

<div style="text-align: left">

Total Resultados: <?php echo $contador; ?>

</div>

 <table class="items" width="100%" style="font-size: 14pt; border-collapse: collapse;" cellpadding="0">

 

     <thead>

   <tr>

             <td width="center">Código</td>

             <td width="80%" align="center">Compañia</td>

             <td width="10%" align="center">Tipo Compañia</td>

             <td width="10%" align="center">Situación Comp. 1</td>

             <td width="10%" align="center">Situación Comp. 2</td>

             <td width="10%" align="center">Ámbito</td>

    </tr>


 </thead>

 <!-- ITEMS -->

 <?php foreach($model as $row): ?>

<tr>

     <td align="center">

         <?php echo $row->COD_COMP; ?>

     </td>

     <td align="left">

         <?php echo $row->NOMBRE_CORTO; ?>

     </td>

     <td align="left">

         <?php echo $row->tIPOCOMP->ABR_TIPO_ENT; ?>

     </td>

     <td align="left">

         <?php echo $row->getEstado($row->ESTADO_COMP_1); ?>

     </td>

     <td align="left">

         <?php echo $row->getEstado($row->ESTADO_COMP_2); ?>

     </td>

     <td align="left">

         <?php echo $row->getAmbito($row->EST_COMPAÑIA); ?>

     </td>    

          

</tr>


 <?php endforeach; ?>

 <!-- FIN ITEMS -->

 </table>

 </body>

 </html>

<?php endif; ?>




Espero que te sirva de guía para realizar tu reporte.

Saludos