Paginadores

De KumbiaPHP Framework Wiki
Saltar a: navegación, buscar

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:

  1. $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:

  1. $page = paginate('usuario', 'NOT login=”admin”', 'order: login ASC', 'per_page: 5', 'page: 1');
  2. $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:

  1. $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:

  1. $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:

  1. class UsuarioController extends ApplicationController {
  2.   private $_per_page = 7;
  3.   /**
  4.   * Formulario de busqueda
  5.   **/
  6.   public function buscar() {
  7.     $this->nullify('page', 'conditions');
  8.   }
  9.   /**
  10.   * Paginador
  11.   **/
  12.   public function lista($page='') {
  13.     /**
  14.     * Cuando se efectua la busqueda por primera vez
  15.     **/
  16.     if($this->has_post('usuario')) {
  17.       $usuario = $this->post('usuario', 'trim', 'addslashes');
  18.       if($usuario['nombre']) {
  19.         $this->conditions = “ nombre LIKE '%{$usuario['nombre']}%';
  20.       }
  21.       /**
  22.       * Paginador con condiciones o sin condiciones
  23.       **/
  24.       if(isset($this->conditions) && $this->conditions) {
  25.         $this->page = $this->Usuario->paginate($this->conditions, “per_page: $this>_per_page”, 'page: 1');
  26.       } else {
  27.         $this->page = $this->Usuario->paginate(“per_page: $this>_per_page”, 'page: 1');
  28.       }
  29.     } elseif($page='next' && isset($this->page) && $this->page->next) {
  30.        /**
  31.        * Paginador de pagina siguiente
  32.        **/
  33.       if(isset($this->conditions) && $this->conditions) {
  34.         $this->page = $this->Usuario->paginate($this->conditions, “per_page: $this>_per_page”, “page: {$this->page->next});
  35.       } else {
  36.          $this->page = $this->Usuario->paginate(“per_page: $this->_per_page”, “page: {$this->page->next});
  37.       }
  38.     } elseif($page='prev' && isset($this->page) && $this->page->prev) {
  39.       /**
  40.       * Paginador de pagina anterior
  41.       **/
  42.       if(isset($this->conditions) && $this->conditions) {
  43.         $this->page = $this->Usuario->paginate($this->conditions, “per_page: $this->_per_page”, “page: {$this->page->prev});
  44.     } else {
  45.        $this->page = $this->Usuario->paginate(“per_page: $this->_per_page”, “page: {$this->page->prev});
  46.     }
  47.   }
  48.  }
  49. }


En la vista buscar.pthml

  1. <?php echo form_tag('usuario/lista') ?>
  2. <?php echo text_field_tag('usuario.nombre') ?>
  3. <?php echo submit_tag('Consultar') ?>
  4. <?php echo end_form_tag() ?>


En la vista lista.phtml

  1. <table>
  2. <tr>
  3. <th>id</th>
  4. <th>nombre</th>
  5. </tr>
  6. <?php foreach($page->items as $p): ?>
  7. <tr>
  8. <td><?php echo $p->id ?></td>
  9. <td><?php echo h($p->nombre) ?></td>
  10. </tr>
  11. <?php endforeach; ?>
  12. </table>
  13. <br>
  14. <?php if($page->prev) echo link_to('usuario/lista/prev', 'Anterior') ?>
  15. <?php if($page->next) echo ' | ' . link_to('usuario/lista/next', 'Siguiente') ?>