TolerantX's Blog

Y sin embargo se mueve

Paginar resultados con Zend_Paginator

Posted on | Septiembre 29, 2008 | 7 Comments

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

Comments

7 Responses to “Paginar resultados con Zend_Paginator”

  1. artzneo
    Octubre 28th, 2008 @ 3:13 pm

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

  2. arturo
    Octubre 29th, 2008 @ 3:27 pm

    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.

  3. ymsf
    Noviembre 12th, 2009 @ 2:24 pm

    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

  4. tolerantx
    Noviembre 12th, 2009 @ 3:09 pm

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

  5. Andres
    Noviembre 22nd, 2009 @ 11:21 am

    buenisimo funciono de maravilla, muchas gracias!!

  6. Andres
    Noviembre 22nd, 2009 @ 11:25 am

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

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

    por

    $productos = $producto->fetchAll();

    good bytes

  7. Ramiro
    Mayo 12th, 2010 @ 4:19 pm

    Excelente blog este tutorial a pesar del tiempo , sigue funcionando :D espero alguna actualizacion para tener en cuenta, muchos saludos y exitos

Leave a Reply





  • Mi Twitter

    tolerantx
  • Delicious

    • No bookmarks avaliable.