Paginación en Symfony2

Seguimos desarrollando nuestra aplicación tipo blog con Symfony2, en este caso vamos a ver como listar los posts incluyendo la paginación en Symfony2.

Primero crearemos la ruta, que ya teníamos definida de antes.

inicio:
    pattern:  /
    defaults: { _controller: WebBlogBundle:Posts:index, page:1 }

home:
    pattern:  /inicio/{page}
    defaults: { _controller: WebBlogBundle:Posts:index, page:1 }

Ahora crearemos un nuevo método en el repositorio de la entidad Posts que listará y paginará los posts.

public function getPaginatePosts($pageSize=3,$currentPage){
        $em=$this->getEntityManager();
        
        //Consulta DQL
        $dql = "SELECT p FROM Web\BlogBundle\Entity\Posts p ORDER BY p.id DESC";
        $query = $em->createQuery($dql)
                               ->setFirstResult($pageSize * ($currentPage - 1))
                               ->setMaxResults($pageSize);

        $paginator = new Paginator($query, $fetchJoinCollection = true);

        return $paginator;
    }

Así de simple, después en la acción del controlador solo tendremos que invocar a este método.

public function indexAction($page) {
        //Entity Manager
        $em = $this->getDoctrine()->getManager();
        
        //Repositorios de entidades a utilizar
        $categoryRepository=$em->getRepository("WebBlogBundle:Categories");
        $postRepository=$em->getRepository("WebBlogBundle:Posts");
        
        //Conseguir todas las categorías
        $categories=$categoryRepository->findAll();
        
        //Conseguir todos los posts paginados
        $pageSize=3;
        $paginator=$postRepository->getPaginatePosts($pageSize,$page);
        $totalItems = count($paginator);
        $pagesCount = ceil($totalItems / $pageSize);
        
        /*
         * Ejemplo de conseguir todas las 
         * etiquetas asignadaas al post 
         * con relación OneToMany en PHP:
         * 
            foreach($posts as $p){
                $tags=$p->getTagsPosts();
                foreach($tags as $t){
                    var_dump($t->getTag()->getName());
                }
            }
         * 
         */
        
        //Renderizamos la vista
        return $this->render('WebBlogBundle:Posts:index.html.twig', array(
            "categories"=>$categories,
            "posts"     => $paginator,
            "totalItems" => $totalItems,
            "pagesCount" => $pagesCount
        ));
    }

En la vista recorremos los posts y montamos los links de paginación.

{% extends "::plantilla.html.twig" %}

{%block categorias%}
        {% for category in categories %}
             <li><a href="#">{{ category.name }}</a></li>
        {% endfor %}
{%endblock%}

{%block content %}
                 <h3>Inicio</h3>
                 <hr/>
        {% for post in posts %}
             <article class="post">
                 <div class="image col-lg-2 col-md-2 col-sm-2 col-xs-2" style="width:180px; height: 180px; overflow: hidden">
                     <img src="{{ post.webPath }}" class="img" />
                 </div>
                 
                 <div class="post_content col-lg-10 col-md-8 col-sm-8 col-xs-8">
                    <h3><a href="#">{{ post.title }}</a></h3>
                    <p>Categoría: {{ post.category.name }}</p>
                    <p>Autor: {{ post.user.name }}</p>
                    <p>
                       Etiquetas:
                       {% for tags in post.tagsPosts %}
                           {{ tags.tag.name }}
                       {% endfor %}
                   </p>
                   <p>
                       <a href="{{ path('edit_post', {'post': post.id}) }}" class="btn btn-warning">Editar</a>
                       <a href="{{ path('delete_post', {'post': post.id}) }}" class="btn btn-danger">Eliminar</a>
                   </p>
                </div>
                <div class="clearfix"></div>
             </article>
            <hr/>
        {% endfor %}
            
        <ul class="pagination">
          <li><a href="#">&laquo;</a></li>
            {% for i in 1..pagesCount %}
                <li><a href="{{ path('home', {'page': i}) }}">{{ i }}</a></li> 
            {% endfor %}
          <li><a href="#">&raquo;</a></li>
        </ul>

{%endblock%}

Quedaría así:
paginación con symfony2

Más información:
Doctrine 2 Paginator

Víctor Robles WEB

Autor: Victor

Desarrollador web - Formador online - Blogger

Compartir este post