Diferencia entre revisiones de «Paginadores»

De KumbiaPHP Framework Wiki
(Removido adición de paginadores multiples)
 
(No se muestran 14 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($a, 'per_page: 5', 'page: 1');
+
$page = paginate($s, 'per_page: 5', 'page: 1');
 
</source>
 
</source>
  
 
Para modelo:
 
Para modelo:
$s: string con nombre de modelo o objeto ActiveRecord
+
 
page: numero de página
+
'''$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:'''
 
<source lang=php line>
 
<source lang=php line>
$page = paginate_by_sql('usuario', 'SELECT * FROM usuario WHERE nombre LIKE
+
$page = paginate_by_sql('usuario', 'SELECT * FROM usuario WHERE nombre LIKE “%emilio%” ', 'per_page: 5', 'page: 1');
“%emilio%” ', 'per_page: 5', 'page: 1');
 
 
</source>
 
</source>
  
 
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”.
 
current: número de página actual.
 
total: número de paginas totales.
 
items: array de elementos paginados.
 
  
 +
'''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==
 
==Paginando en ActiveRecord==
Línea 56: 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 70: 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}”);
per_page”, 'page: 1');
+
      }
} 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) {
per_page”,
+
        $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>_
 
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}”);
 
}
 
}
 
}
 
 
}
 
}
 
</source>
 
</source>
Línea 194: 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:

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') ?>