lunes, septiembre 29, 2008

Paginar resultados con Zend_Paginator

Tengo poco incursionando en el Zend Framework y tuve la necesidad, como casi siempre, de paginar las consultas de la base de datos, investigando me di cuenta de que ZF ya cuenta con ésta característica y me puse manos a la obra.
Primero que nada el árbol de mi sistema lo tengo de la siguiente manera:
  • App

    • application

      • controllers
      • models
      • views
    • library

      • Zend
    • public

      • images
      • scripts
      • styles
Si eres nuevo como yo aquí está una excelente guia para iniciar Desarrolo de aplicaciones con Zend Framework o bien Multimedia: Tutorial Screencasts (éste último videos en inglés).
Primero cargamos las clases que necesitamos en el Bootstrap (archivo de arranque de configuración):
En mi caso hice una tabla llamada productos donde contiene una columna llamada “nombre_producto”, para esto agregamos nuestra tabla productos en la carpeta models/Productos.php con lo siguiente:
<?php 
class Producto extends Zend_Db_Table 
{
 protected $_name = 'productos'; 
}
?>
Creamos nuestro controlador en application/controllers/indexController.php y quedaría de la siguiente manera:
<?php
class IndexController extends Zend_Controller_Action 
{
 public function indexAction()
 {
  Zend_Loader::loadClass('Producto');
  $producto = new Producto();

  // obtenemos la página actual
  $page = $this->_getParam('page', 1);  
  // número de registros a mostrar por página
  $registros_pagina = 20;
  // número máximo de páginas a mostrar en el paginador
  $rango_paginas = 10; 
  
  $productos = $producto->fetchAll()->toArray();

  $paginador = Zend_Paginator::factory($productos);
  $paginador->setItemCountPerPage($registros_pagina)
         ->setCurrentPageNumber($page)
         ->setPageRange($rango_paginas);
  
  $this->view->productos = $paginador;
 }
}
?>
Creamos el archivo en el cual se mostrará nuestra información en application/views/index/index.phtml:
<?php
echo $this->paginationControl($this->productos,'Sliding', 
'index/pagination/pagination_control.phtml');
?>
<table>
 <tr>
  <td>Nombre Producto</td>
 </tr>
 <?php foreach($this->productos as $producto): ?>
 <tr>
  <td><?php echo $producto['nombre_producto']; ?></td>
 </tr>
</table>  <?php endforeach; ?>
Por último añadimos el pagination control, yo lo coloqué en application/views/index/pagination/pagination_control.phtml, aquí puedes encontrar otros dos tipos o bien crear el tuyo propio:
<?php
if ($this->pageCount): ?>
 <div class="paginationControl">
  <!-- Previous page link -->
  <?php if (isset($this->previous)): ?>
  <a href="<?php echo $this->url(array('page' => $this->previous)); ?>">< Previous</a> | 
  <?php else: ?> <span class="disabled">< Previous</span> | 
  <?php endif; ?>

  
  <!-- Numbered page links -->
  <?php foreach ($this->pagesInRange as $page): 
   if ($page != $this->current): ?>
    <a href="<?php echo $this->url(array('page' => $page)); ?>"><?php echo $page; ?></a> |
   <?php else: ?>
    <?php echo $page; ?> |
   <?php endif; ?>
  <?php endforeach; ?>

  
  <!-- Next page link -->
  <?php if (isset($this->next)): ?>
   <a href="<?php echo $this->url(array('page' => $this->next)); ?>">Next ></a>
  <?php else: ?>
   <span class="disabled">Next ></span>
  <?php endif; ?>
 </div>
<?php endif; ?>
Ésta entrada la hice basándome en la documentación oficial de Zend Framework, espero les sea de utilidad :-).

No hay comentarios.: