Reportes en Yii a partir de una busqueda

He visto en el foro que hay muchas personas preguntando como exportar en PDF a partir de una búsqueda en la vista admin, aquí les traigo una solución a ese problema.

  • En la función search() del modelo en cuestión agregamos al final (antes del retorno) las siguientes lineas de código:

     $_SESSION['datos_filtrados'] = new CActiveDataProvider($this, array(

                        'criteria'=>$criteria,

                        'sort'=>$sort,

                        'pagination'=>false,

                ));

Donde $criteria son los datos de filtrado y $sort el arreglo de ordenación, eso nos guardará en una variable de sesión la ultima búsqueda realizada, si no hemos realizado ninguna búsqueda estaremos guardando todos los resultados del listado, es importante colocar en false la paginación para que pueda traernos todos los resultados.

  • En la vista admin agregar el botón de exportar con array(‘label’=>‘Exportar a PDF’, ‘url’=>array(‘pdf’)), en la configuración del menú.

  • En el controlador agregamos la siguiente función:


public function actionPdf()

    {

        $this->render('pdf');

    }

  • Agrega la action pdf en el accessRules del controlador, para que los usuarios del sistema puedan tener permisos de utilizarla.

  • La librería que uso y recomiendo para exportar pdf es MPDF, la pueden descargar de su pagina oficial, una vez descargada la copian en extensions.

  • Un ejemplo para la vista pdf es el siguiente:


<?

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

$dataProvider = $_SESSION['datos_filtrados']->getData();

$contador=count($dataProvider);

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


    <table align="center"><tr>

    <td align="center"><b>LISTADO DE CONTRATOS</b></td>

    </tr></table>

    Total Resultados: '.$contador.'

        <table class="detail-view2" repeat_header="1" cellpadding="1" cellspacing="1" width="100%" border="0">

            <tr class="principal">

                <td class="principal" width="7%">&nbsp;N° Control</td>

                <td class="principal" width="7%">&nbsp;N° Contrato</td>

                <td class="principal" width="19%">&nbsp;Empresa</td>

                <td class="principal" width="10%">&nbsp;Estado</td>

                <td class="principal" width="9%">&nbsp;Monto Contratado</td>

                <td class="principal" width="25%">&nbsp;Objeto Contrato</td>

                <td class="principal" width="14%">&nbsp;Personal Actuante</td>

                <td class="principal" width="9%">&nbsp;Tipo Informe</td>

            </tr>';

         $i=0;

         $val=count($dataProvider);

         

         while($i<$val){

$html.='

            <tr class="odd">

                <td class="odd" width="7%">&nbsp;'.$dataProvider[$i]["num_control"].'</td>

                <td class="odd" width="7%">&nbsp;'.$dataProvider[$i]["num_contrato"].'</td>

                <td class="odd" width="19%">&nbsp;'.$dataProvider[$i]["empresa"].'</td>

                <td class="odd" width="10%">&nbsp;'.$dataProvider[$i]["estado0"]["nombre_estado"].'</td>

                <td class="odd" width="9%">&nbsp;'.$dataProvider[$i]["monto_contratado"].'</td>

                <td class="odd" width="25%">&nbsp;'.$dataProvider[$i]["objeto_contrato"].'</td>

                <td class="odd" width="14%">&nbsp;'.$dataProvider[$i]["personal_actuante"].'</td>

                <td class="odd" width="9%">&nbsp;'.$dataProvider[$i]["informe0"]["nombre_tipo_informe"].'</td>

            ';

    $html.='</tr>'; $i++;

                        }

    $html.='</table>';

$mpdf=new mPDF('win-1252','LETTER-L','','',9,9,24,10,5,5);

$mpdf->WriteHTML($html);

$mpdf->Output('Reporte_Contratos.pdf','D');

exit;

?>

  • Como vemos al principio del ejemplo tomamos los datos filtrado mediante la variable de sesión y disponemos de ellos como queramos en el pdf

Espero que les sirva de ayuda, ahí en el ejemplo puse como acceder incluso a campos de las otras tablas mediante las relaciones.

Twitter: @gabrielduarte77

Correo: gabrielduarte77@gmail.com

Otros Temas:

Exportar del Cgridview a PDF

Excelente ejemplo, funciona muy bien :)

Disculpa Gabriel una duda ya intente crear el boton para generar el pdf pero no me sale nada podrias poner esa parte mas explicada por favor?? de antemano gracias por el aporte

No lo he probado aún, por eso me aventuro a esta pregunta: ¿lo haz probado con tcpdf o con dompdf?.

  • Un ejemplo para la vista pdf es el siguiente:

<?

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

$dataProvider = $_SESSION['datos_filtrados']->getData();

$contador=count($dataProvider);

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


    <table align="center"><tr>

    <td align="center"><b>LISTADO DE CONTRATOS</b></td>

    </tr></table>

    Total Resultados: '.$contador.'

        <table class="detail-view2" repeat_header="1" cellpadding="1" cellspacing="1" width="100%" border="0">

            <tr class="principal">

                <td class="principal" width="7%">&nbsp;N° Control</td>

                <td class="principal" width="7%">&nbsp;N° Contrato</td>

                <td class="principal" width="19%">&nbsp;Empresa</td>

                <td class="principal" width="10%">&nbsp;Estado</td>

                <td class="principal" width="9%">&nbsp;Monto Contratado</td>

                <td class="principal" width="25%">&nbsp;Objeto Contrato</td>

                <td class="principal" width="14%">&nbsp;Personal Actuante</td>

                <td class="principal" width="9%">&nbsp;Tipo Informe</td>

            </tr>';

         $i=0;

         $val=count($dataProvider);

         

         while($i<$val){

$html.='

            <tr class="odd">

                <td class="odd" width="7%">&nbsp;'.$dataProvider[$i]["num_control"].'</td>

                <td class="odd" width="7%">&nbsp;'.$dataProvider[$i]["num_contrato"].'</td>

                <td class="odd" width="19%">&nbsp;'.$dataProvider[$i]["empresa"].'</td>

                <td class="odd" width="10%">&nbsp;'.$dataProvider[$i]["estado0"]["nombre_estado"].'</td>

                <td class="odd" width="9%">&nbsp;'.$dataProvider[$i]["monto_contratado"].'</td>

                <td class="odd" width="25%">&nbsp;'.$dataProvider[$i]["objeto_contrato"].'</td>

                <td class="odd" width="14%">&nbsp;'.$dataProvider[$i]["personal_actuante"].'</td>

                <td class="odd" width="9%">&nbsp;'.$dataProvider[$i]["informe0"]["nombre_tipo_informe"].'</td>

            ';

    $html.='</tr>'; $i++;

                        }

    $html.='</table>';

$mpdf=new mPDF('win-1252','LETTER-L','','',9,9,24,10,5,5);

$mpdf->WriteHTML($html);

$mpdf->Output('Reporte_Contratos.pdf','D');

exit;

?>

alguien me dice donde va este codigo? disculpen por favor

hola,

Este ejemplo es un fichero PDF.php dentro de la carperta "vistas" al que tienes que invocar para que tu aplicación pueda generar el PDF.

Espero que te sirva.

Buenas tardes amigo me haria falta saber porque me pone este cartel que se ve en la foto que le envie ahora