Created
January 11, 2017 08:04
-
-
Save anboo/b01a49240323e5ad44b75c0372dc3810 to your computer and use it in GitHub Desktop.
LexikFormFilterHelper
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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; | |
} | |
} |
/**
* @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
Get pagination:
Get Query: