Ejemplo para filtrar con KnpPaginatorBundle

669 views
Skip to first unread message

Felix

unread,
Jun 26, 2013, 9:34:23 AM6/26/13
to symfo...@googlegroups.com
Hola:
Estoy haciendo una aplicación con Symfony 2.3 y ya logré que KnpPaginatorBundle me paginara los resultados.
En la documentación de KnpPaginatorBundle dice que también puede filtrar pero no encuentro un ejemplo de como se hace a pesar de que he buscado bastante.

¿Alguien tiene un ejemplo del filtrado?
¿Existe algún otro bundle que se pueda integrar con este para filtrar o hay otro mejor para paginar?

Pablo Braulio

unread,
Jun 26, 2013, 9:51:50 AM6/26/13
to Lista de symfony
Parece que no han puesto ningún ejemplo en la documentación. Y por lo que en las issues de github, hace tiempo que se reclama el ejemplo.

El desarrollador escribió esto.

well, there are 2 ways to do it,

  • one to have code in the controller to check the query params and modify the query builder.
  • another one to have a subscriber to modify the query or query builder.

and filter selection which would be controlled by javascript to trigger generated urls.

But in overall, if making those abstract, it would be hard to customize, for example have AND or OR filters. So my advice is to have it in the controller, etc based on query parameters, modify the query. and in template just merge the route parameters for new urls, like pagination template does. This way you would be able to achieve more custom results, which in general I do not see the point to abstract, or make it a part of paginator. Sorting is more predictable.


Saludos cordiales.
Pablo.

Si lo reenvías, ten la precaución de borrar los datos de procedencia que
encabezarían tu reenvío – empezando por mi dirección de correo
electrónico - . Coloca siempre las direcciones de tus contactos en el
campo <CCO> para que viajen discretas, no en el campo <Para> ni en
el<CC>. De esa forma nadie que lo reciba tendrá constancia de las señas
de los demás destinatarios a los que también se remite. Todo ello a fin
de evitar que nadie se aproveche de todas las direcciones que se van
acumulando al pasar de buzón a buzón para el lanzamiento de correo
basura y otras indeseadas lindezas. Aparte claro está de garantizar la
privacidad.




--
--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Google Groups.
Para publicar en este grupo, envía un email a symfo...@googlegroups.com
Para darte de baja, envía un email a symfony-es+...@googlegroups.com
El resto de opciones puedes encontrarlas en http://groups.google.com/group/symfony-es?hl=es
 
---
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a symfony-es+...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.
 
 

Felix

unread,
Jun 26, 2013, 10:09:39 AM6/26/13
to symfo...@googlegroups.com
Ya había visto esa parte, pero como estoy empezando con symfony no tengo claro de como hacerlo. Quería saber si alguien lo había hecho y no inventarlo de nuevo. Me imaginaba que es un requerimiento muy común.
Muchas gracias.

Pablo Braulio

unread,
Jun 26, 2013, 10:23:53 AM6/26/13
to Lista de symfony
Pensando bien en lo que dice, creo que el caso es muy sencillo.
Bastaría con añadir en el listado el formulario del filtro y luego al procesarlo se recogen los valores y campos y se construye la query que se pasa al paginator.
No tiene mucha complicación.

Saludos cordiales.
Pablo.

Si lo reenvías, ten la precaución de borrar los datos de procedencia que
encabezarían tu reenvío – empezando por mi dirección de correo
electrónico - . Coloca siempre las direcciones de tus contactos en el
campo <CCO> para que viajen discretas, no en el campo <Para> ni en
el<CC>. De esa forma nadie que lo reciba tendrá constancia de las señas
de los demás destinatarios a los que también se remite. Todo ello a fin
de evitar que nadie se aproveche de todas las direcciones que se van
acumulando al pasar de buzón a buzón para el lanzamiento de correo
basura y otras indeseadas lindezas. Aparte claro está de garantizar la
privacidad.


El 26 de junio de 2013 16:09, Felix <supe...@gmail.com> escribió:
Ya había visto esa parte, pero como estoy empezando con symfony no tengo claro de como hacerlo. Quería saber si alguien lo había hecho y no inventarlo de nuevo. Me imaginaba que es un requerimiento muy común.
Muchas gracias.

Felix

unread,
Jun 26, 2013, 10:28:32 AM6/26/13
to symfo...@googlegroups.com
Muchas gracias. Voy a estudiar como se hace. A seguir aprendiendo.

Felix

unread,
Jun 27, 2013, 9:53:00 AM6/27/13
to symfo...@googlegroups.com
Ya logré hacerlo. No estará bonito pero funciona.

-------------------------------------------------------------------------------------------------------------------
En el archivo CatConceptoController.php
-------------------------------------------------------------------------------------------------------------------
    /**
     * Lists all CatConcepto entities.
     *
     * @Route("/", name="catconcepto")
     * @Method("GET")
     * @Template()
     */
    public function indexAction()
    {
        $data = array();
        $defaultData = array();
        $form = $this->createFormBuilder($defaultData,array('attr' => array('id' => 'fitro', 'class' => 'filtro')))
            ->setAction($this->getRequest()->getRequestUri())
            ->setMethod('GET')
            ->add('cat', 'text', array('required' => false, 'label' => false))
            ->add('Filtrar', 'submit')
            ->getForm();

        $form->handleRequest($this->getRequest());

        if ($form->isValid()) {
            // data is an array with "cat" keys
            $data = $form->getData();
        }

        $em = $this->getDoctrine()->getManager();
        $query = $em->getRepository('MiBundle:CatConcepto')->queryAll($data);

        $paginator = $this->get('knp_paginator');

        $pagination = $paginator->paginate($query, $this->getRequest()->query->get('page', 1), 10);

        return array('pagination' => $pagination, 'form' => $form->createView());
    }
-------------------------------------------------------------------------------------------------------------------
En el archivo CatConceptoRepository.php
-------------------------------------------------------------------------------------------------------------------
use Doctrine\ORM\EntityRepository;

/**
 * CatConceptoRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class CatConceptoRepository extends EntityRepository
{
    public function queryAll(array $valores = array())
    {
        $em = $this->getEntityManager();
        $qb = $em->createQueryBuilder();
        $qb->select('a');
        $qb->from('MiBundle:CatConcepto', 'a');

        if (array_key_exists("cat", $valores))
        {
            $valores['cat'] = trim($valores['cat']);
            if (strlen($valores['cat'])>0)
            {
                $qb->where($qb->expr()->like("a.categoria", "?1"));
                $qb->setParameter(1,"%".$valores['cat']."%");
            }
        }

        $consulta = $qb->getQuery();
        return $consulta;
    }
}
-----------------------------------------------------------------------------------------------------------
En el archivo html.twig agregué
-----------------------------------------------------------------------------------------------------------
{{ form(form) }}
Reply all
Reply to author
Forward
0 new messages