Incluir paginación en reporte personalizado

Buen día, tengo una duda en relación a como puedo incluir paginación en un reporte que he realizado de forma 100% personalizada.

Según he leído debo crear un widget, ¿cómo lo podría hacer?

Quedo atento a sus comentarios.

Muchas gracias.

Hola. Al haber hecho el reporte basandote en modelo MVC y con ayuda de este framework te hubiese bastado solamente con crear un dataProvider obtenido del modelo que representa a tu vista, y al usar el componente CListView entonces de inmediato tendrias paginador y…la capacidad de personalizar la presentacion de cada fila de la manera mas sencilla a la mas complicada.

por mas complicada que sea una vista del modelo de datos siempre podrá ser presentada en un modelo que yii pueda entender, cuando esto no es posible, entonces muy probablemente se este tomando la via incorrecta.

voy a asumir el siguiente caso:

si tienes una vista muy "complicada" como esta, y que además arroja 100.000 registros, por ejemplo:




select color.name, color.code,  shape.type, shape.design,  customer.name,  book.category from xrecords  

  left join color on color.idcolor = xrecords.idcolor 

  left join shape on shape.idshape = xrecords.idshape

  left join customer on customer.idcustomer = xrecords.idcustomer

  left join book on book.idbook = xrecords.idbook

lo primero que hay que olvidarse para siempre es andar usando el SQL directamente por todas partes, esto se simplifica

creando un modelo que represente a esa vista, y previamente crear de esa consulta de ejemplo una vista almacenada en el modelo de datos,

digamos que la llamamos: VRECORDS

"create view vrecords(colorname, shapetype, customername, bookcat) as EL_SQL_DE_ARRIBA"

lo segundo, crear un Modelo, usando el modulo Gii de YiiFramework. Este modelo se llamaría: "vrecords.php" y

contendría los atributos:




class VRecords extends CFormModel {

    public $colorname;

    public $shapetype;

    public $customername;

    public $bookcat;


   // demas codigo creado por Gii Generator module.

}



lo tercero, crear un action que busque y filtre los resultados deseados de entre esos 100.000 registros existentes

(llamarias a este action desde tu website asi: "http://tuwebsite.com/index.php?r=tucontroladora/mostrarvrecords" )

digamos:

en la controladora que tu selecciones:




public function actionMostrarVRecords(){


        // en el metodo search de VRecords puedes filtrar tus registros 

        //  usando CDbCriteria...olvidate del uso manual de SQL...o al menos, trata de usar el framework y sus clases..

      $resultados = VRecords::model()->search();   


 	// muestra los resultados en una vista

    $this->render('listavrecords',array('resultados'=>$resultados));

}



cuarto, defines la vista donde se mostraran los resultados, que luego el metodo render del action entregara al browser como un resultado HTML (tu reporte web por llamarlo de otro modo).

en la vista ‘listavrecords.php’, referenciada en el metodo render de tu action creado arriba, la cual residirá

en la carpeta application/protected/views/tucontroladora/listavrecords.php,

se escribe este codigo alli:

nota que $resultados es una variable que viene ya lista e inicializada, es pasada a tu vista porque tu en el metodo render la pasaste en un array, yii se encarga de pasar esa variable a tu vista…no importa si ahi hay 1.000.000 registros de resultados !!!, no estan en memoria…no estan desprotegidos…yii se encarga de eso, tu no.


<?php $this->widget('zii.widgets.CListView', array(

	'dataProvider'=>$resultados,

	'itemView'=>'_unafila',

)); ?>

y ademas como ves, requeriras crear el archivo ‘_unafila.php’ el cual contendrá CADA FILA de tu recordset (por llamarlo de otro modo),

por ejemplo:

—inicio archivo "_unafila.php"—


<h1>Este es un Registro del cliente: <?php echo "{$data->customername}"; ?></h1>

<?php echo "color: {$data->colorname}<br/>"; ?>

<?php echo "shape: {$data->shapetype}<br/>"; ?>

<?php echo "book {$data->bookcat}<br/>"; ?>

<hr/>  

—fin archivo "_unafila.php"—

Este archivo, ‘_unafila.php’, sera invocado por cada una de las filas de tu recordset, cada vez que se invoca trae consigo y listo para tu uso

una variable llamada "$data", la cual representa tu ROW, tu Recordset, por llamarlo al estilo de la vieja escuela.

Y…respecto a tu pregunta inicial…CListView trae ya su propio pager…y tu no tienes que hacer nada sino mirar como aparece de forma tan elegante.