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














