Diferencia entre revisiones de «Paginadores»
(Removido adición de paginadores multiples) |
|||
(No se muestran 13 ediciones intermedias de 6 usuarios) | |||
Línea 5: | Línea 5: | ||
Para array: | Para array: | ||
− | $s : array a paginar | + | |
− | page: numero de página | + | '''$s''' : array a paginar. |
− | per_page: cantidad de elementos por página | + | |
+ | '''page''': numero de página. | ||
+ | |||
+ | '''per_page''': cantidad de elementos por página. | ||
'''Ejemplo:''' | '''Ejemplo:''' | ||
<source lang=php line> | <source lang=php line> | ||
− | $page = paginate($ | + | $page = paginate($s, 'per_page: 5', 'page: 1'); |
</source> | </source> | ||
Para modelo: | Para modelo: | ||
− | $s: string con nombre de modelo | + | |
− | page: | + | '''$s''': string con nombre de modelo u objeto ActiveRecord. |
− | per_page: cantidad de elementos por página | + | |
+ | '''page''': número 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 | Asimismo recibe todos los parámetros que pueden utilizarse en el método “find” de | ||
ActiveRecord. | ActiveRecord. | ||
Línea 31: | Línea 38: | ||
Efectúa paginación a través de una consulta sql. Recibe los siguientes parámetros: | Efectúa paginación a través de una consulta sql. Recibe los siguientes parámetros: | ||
− | $model: string nombre de modelo o objeto ActiveRecord | + | '''$model''': string nombre de modelo o objeto ActiveRecord. |
− | $sql: string consulta sql | + | '''$sql''': string consulta sql. |
'''Ejemplo:''' | '''Ejemplo:''' | ||
Línea 42: | Línea 49: | ||
Ambos tipos de paginadores retornan un objeto “page”, este objeto “page” es creado a | Ambos tipos de paginadores retornan un objeto “page”, este objeto “page” es creado a | ||
partir de stdClass, contiene los siguientes atributos: | 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”. | + | '''next''': número de página siguiente, si no hay pagina siguiente vale “false”. |
− | current: número de página actual. | + | |
− | total: número de paginas totales. | + | '''prev''': número de página anterior, si no hay pagina anterior vale “false”. |
− | items: array de elementos paginados. | + | |
+ | '''current''': número de página actual. | ||
+ | |||
+ | '''total''': número de paginas totales. | ||
+ | |||
+ | '''items''': array de elementos paginados. | ||
==Paginando en ActiveRecord== | ==Paginando en ActiveRecord== | ||
Línea 54: | Línea 66: | ||
'''Ejemplo:''' | '''Ejemplo:''' | ||
<source lang=php line> | <source lang=php line> | ||
− | $page = $this> | + | $page = $this->Usuario->paginate('per_page: 5', 'page: 1'); |
− | Usuario> | ||
− | paginate('per_page: 5', 'page: 1'); | ||
</source> | </source> | ||
− | |||
− | |||
==Ejemplo completo de uso del paginador:== | ==Ejemplo completo de uso del paginador:== | ||
Línea 68: | Línea 76: | ||
<source lang=php line> | <source lang=php line> | ||
class UsuarioController extends ApplicationController { | class UsuarioController extends ApplicationController { | ||
− | private $_per_page = 7; | + | private $_per_page = 7; |
− | /** | + | /** |
− | * Formulario de busqueda | + | * Formulario de busqueda |
− | **/ | + | **/ |
− | public function buscar() { | + | public function buscar() { |
− | $this> | + | $this->nullify('page', 'conditions'); |
− | nullify('page', 'conditions'); | + | } |
− | } | + | /** |
− | /** | + | * Paginador |
− | * Paginador | + | **/ |
− | **/ | + | public function lista($page='') { |
− | public function lista($page='') { | + | /** |
− | /** | + | * Cuando se efectua la busqueda por primera vez |
− | * Cuando se efectua la busqueda por primera vez | + | **/ |
− | **/ | + | if($this->has_post('usuario')) { |
− | if($this> | + | $usuario = $this->post('usuario', 'trim', 'addslashes'); |
− | has_post('usuario')) { | + | if($usuario['nombre']) { |
− | $usuario = $this> | + | $this->conditions = “ nombre LIKE '%{$usuario['nombre']}%' ”; |
− | post('usuario', 'trim', 'addslashes'); | + | } |
− | if($usuario['nombre']) { | + | /** |
− | $this> | + | * Paginador con condiciones o sin condiciones |
− | conditions = “ nombre LIKE '%{$usuario['nombre']}%' ”; | + | **/ |
− | } | + | if(isset($this->conditions) && $this->conditions) { |
− | /** | + | $this->page = $this->Usuario->paginate($this->conditions, “per_page: $this>_per_page”, 'page: 1'); |
− | * Paginador con condiciones o sin condiciones | + | } else { |
− | **/ | + | $this->page = $this->Usuario->paginate(“per_page: $this>_per_page”, 'page: 1'); |
− | if(isset($this> | + | } |
− | conditions) && $this> | + | } elseif($page='next' && isset($this->page) && $this->page->next) { |
− | conditions) { | + | /** |
− | $this> | + | * Paginador de pagina siguiente |
− | page = $this> | + | **/ |
− | Usuario> | + | if(isset($this->conditions) && $this->conditions) { |
− | paginate($this> | + | $this->page = $this->Usuario->paginate($this->conditions, “per_page: $this>_per_page”, “page: {$this->page->next}”); |
− | conditions, “per_page: | + | } else { |
− | $this> | + | $this->page = $this->Usuario->paginate(“per_page: $this->_per_page”, “page: {$this->page->next}”); |
− | + | } | |
− | } else { | + | } elseif($page='prev' && isset($this->page) && $this->page->prev) { |
− | $this> | + | /** |
− | page = $this> | + | * Paginador de pagina anterior |
− | Usuario> | + | **/ |
− | paginate(“per_page: $this> | + | if(isset($this->conditions) && $this->conditions) { |
− | + | $this->page = $this->Usuario->paginate($this->conditions, “per_page: $this->_per_page”, “page: {$this->page->prev}”); | |
− | 'page: 1'); | + | } else { |
− | } | + | $this->page = $this->Usuario->paginate(“per_page: $this->_per_page”, “page: {$this->page->prev}”); |
− | } 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> | ||
− | |||
− | page> | ||
− | next}”); | ||
− | } else { | ||
− | $this> | ||
− | page = $this> | ||
− | Usuario> | ||
− | paginate(“per_page: $this> | ||
− | |||
− | “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> | ||
− | |||
− | page> | ||
− | prev}”); | ||
− | } else { | ||
− | $this> | ||
− | page = $this> | ||
− | Usuario> | ||
− | paginate(“per_page: $this> | ||
− | |||
− | “page: {$this> | ||
− | page> | ||
− | prev}”); | ||
− | } | ||
− | } | ||
− | } | ||
} | } | ||
</source> | </source> | ||
Línea 192: | Línea 143: | ||
<th>nombre</th> | <th>nombre</th> | ||
</tr> | </tr> | ||
− | <?php foreach($page> | + | <?php foreach($page->items as $p): ?> |
− | items as $p): ?> | ||
<tr> | <tr> | ||
− | <td><?php echo $p> | + | <td><?php echo $p->id ?></td> |
− | id ?></td> | + | <td><?php echo h($p->nombre) ?></td> |
− | <td><?php echo h($p> | ||
− | nombre) ?></td> | ||
</tr> | </tr> | ||
<?php endforeach; ?> | <?php endforeach; ?> | ||
</table> | </table> | ||
<br> | <br> | ||
− | <?php if($page> | + | <?php if($page->prev) echo link_to('usuario/lista/prev', 'Anterior') ?> |
− | prev) echo link_to('usuario/lista/prev', 'Anterior') ?> | + | <?php if($page->next) echo ' | ' . link_to('usuario/lista/next', 'Siguiente') ?> |
− | <?php if($page> | ||
− | next) echo ' | ' . link_to('usuario/lista/next', 'Siguiente') ?> | ||
</source> | </source> |
Revisión actual del 16:04 17 mar 2013
Para la paginación existen dos funciones encargadas de esto:
Sumario
Paginate[editar]
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($s, 'per_page: 5', 'page: 1');
Para modelo:
$s: string con nombre de modelo u objeto ActiveRecord.
page: número 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[editar]
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[editar]
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:[editar]
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') ?>