Vamos a ver como paginar registros con Yii esta es una herramienta muy importante dentro de un Framework.
La paginación en Yii puede hacerse de dos formas, que veremos a continuación.
Paginación con CdbCriteria
De esta forma se nos obliga a utilizar Active Record y sus métodos find para hacer las consultas, para hacer paginaciones de forma rápida y de una sola tabla seria una buena opción.
El controlador:
public function actionIndex(){ $criteria=new CDbCriteria(); $count=Usuarios::model()->count($criteria); //Le pasamos el total de registros de la tabla $pages=new CPagination($count); // Resultados por página $pages->pageSize=2; $pages->applyLimit($criteria); $getUsuarios=Usuarios::model()->findAll($criteria); $this->render('index',array( "usuarios"=>$getUsuarios, "pages"=>$pages )); }
Paginación menos automática
De esta forma no delegamos al ORM los limites de la consulta sino que los hacemos nosotros.
El controlador:
public function actionIndex(){ //Paginación menos automática $count=$this->usuarios->countRegistros(); $pages=new CPagination($count); $cantidad=$pages->pageSize=2; if(!isset($_GET["page"])){ $_GET["page"]=1; } $inicio=($_GET["page"]-1)*$cantidad; $getUsuarios=$this->usuarios->getUsuarios($inicio,$cantidad); //$this->render('index',compact("pages","datos")); $this->render('index',array( "usuarios"=>$getUsuarios, "pages"=>$pages )); }
En el modelo:
public function countRegistros(){ $count=$this->connection->createCommand() ->select("count(id) as 'count' ")->from('usuarios')->queryAll(); return $count[0]["count"]; } public function getUsuarios($inicio,$cantidad){ $this->getUsuarios=$this->connection ->createCommand("SELECT * FROM usuarios LIMIT $inicio,$cantidad") ->queryAll(); return $this->getUsuarios; }
En ambos casos, utilizamos la misma vista:
<?php <div class="col-xs-9"> <h2 style="display: inline;">Crud con Yii Framework</h2></div> <div class="col-xs-3"> <a class="btn btn-success" href="<?=Yii::app()->request->baseUrl?>/crud/add"> Añadir nuevo usuario </a> </div> <div style="clear:both"></div> <hr/> <table class="table table-striped"> <tr> <th>ID</th> <th>NOMBRE</th> <th>APELLIDOS</th> <th>EMAIL</th> <th>PASSWORD</th> <th>EDITAR</th> <th>ELIMINAR</th> </tr> <?php foreach ($usuarios as $usuario) { ?> <tr> <td><?=$usuario["id"]?></td> <td><?=$usuario["nombre"]?></td> <td><?=$usuario["apellido"]?></td> <td><?=$usuario["email"]?></td> <td><?=substr($usuario["password"],0,18)?></td> <td> <a class="btn btn-primary" href="<?=Yii::app()->request->baseUrl?>/crud/modificar/<?=$usuario["id"]?>"> <span class="glyphicon glyphicon-edit"></span> </a> </td> <td> <a class="btn btn-danger" href="<?=Yii::app()->request->baseUrl?>/crud/eliminar/<?=$usuario["id"]?>"> <span class="glyphicon glyphicon-trash"></span> </a> </td> </tr> <?php } ?> </table> <?php if(!isset($_GET["page"])){ $_GET["page"]=1; } //Pinta los enlaces del paginador $this->widget( 'CLinkPager', array( 'pages' => $pages, 'maxButtonCount'=>"3:3", //Rango de links de paginas a mostrar 'header' =>"<div class='paginacion'>", 'footer' =>"</div>", 'nextPageLabel'=>"Siguiente", 'prevPageLabel'=>"Anterior", "firstPageLabel"=>"Primera", "lastPageLabel"=>"Última", "selectedPageCssClass"=>"active", "hiddenPageCssClass"=>"disable", "htmlOptions"=>array("class"=>"pagination"), ) ); ?>
Más información:
http://www.yiiframework.com/doc/api/1.1/CDbCriteria
http://www.yiiframework.com/doc/api/1.1/CPagination/
http://www.kileev.com/2013/02/how-to-change-page-buttons-number-in.html