viernes, 20 de abril de 2012

Zend - Paginar resultados

Según vallamos insertando datos llegara un momento en que tengamos demasiados, como para poderlos mostrar de una vez, y si lo hacemos sobrecargaríamos demasiado la pagina, Zend también ha pensado en ello, y nos pone a nuestra disposición su Paginator
Podemos ver todas las Herramientas que tiene Zend en:
http://framework.zend.com/manual/en/
Concretamente vamos a hablar del paginador, así que iremos a:
http://framework.zend.com/manual/en/zend.paginator.usage.html


Si bajamos hasta aproximadamente el centro de la pagina, veremos un ejemplo que se llama Search Paginator, es el mas común y el que vamos a usar en nuestro ejemplo, aunque podemos coger cualquier otro.

Lo primero que necesitaremos sera crear la vista del paginador, para ello crearemos una carpeta con el nombre Paginador, dentro de: application/views/scripts
y dentro de paginador un nuevo archivo llamado items.phtml, en el que pegaremos el código de la pagina de zend; este es el que nosotros hemos elegido:

  1. <?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)); ?>">
        &lt; Previous
      </a> |
    <?php else?>  <span class="disabled">&lt; 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 &gt;
      </a>
    <?php else?>  <span class="disabled">Next &gt;</span>
    <?php endif?></div>
    <?php endif?>
    Ahora que ya tenemos la vista creada, empezaremos a decirle a nuestra aplicación que nos valla paginando los datos, para ello iremos al controlador
    application/controllers, y abriremos TablaPruebaController.php, y buscaremos la funcion mostrartodoAction, y sustituiremos sus datos por los de a continuación:

        public function mostrartodoAction()    {        $model = new Application_Model_PruebaZF();        $TablaPrueba  = $model -> ObtenerTodo();                Zend_View_Helper_PaginationControl::setDefaultViewPartial('paginador/items.phtml');        $paginador = Zend_Paginator::factory($TablaPrueba);                if ($this->_hasParam('page')){            $paginador->setCurrentPageNumber($this->_getParam('page'));        }                $this->view->paginador=$paginador;                }
    En donde el pasamos la ruta de la vista que hemos creado, y le preguntamos si nos viene el parámetro page, en caso afirmativo le decimos a la vista que la pagina actual es la que viene por dicho parámetro

    El siguiente paso lo haremos en nuestra vista; por lo que iremos hasta application/views/scripts/tablaprueba y abriremos mostrartodo.phtml

    Deberemos sustituir las lineas 13 y 14

            if(count($this->TablaPrueba)>0){
                foreach ($this->TablaPrueba as $datos) {
    por las siguientes:
            if(count($this->paginador)>0){
                foreach ($this->paginador as $datos) { 
    Simplemente llamamos al paginador, en lugar de a los datos de la tabla; al final del documento deberemos pegar también esto:

        <?php
        if(count($this->paginador)){
            echo $this->paginador;
        }
        ?>
     Con esto ya tenemos nuestro paginador funcionando