Paginación en Yii Framework

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"),
    )
);
?>

paginacion en yii framework

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

Victor

Autor: Victor

Desarrollador web - Formador online - Blogger

Compartir este post

Poner un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *