Skip to content

Instantly share code, notes, and snippets.

@anboo
Created January 11, 2017 08:04
Show Gist options
  • Save anboo/b01a49240323e5ad44b75c0372dc3810 to your computer and use it in GitHub Desktop.
Save anboo/b01a49240323e5ad44b75c0372dc3810 to your computer and use it in GitHub Desktop.
LexikFormFilterHelper
<?php
/**
* Created by PhpStorm.
* User: anboo
* Date: 11.01.17
* Time: 10:48
*/
namespace AppBundle\Service\Filter;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query;
use JMS\DiExtraBundle\Annotation as DI;
use Knp\Component\Pager\PaginatorInterface;
use Lexik\Bundle\FormFilterBundle\Filter\FilterBuilderUpdaterInterface;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\HttpFoundation\Request;
/**
* Class FilterFactory
* @package AppBundle\Service\Filter
* @DI\Service("app.filter_factory")
*/
class FilterFactory
{
/**
* @var Request
*/
private $request;
/**
* @var AbstractType
*/
private $form;
/**
* @var EntityRepository
*/
private $entityRepository;
/**
* @var PaginatorInterface
*/
private $paginator;
/**
* @var FilterBuilderUpdaterInterface
*/
private $builderUpdater;
/**
* @var Query
*/
private $query;
/**
* @return PaginatorInterface
*/
public function getPaginator()
{
return $this->paginator;
}
/**
* @param PaginatorInterface $paginator
* @return $this
*/
public function setPaginator($paginator)
{
$this->paginator = $paginator;
return $this;
}
/**
* @return EntityRepository
*/
public function getEntityRepository()
{
return $this->entityRepository;
}
/**
* @param EntityRepository $entityRepository
* @return $this
*/
public function setEntityRepository($entityRepository)
{
$this->entityRepository = $entityRepository;
return $this;
}
/**
* @return Request
*/
public function getRequest()
{
return $this->request;
}
/**
* @param Request $request
* @return $this
*/
public function setRequest($request)
{
$this->request = $request;
return $this;
}
/**
* @return AbstractType
*/
public function getForm()
{
return $this->form;
}
/**
* @param AbstractType $form
* @return $this
*/
public function setForm($form)
{
$this->form = $form;
return $this;
}
/**
* FilterFactory constructor.
* @param PaginatorInterface $paginator
* @DI\InjectParams({
* "paginator":@DI\Inject("knp_paginator"),
* "builderUpdater":@DI\Inject("lexik_form_filter.query_builder_updater")
* })
*/
public function __construct(PaginatorInterface $paginator, FilterBuilderUpdaterInterface $builderUpdater)
{
$this->paginator = $paginator;
$this->builderUpdater = $builderUpdater;
}
/**
* @return $this
*/
public function createFilter()
{
if ($this->request->query->has($this->form->getName())) {
$this->form->submit($this->request->query->get($this->form->getName()));
$filterBuilder = $this->entityRepository->createQueryBuilder('user');
$this->builderUpdater->addFilterConditions($this->form, $filterBuilder);
$this->query = $filterBuilder->getQuery();
} else {
$this->query = $this->entityRepository->createQueryBuilder('user')
->getQuery();
}
return $this;
}
/**
* @return Query
*/
public function getQuery()
{
return $this->query;
}
/**
* @return \Knp\Component\Pager\Pagination\PaginationInterface
*/
public function getPagination()
{
$pagination = $this->paginator->paginate(
$this->query,
$this->request->query->get('page', 1)/*page number*/,
10/*limit per page*/,
['wrap-queries' => true]
);
return $pagination;
}
}
@anboo
Copy link
Author

anboo commented Jan 11, 2017

Get pagination:

$pagination = $filter->setEntityRepository($repository)
                         ->setForm(new UserFilter)
                         ->setRequest($request)
                         ->createFilter()
                         ->getPagination();

Get Query:

$query = $filter->setEntityRepository($repository)
                         ->setForm(new UserFilter)
                         ->setRequest($request)
                         ->createFilter()
                         ->getQuery();

@anboo
Copy link
Author

anboo commented Jan 11, 2017

     /**
     * @Route("/search", name="app_user_search")
     */
    public function searchAction(Request $request)
    {
        $repository = $this->getDoctrine()
            ->getRepository('AppBundle:User');
        $form = $this->get('form.factory')->create(UserFilter::class);

        $filter = $this->get('app.filter_factory');
        $pagination = $filter->setEntityRepository($repository)
                             ->setForm(new UserFilter)
                             ->setRequest($request)
                             ->createFilter()
                             ->getPagination();

        return $this->render(':user:search.html.twig', [
            'form'     => $form->createView(),
            'users'    => $pagination,
            'is_empty' => $pagination->getTotalItemCount() < 1
        ]);
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment