Paginar resultados con Zend_Paginator
- septiembre 29th, 2008
- Publicado en PHP . Programación . Zend Framework
- Publicar un comentario
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
- application
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 :-).
duermo desnudo con la luz encendida y la ventana abierta… acaso, eso es normal?
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.
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?
buenisimo funciono de maravilla, muchas gracias!!
ahh por si acaso para que funcione cambie la linea del controlador donde dice
$productos = $producto->fetchAll()->toArray();
por
$productos = $producto->fetchAll();
good bytes
Excelente blog este tutorial a pesar del tiempo , sigue funcionando 😀 espero alguna actualizacion para tener en cuenta, muchos saludos y exitos
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
Bien me funciono.. Verdad.. a pesar del tiempo que paso sigue funcionando.
Gracias.
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
Gracias por tu artículo, lo había intentado en otras ocaciones… pero a la tercera es la vencida.
Muchas Gracias.