Skip to content

29 septiembre, 2008

12

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

12 Comments Post a comment
  1. oct 28 2008

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

  2. arturo
    oct 29 2008

    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
    nov 12 2009

    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. nov 12 2009

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

  5. Andres
    nov 22 2009

    buenisimo funciono de maravilla, muchas gracias!!

  6. Andres
    nov 22 2009

    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
    may 12 2010

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

  8. Jose
    may 6 2011

    Excelente trabajo, funciono perfecto.
    Ahora tengo una pregunta, estoy paginando en un reporte, pero necesito que los totales sean la suma de todos los montos y no solo los que despliega en pantalla.

    Gracias

  9. JCesarrs
    jul 7 2011

    Bien me funciono.. Verdad.. a pesar del tiempo que paso sigue funcionando.

  10. jul 12 2012

    Gracias.

  11. Deivid
    ago 13 2012

    Esta genial! en cuanto a la paginación de resultados, tengo un inconveniente, al mandarlo a ese link en los que usas (‘rutadetrabajo’/page/1, rutadetrabajo’/page/2, etc…), aquí pierdo todos mis estilos (layout por defecto en todas mis páginas internas), por favor si me podrías decir como evito que se pierda el layout por defecto en estas nuevas páginas

  12. may 28 2013

    Gracias por tu artículo, lo había intentado en otras ocaciones… pero a la tercera es la vencida.

    Muchas Gracias.

Share your thoughts, post a comment.

(required)
(required)

Note: HTML is allowed. Your email address will never be published.

Subscribe to comments