Tengo un informe pdf generado a partir de un CGridView, el cual funciona muy bien, el problema que tengo es que necesito que los informes generados sean por cada usuario(cliente). Por lo cual he optado por hacer un salto de pagina cada que cambien el id del usuario y de esta manera tener el informe pdf en paginas distintas por cada usuario, pero no he logrado que funcione, la funcion que he utilizado para esto es
$mPDF->AddPage();
, por lo cual quisiera que me ayudaran con respecto a lo que debo hacer, si alguien tiene experiencia relacionada con el tema, y la libreria mPDF, agradeceria mucho su ayuda.
De antemano muchas gracias.
(Dejo el controlador y la vista).
Controlador
public function actionGenerarPdf()
{
$session = new CHttpSession;
$session->open();
$model =$_SESSION['datos_filtrados']->getData();
$mPDF1 = Yii::app()->ePdf->mpdf('utf-8','Letter','','',15,15,35,25,9,9,'L'); //Esto lo pueden configurar como quieren, para eso deben de entrar en la web de MPDF para ver todo lo que permite.
$mPDF1->useOnlyCoreFonts = true;
$mPDF1->SetTitle("La Patria-Reportes-".$this->id); //Titulo de la ventana
$mPDF1->SetSubject('Reporte de documentos y listados la patria S.A');
$mPDF1->SetAuthor(Yii::app()->user->name);//Titulo del autor del archivo
$mPDF1->SetWatermarkText("La Patria S.A"); //Marca de agua
$mPDF1->showWatermarkText = true; // activar/Desactiuvar marca de agua (True/false)
$mPDF1->watermarkTextAlpha = 0.1; // Trasnparencia de la marca de agua (0-1)
$mPDF1->AddPage('P'); // Orientacion de la pagina (P/L)
$mPDF1->SetDisplayMode('fullpage'); // Modo de visualizacion a pantalla completa.
$mPDF1->WriteHTML($this->renderPartial('pdfReportMovimiento', array('model'=>$model, 'mpdf'=>$mPDF1), true)); //hacemos un render partial a una vista preparada, en este caso es la vista pdfReportDepartamento
$mPDF1->Output('Reportes'."-".$this->id."-".date('Y-m-d-H-i-s'),'I'); //Nombre del pdf y parámetro para ver pdf o descargarlo directamente.</pre>
}
No sé si ese será tu problema pq en tu código no imprimes nada antes de generar una nueva página, pero en todos los ejemplos que he visto, antes de hacer el
Muchas gracias por responder, tienes razon en el codigo quite lo que tenia de salto de pagina por que no me funcionaba, pero es que no se como debo utilizar la funcion:
$mpdf->AddPage()
Por que en la vista pdfReportMovimiento.php estoy recibiendo el objeto $model que viene cargado con los datos que deseo mostrar en una tabla en pdf, pero entonces lo que necesito es que cada que cambie el id del usuario(cliente), haga el salto de pagina y me genere los datos de ese cliente especifico. Ejm:
<?php $cleinte = $model[0]->clienteIdCliente; ?> // Guardo el primer id.
<?php foreach($model as $row): ?>
<tr>
<td align="center">
<?php echo $row->tipopublicacionIdtipopublicacion->nombretipopublicacion ; ?>
</td>
<td align="center">
<?php echo $row->clienteIdcliente->razonsocial; ?>
</td>
<td align="center">
<?php echo $row->clienteIdcliente->clientecod;?>
</td>
<td align="center">
<?php echo $row->fechamov;?>
</td>
<td align="center">
<?php echo $row->entrega;?>
</td>
<td align="center">
<?php echo $row->devolucion;?>
</td>
<td align="center">
<?php echo $row->faltante;?>
</td>
<td align="center">
<?php echo $row->vlrunitario;?>
</td>
<td align="center">
<?php echo $row->vlrdia;?>
</td>
</tr>
<?php if($row->clienteIdCliente != $cliente) //Pregunto si cambio el id, y hago el salto de pagina para imprimir en la siguiente hoja la misma tabla pero solo con los datos de ese cliente.
$mpdf->AddPage();
$cliente = $row->clienteIdCliente;// la variable cliente es igual al nuevo id para que cada vez que cambie salte a la otra pagina en mi pdf ?>
<?php endforeach; ?>
Esto seria mas o menos lo que necesito hacer, no se si puedas darme una mejor idea de como hacerlo.
Por una parte tienes tu vies, donde muestras los datos que deseas sacar en el informe. En esta view no tienes que hacer nada con mPDF, sólo es una view en la que vas a mostrar los datos.
Por otra parte tienes tu actionGenerarPdf, que es ahí donde tienes que poner el condicional para que te salte de página!!!!!!
Por ejemplo:
public function actionGenerarPdf()
{
$session = new CHttpSession;
$session->open();
$model = $_SESSION['datos_filtrados']->getData();
$mpdf = Yii::app()->ePdf->mpdf('utf-8','Letter','','',15,15,35,25,9,9,'L');
....
....
$control = $model[0]->clienteIdCliente;
$datosImprimir = '';
foreach($model as $fila)
{
if($control != $fila->clienteIdCliente)
{
$mpdf->WriteHTML($datosImprimir);
$mpdf->AddPage();
$datosImprimir = '';
}
else
{
$datosImprimir = 'lo que sea';
}
}
if(!empty($datosImprimir))
$mpdf->WriteHTML($datosImprimir);
....
....
Tu en la variable $datosImprimir puedes añadir tags HTML, y vas construyendo tus tablas de impresión. No te hace falta el renderPartial.
Si lo quieres hacer por renderPartial, tendrías que hacer tantos renderPartial como distintos identificadores de clientes tengas, y a cada renderPartial le pasarías sólo los datos de ese identificador de cliente. Es decir, dentro del bucle irías construyendo un array con los datos de un único identificador de cliente, y en el condicional harías algo como esto:
Muchas gracias por tu respuesta, te cuento que estoy trabajando con la segunda forma que me indicaste, ya que como ya tengo la vista creada pienso que es una buena forma, con respecto a la forma como se hace, quisiera contarte que funciona y de nuevo gracias por darme esa luz, pero hay un problema hice lo que me recomiendas y en un array estoy cargando los datos de un cliente, y cada vez pregunto por el condicional de control, efectivamente cuando el id del cliente cambia, el action va y me hace el renderPartial, con el array que cargue con los datos de ese cliente, pero luego que me hace el renderPartial(con Exito). No regresa al action y no continua con el bucle, no se como prodria solucionarlo.
Mira como tengo el action actuamente.
public function actionGenerarPdf()
{
$session = new CHttpSession;
$session->open();
$model =$_SESSION['datos_filtrados']->getData();
$mPDF1 = Yii::app()->ePdf->mpdf('utf-8','Letter','','',15,15,35,25,9,9,'L');
....
....
....
$mPDF1->SetDisplayMode('fullpage'); // Modo de visualizacion a pantalla completa.
$cliente = array(); //Array para los datos del cliente especifico
$idcliente = $model[0]->cliente_idcliente; //Id para el control
foreach ($model as $key => $value) {
$cliente[$key] = $value;
if ($idcliente != $value->cliente_idcliente) {
$idcliente = $value->cliente_idcliente;//Iguala idcliente para el control del proximo cliente
$mPDF1->WriteHTML($this->renderPartial('pdfReportMovimiento', array('model'=>$cliente), true)); //hacemos un renderPartial a una vista preparada, con los datos de un cliente especifico
unset($cliente);//Dejo vacio el array para luego cargar los datos del siguiente cliente
}
}
$mPDF1->Output('Reportes'."-".$this->id."-".date('Y-m-d-H-i-s'),'I'); //Nombre del pdf y parámetro para ver pdf o descargarlo directamente.</pre>
}
Pq sino vas a perder un value cada vez que cambies de identificador de cliente, y el próximo renderPartial debería darte un error pq en la vista intentarás mostras un índice del array que no existe…
Mira de hecho no me genera ningun error, cuando cambia el id el va y me hace el renderPartial con los datos de ese cliente, todo perfecto. Yo esa vista la estoy generando en una nueva pestaña en el navegador, pero supongo que el action no continua, por que ya no pasa nada más, simplemente me deja en el pdf generado y ps mi aplicacion no realiza nada más.
Y añadi lo que me dices que faltaba en el código, y si me hace el salto de pagina pero en blanco. Ya que despues de hacer un salto de pagina, se le debe enviar los datos que se escribiran en la nueva pagina.(que de hecho tu me enseñaste esa parte).
Si me queda claro. Entiende que tu el renderPartial no lo envías a ningun sitio, ya que como tercer parámetro le estás pasando true. Esto quiere decir que renderPartial no hace un echo, sino un return, con lo que no se imprime nada en el navegador.
Creo que tu problema es el bucle, ya que el código que viene después del renderPartial se está ejecutando.
Diría que sólo te está haciendo el bucle para el primer grupo de valores. La estructura que tú pones es para arrays unidimensionales, pero tú deberías tener un array multidimensional (array de arrays).
Prueba con:
.....
.....
$i = 0;
foreach($model as $fila)
{
if ($idcliente != $fila['cliente_idcliente'])
{
$idClente = $fila['cliente_idcliente'];
$mPDF1->WriteHTML($this->renderPartial('pdfReportMovimiento',
array('model'=>$cliente), true));
unset($cliente);
$mPDF1>AddPage();
$i = 0;
}
// Esto lo podrías hacer con un bucle con la estructura del que tú tienes, pero
// no veo que sea necesario.
$cliente[$i]['cliente_idcliente'] = $fila['cliente_idcliente'];
$cliente[$i]['nombre'] = $fila['nombre'];
$cliente[$i]['apellidos'] = $fila['apellidos'];
// Y todos los datos que tengas.
$i++;
.....
.....
Quiero darte las gracias por que sin tu ayuda no lo hubiera logrado, implemente lo utlimo que me aconsejaste con unas pequeñas variaciones, hasta que me funciono lo que necesitaba, ¡YA PUEDO GENERAR INFORMES SEPARADOS POR CADA CLIENTE!. Adjunto como quedo al final el controlador, y te cuento cuales fueron las variaciónes.
$mPDF1->SetDisplayMode('fullpage'); // Modo de visualizacion a pantalla completa.
...
...
...
$control = 0;//variable de control
$cliente = array();
$idcliente = $model[0]->cliente_idcliente;
$i = 0;// control del array
$contador=count($model); //Total de elementos que trae el modelo
foreach ($model as $key => $value){
$control++;// incremento en cada iteración
if ($idcliente != $value->cliente_idcliente) {
$idcliente = $value->cliente_idcliente;
$mPDF1->WriteHTML($this->renderPartial('pdfReportMovimiento',
array('model'=>$cliente), true));
unset($cliente);
$mPDF1->AddPage();
$i=0;
}
$cliente[$i]['tipopublicacion_idtipopublicacion'] = $value->tipopublicacionIdtipopublicacion->nombretipopublicacion;
$cliente[$i]['razonsocial'] = $value->clienteIdcliente->razonsocial;
$cliente[$i]['codigo'] = $value->clienteIdcliente->clientecod;
$cliente[$i]['fechamov'] = $value->fechamov;
$cliente[$i]['entrega'] = $value->entrega;
$cliente[$i]['devolucion'] = $value->devolucion;
$cliente[$i]['faltante'] = $value->faltante;
$cliente[$i]['vlrunitario'] = $value->vlrunitario;
$cliente[$i]['vlrdia'] = $value->vlrdia;
$cliente[$i]['nit'] = $value->clienteIdcliente->cedulanit;//cargo los datos que necesito
$i++;
if ($control == $contador) { //si es la ultima iteracion del bucle hago el renderPartial, de lo contrario no se cargaria el ultimo cliente, ya que en esa ultima iteracion el idcliente no cambiaria.
$mPDF1->WriteHTML($this->renderPartial('pdfReportMovimiento',
array('model'=>$cliente), true));
unset($cliente);
}
}
$mPDF1->Output('Reportes'."-".$this->id."-".date('Y-m-d-H-i-s'),'I');