ccc

Symfony: Paginación

En el controller:
// *********************************************
     public function getTotalTabla($tabla)
    {
          $datos = $this->getDoctrine()
                ->getManager()
                ->createQueryBuilder('edcBundle:'.$tabla)
                ->select('Count(c)')
                ->from('edcBundle:'.$tabla,'c')
                ->getQuery()
                ->getSingleScalarResult();
            return $datos;
    }
...
// **************************************
    public function listarCineastasAction(Request $request)
    {
        // check si está logado
        $session = $request->getSession();
        if(!$session->has("id")) {
            $this->get('session')->getFlashBag()->add(
                    'mensaje',
                    'Debe estar logueado para ver este contenido'
            );
            return $this->redirect($this->generateUrl('login'));
        }
       
        // Crear la paginación
        $total_count = $this->getTotalTabla('cineastas');
        $page = $request->get('page');
        $porpagina = 4;
        $totalPaginas = ceil($total_count/$porpagina);
        // echo "TOTALPAGINAS:".$totalPaginas;exit;
       
        if(!is_numeric($page))    {
            $page=1;
        }else
        {
            $page = floor($page);
        }
        if($total_count <= $porpagina)
        {
            $page=1;
        }
        if(($page*$porpagina) > $total_count)
        {
            $page = $totalPaginas;
        }
        $offset = 0;
        if($page > 1)
        {
            $offset = $porpagina*($page-1);
        }
        $em = $this->getDoctrine()
            ->getManager()
            ->createQueryBuilder('edcBundle:cineastas')
            ->select('c')
            ->from('edcBundle:cineastas','c')
            ->orderBy("c.nombre","asc")
            ->setFirstResult($offset)
            ->setMaxResults($porpagina)
            ->getQuery();
       
        $datos=$em->getArrayResult();
         return $this->render('edcBundle:Default:listarCineastas.html.twig',
                compact("datos", "porpagina", "totalPaginas", "total_count", "page"));
    }

La vista listarCineastas.html.twig (tienes que tener incluido Bootstrap):
{% extends 'edcBundle::viewEDC.html.twig' %}
{# En la vista de viewEDC ya tiene tanto el CSS como el JS de Bootstrap #}
{% block body %}
    {{ parent() }}
    <h1>Listado de cineastas con Paginación</h1>
     {% for flashMessage in app.session.flashbag.get('mensaje') %}
        <span class="alert-success">
            {{ flashMessage }}
            <hr />
        </span>
    {% endfor %}
    <hr />
    <table class="table table-bordered">
        <tbody>
             <th>Nombre</th>
        </tbody>
        {% for dato in datos %}
            <tr>
                <td>{{dato.nombre}}</td>
                <td>
                      <a href="{{ path('editCineasta', {'id':dato.id}) }}" title="Editar">Editar</a>
                    -
                    <a onclick="return eliminarCineasta({{ dato.id }},'{{ dato.nombre }}');" href="{{ path('delCineasta', {'id':dato.id}) }}" title="Eliminar">Eliminar</a>
                </td>
            </tr>
        {% endfor %}
       
        {# PAGINACION #}
        <tr>
            <td colspan="3" style="text-align: right;">
                <ul class="pagination">
                    {% for i in 1.. totalPaginas %}
                        {% if loop.first %}
                            <li {% if page == 1%} class="disabled" {% endif %}>
                              <a href="{{path('listarCineastas')}}?page={{page-1}}" aria-label="Previous">
                                <span aria-hidden="true">&laquo;</span>
                              </a>
                            </li>
                        {%endif%}
                       
                        <li {% if page == loop.index %}  class="active" {% endif %}>
                            <a href="{{path('listarCineastas')}}?page={{loop.index}}">{{loop.index}}</a>
                        </li>
                       
                        {%if loop.last %}                                                  
                            <li {% if page == totalPaginas%} class="disabled" {% endif %}>
                              <a href="{{path('listarCineastas')}}?page={{page+1}}" aria-label="Next">
                                <span aria-hidden="true">&raquo;</span>
                              </a>
                            </li>
                        {% endif %}
                    {% endfor %}
                 </ul>
            </td>
        </tr>
     </table>
   
    <script>
    function eliminarCineasta(idCineasta, nombre) {
        if (confirm("¿Estás seguro de querer eliminar el cineasta "+nombre+"?"))
            return true;
        else
            return false;
    }
    </script>
 {% endblock %}

No hay comentarios:

Publicar un comentario