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): ?>
  <?php 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 :-) .

6 comentarios para “Paginar resultados con Zend_Paginator”

  • duermo desnudo con la luz encendida y la ventana abierta… acaso, eso es normal?

  • arturo:

    hola………
    muy buena justo lo que buscaba ehhhhhhhh como anillo al dedo.
    Bueno el proyecto que estoy realizando es un videoclub y toy en el modulo OPERADOR, el cual en la pagina principal del operador era mostrar el primer cliente de la lista, para lo cual necesitaba un paginador que ahora lo tengo gracias a tu blog. ahora tengo otro problema necesito que una opcion del sidebar obtenga el ID del cliente que se encuentra en el contenido de la pagina de la lista que te mencione anteriormente y utilizar ese ID para poder realizar operaciones como por ejemplo:
    -nuevo alquiler
    -nueva venta
    -etc etc.
    apreciaria mucha tu ayuda.

  • ymsf:

    Hola que tal!!! estuve probando tu codigo y me muestra lo siguiente, pero no me muestra los productos que en mi cajo es usuarios.

    Nombre Producto
    en el controlador tengo lo siguiente:

    public function indexAction()
    {
    //Zend_Loader::loadClass(‘DbTable_Ejemplo2′);
    $producto = new Default_Model_DbTable_Ejemplo2();

    // 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;
    }

    me cargo los productos en $paginador pero no me los muestra en la vista sera por Zend_Paginator::factory($productos);???? yo estoy usando la version 1.9.0 o como instancio el paginador de verdad no tengo idea de como es

    Gracias de antemano…. Hasta luego

  • No te aparece ningún error? cómo mandas imprimir los resultados en la vista?

  • Andres:

    buenisimo funciono de maravilla, muchas gracias!!

  • Andres:

    ahh por si acaso para que funcione cambie la linea del controlador donde dice

    $productos = $producto->fetchAll()->toArray();

    por

    $productos = $producto->fetchAll();

    good bytes

Deja un comentario

Calendario
Septiembre 2008
L M X J V S D
« Jul   Feb »
1234567
891011121314
15161718192021
22232425262728
2930  
Mi Twitter
tolerantx
  • TolerantX: @roxoroxo Yo pregunto el precio para decirles "¡¿y no le pierden?!" - posted on 09/03/2010 18:34:25
  • TolerantX: Post Edited: 1er Cardiomaratón 2010 http://cli.gs/q419j - posted on 08/03/2010 15:39:24
  • TolerantX: Ah!! inche librería de jquery de los servidores de google :@ - posted on 04/03/2010 17:03:29
  • TolerantX: @kamissama tas caón .... - posted on 03/03/2010 22:21:45
  • TolerantX: @roxoroxo Bien, con algunos problemas al momento de migrar el código pero ya van saliendo xD - posted on 03/03/2010 22:06:35