Paginadores
Para la paginación existen dos funciones encargadas de esto:
Sumario
Paginate
Este es capaz de paginar arrays o modelos, recibe los siguientes parámetros:
Para array: $s : array a paginar page: numero de página per_page: cantidad de elementos por página
Ejemplo:
$page = paginate($a, 'per_page: 5', 'page: 1');
Para modelo: $s: string con nombre de modelo o objeto ActiveRecord page: numero de página per_page: cantidad de elementos por página Asimismo recibe todos los parámetros que pueden utilizarse en el método “find” de ActiveRecord.
Ejemplos:
$page = paginate('usuario', 'NOT login=”admin”', 'order: login ASC', 'per_page:
5', 'page: 1');
$page = paginate($this>
Usuario, 'NOT login=”admin”', 'order: login ASC',
'per_page: 5', 'page: 1');
Paginate_by_sql
Efectúa paginación a través de una consulta sql. Recibe los siguientes parámetros:
$model: string nombre de modelo o objeto ActiveRecord
$sql: string consulta sql
Ejemplo:
$page = paginate_by_sql('usuario', 'SELECT * FROM usuario WHERE nombre LIKE
“%emilio%” ', 'per_page: 5', 'page: 1');
Ambos tipos de paginadores retornan un objeto “page”, este objeto “page” es creado a partir de stdClass, contiene los siguientes atributos: next: número de página siguiente, si no hay pagina siguiente vale “false”. prev: número de página anterior, si no hay pagina anterior vale “false”. current: número de página actual. total: número de paginas totales. items: array de elementos paginados.
Paginando en ActiveRecord
ActiveRecord ya trae integrado los métodos paginate y paginate_by_sql, se comportan igual que paginate y paginate_by_sql, sin embargo no es necesario pasar el modelo a paginar ya que por defecto toman el modelo que invoca.
Ejemplo:
$page = $this>
Usuario>
paginate('per_page: 5', 'page: 1');
Ejemplo completo de uso del paginador:
Tenemos una tabla usuario con su correspondiente modelo Usuario, entonces creemos un controlador el cual pagine una lista de usuarios y asimismo permita buscar por nombre, aprovecharemos la persistencia de datos del controlador para hacer una paginación inmune a inyección sql. En el controlador:
class UsuarioController extends ApplicationController {
private $_per_page = 7;
/**
* Formulario de busqueda
**/
public function buscar() {
$this>
nullify('page', 'conditions');
}
/**
* Paginador
**/
public function lista($page='') {
/**
* Cuando se efectua la busqueda por primera vez
**/
if($this>
has_post('usuario')) {
$usuario = $this>
post('usuario', 'trim', 'addslashes');
if($usuario['nombre']) {
$this>
conditions = “ nombre LIKE '%{$usuario['nombre']}%' ”;
}
/**
* Paginador con condiciones o sin condiciones
**/
if(isset($this>
conditions) && $this>
conditions) {
$this>
page = $this>
Usuario>
paginate($this>
conditions, “per_page:
$this>_
per_page”, 'page: 1');
} else {
$this>
page = $this>
Usuario>
paginate(“per_page: $this>_
per_page”,
'page: 1');
}
} elseif($page='next' && isset($this>
page) && $this>
page>
next) {
/**
* Paginador de pagina siguiente
**/
if(isset($this>
conditions) && $this>
conditions) {
$this>
page = $this>
Usuario>
paginate($this>
conditions, “per_page:
$this>_
per_page”, “page: {$this>
page>
next}”);
} else {
$this>
page = $this>
Usuario>
paginate(“per_page: $this>_
per_page”,
“page: {$this>
page>
next}”);
}
} elseif($page='prev' && isset($this>
page) && $this>
page>
prev) {
/**
* Paginador de pagina anterior
**/
if(isset($this>
conditions) && $this>
conditions) {
$this>
page = $this>
Usuario>
paginate($this>
conditions, “per_page:
$this>_
per_page”, “page: {$this>
page>
prev}”);
} else {
$this>
page = $this>
Usuario>
paginate(“per_page: $this>_
per_page”,
“page: {$this>
page>
prev}”);
}
}
}
}
En la vista buscar.pthml
<?php echo form_tag('usuario/lista') ?>
<?php echo text_field_tag('usuario.nombre') ?>
<?php echo submit_tag('Consultar') ?>
<?php echo end_form_tag() ?>
En la vista lista.phtml
<table>
<tr>
<th>id</th>
<th>nombre</th>
</tr>
<?php foreach($page>
items as $p): ?>
<tr>
<td><?php echo $p>
id ?></td>
<td><?php echo h($p>
nombre) ?></td>
</tr>
<?php endforeach; ?>
</table>
<br>
<?php if($page>
prev) echo link_to('usuario/lista/prev', 'Anterior') ?>
<?php if($page>
next) echo ' | ' . link_to('usuario/lista/next', 'Siguiente') ?>