public function testPaginatorGroupBy()
 {
     // create queryBuilder
     $em = $this->getEntityManager();
     $repository = $em->getRepository('Kitpages\\DataGridBundle\\Tests\\TestEntities\\Node');
     $queryBuilder = $repository->createQueryBuilder("node");
     $queryBuilder->select("node.user, count(node.id) as cnt");
     $queryBuilder->groupBy("node.user");
     // create EventDispatcher mock
     $service = $this->getMock('Symfony\\Component\\EventDispatcher\\EventDispatcher');
     // create Request mock (ok this is not a mock....)
     $request = new \Symfony\Component\HttpFoundation\Request();
     $_SERVER["REQUEST_URI"] = "/foo";
     // create gridManager instance
     $paginatorManager = $this->getPaginatorManager();
     // configure paginator
     $paginatorConfig = new PaginatorConfig();
     $paginatorConfig->setCountFieldName("node.user");
     $paginatorConfig->setItemCountInPage(3);
     // get paginator
     $paginatorConfig->setQueryBuilder($queryBuilder);
     $paginator = $paginatorManager->getPaginator($paginatorConfig, $request);
     // tests
     $this->assertEquals(6, $paginator->getTotalItemCount());
     $this->assertEquals(2, $paginator->getTotalPageCount());
     $this->assertEquals(array(1, 2), $paginator->getPageRange());
     $this->assertEquals(1, $paginator->getCurrentPage());
     $this->assertEquals(2, $paginator->getNextButtonPage());
 }
 public function initGridConfig()
 {
     // configure paginator
     $paginatorConfig = new PaginatorConfig();
     $paginatorConfig->setCountFieldName("node.id");
     $paginatorConfig->setItemCountInPage(3);
     $gridConfig = new GridConfig();
     $gridConfig->setPaginatorConfig($paginatorConfig);
     $gridConfig->setCountFieldName("node.id");
     $gridConfig->addField(new Field("node.id"))->addField(new Field("node.createdAt", array("sortable" => true, "formatValueCallback" => function ($value) {
         return $value->format("Y/m/d");
     })));
     $gridConfig->addField(new Field("node.content", array("formatValueCallback" => function ($value, $row) {
         return $value . ":" . $row["createdAt"]->format("Y");
     })));
     $gridConfig->addField(new Field("node.user", array("filterable" => true)));
     return $gridConfig;
 }
 /**
  * get grid object filled
  *
  * @param  \Kitpages\DataGridBundle\Grid\GridConfig $gridConfig
  * @param  \Symfony\Component\HttpFoundation\Request $request
  * @return \Kitpages\DataGridBundle\Grid\Grid
  */
 public function getGrid(GridConfig $gridConfig, Request $request)
 {
     $queryBuilder = $gridConfig->getQueryBuilder();
     // create grid objet
     $grid = new Grid();
     $grid->setGridConfig($gridConfig);
     $grid->setUrlTool(new UrlTool());
     $grid->setRequestUri($request->getRequestUri());
     $grid->setRequestCurrentRoute($request->attributes->get("_route"));
     $grid->setRequestCurrentRouteParams($request->attributes->get("_route_params"));
     $grid->setDispatcher($this->dispatcher);
     // create base request
     $gridQueryBuilder = clone $queryBuilder;
     // Apply filters
     $filter = $request->query->get($grid->getFilterFormName(), "");
     $this->applyFilter($gridQueryBuilder, $grid, $filter);
     // Apply selector
     $selectorField = $request->query->get($grid->getSelectorFieldFormName(), "");
     $selectorValue = $request->query->get($grid->getSelectorValueFormName(), "");
     $this->applySelector($gridQueryBuilder, $grid, $selectorField, $selectorValue);
     // Apply sorting
     $sortField = $request->query->get($grid->getSortFieldFormName(), "");
     $sortOrder = $request->query->get($grid->getSortOrderFormName(), "");
     $this->applySort($gridQueryBuilder, $grid, $sortField, $sortOrder);
     // build paginator
     $paginatorConfig = $gridConfig->getPaginatorConfig();
     if ($paginatorConfig === null) {
         $paginatorConfig = new PaginatorConfig();
         $paginatorConfig->setCountFieldName($gridConfig->getCountFieldName());
         $paginatorConfig->setName($gridConfig->getName());
         $paginatorConfig->setQueryBuilder($gridQueryBuilder);
     }
     if (is_null($paginatorConfig->getQueryBuilder())) {
         $paginatorConfig->setQueryBuilder($gridQueryBuilder);
     }
     $paginator = $this->paginatorManager->getPaginator($paginatorConfig, $request);
     $grid->setPaginator($paginator);
     // calculate limits
     $gridQueryBuilder->setMaxResults($paginator->getPaginatorConfig()->getItemCountInPage());
     $gridQueryBuilder->setFirstResult(($paginator->getCurrentPage() - 1) * $paginator->getPaginatorConfig()->getItemCountInPage());
     // send event for changing grid query builder
     $event = new DataGridEvent();
     $event->set("grid", $grid);
     $event->set("gridQueryBuilder", $gridQueryBuilder);
     $event->set("request", $request);
     $this->dispatcher->dispatch(KitpagesDataGridEvents::ON_GET_GRID_QUERY, $event);
     if (!$event->isDefaultPrevented()) {
         // execute request
         $query = $gridQueryBuilder->getQuery();
         $event->set("query", $query);
     }
     $this->dispatcher->dispatch(KitpagesDataGridEvents::AFTER_GET_GRID_QUERY, $event);
     // hack : recover query from the event so the developper can build a new grid
     // from the gridQueryBuilder in the listener and reinject it in the event.
     $normalizedItemList = $this->itemListNormalizer->normalize($event->get("query"), $event->get("gridQueryBuilder"), $this->hydratorClass);
     // end normalization
     $grid->setItemList($normalizedItemList);
     return $grid;
 }
 public function getUrl($key, $val)
 {
     return $this->urlTool->changeRequestQueryString($this->requestUri, $this->paginatorConfig->getRequestQueryName($key), $val);
 }
 /**
  * get Paginator object
  *
  * @param  \Kitpages\DataGridBundle\Paginator\PaginatorConfig $paginatorConfig
  * @param  \Symfony\Component\HttpFoundation\Request      $request
  * @return \Kitpages\DataGridBundle\Paginator\Paginator
  */
 public function getPaginator(PaginatorConfig $paginatorConfig, Request $request)
 {
     $queryBuilder = $paginatorConfig->getQueryBuilder();
     // insert default values in paginator config
     $paginatorConfig = clone $paginatorConfig;
     if (is_null($paginatorConfig->getItemCountInPage())) {
         $paginatorConfig->setItemCountInPage($this->paginatorParameterList["item_count_in_page"]);
     }
     if (is_null($paginatorConfig->getVisiblePageCountInPaginator())) {
         $paginatorConfig->setVisiblePageCountInPaginator($this->paginatorParameterList["visible_page_count_in_paginator"]);
     }
     // create paginator object
     $paginator = new Paginator();
     $paginator->setPaginatorConfig($paginatorConfig);
     $paginator->setUrlTool(new UrlTool());
     $paginator->setRequestUri($request->getRequestUri());
     // get currentPage
     $paginator->setCurrentPage($request->query->get($paginatorConfig->getRequestQueryName("currentPage"), 1));
     // calculate total object count
     $countQueryBuilder = clone $queryBuilder;
     $countQueryBuilder->select("count(DISTINCT " . $paginatorConfig->getCountFieldName() . ")");
     $countQueryBuilder->setMaxResults(null);
     $countQueryBuilder->setFirstResult(null);
     $countQueryBuilder->resetDQLPart('groupBy');
     $countQueryBuilder->resetDQLPart('orderBy');
     // event to change paginator query builder
     $event = new DataGridEvent();
     $event->set("paginator", $paginator);
     $event->set("paginatorQueryBuilder", $countQueryBuilder);
     $event->set("request", $request);
     $this->dispatcher->dispatch(KitpagesDataGridEvents::ON_GET_PAGINATOR_QUERY, $event);
     if (!$event->isDefaultPrevented()) {
         $query = $countQueryBuilder->getQuery();
         $event->set("query", $query);
     }
     $this->dispatcher->dispatch(KitpagesDataGridEvents::AFTER_GET_PAGINATOR_QUERY, $event);
     // hack : recover query from the event so the developper can build a new query
     // from the paginatorQueryBuilder in the listener and reinject it in the event.
     $query = $event->get("query");
     try {
         $totalCount = $query->getSingleScalarResult();
         $paginator->setTotalItemCount($totalCount);
     } catch (\Doctrine\ORM\NoResultException $e) {
         $paginator->setTotalItemCount(0);
     }
     // calculate total page count
     if ($paginator->getTotalItemCount() == 0) {
         $paginator->setTotalPageCount(0);
     } else {
         $paginator->setTotalPageCount((int) (($paginator->getTotalItemCount() - 1) / $paginatorConfig->getItemCountInPage() + 1));
     }
     // change current page if needed
     if ($paginator->getCurrentPage() > $paginator->getTotalPageCount()) {
         $paginator->setCurrentPage(1);
     }
     // calculate nbPageLeft and nbPageRight
     $nbPageLeft = (int) ($paginatorConfig->getVisiblePageCountInPaginator() / 2);
     $nbPageRight = $paginatorConfig->getVisiblePageCountInPaginator() - 1 - $nbPageLeft;
     // calculate lastPage to display
     $maxPage = min($paginator->getTotalPageCount(), $paginator->getCurrentPage() + $nbPageRight);
     // adapt minPage and maxPage
     $minPage = max(1, $maxPage - ($paginatorConfig->getVisiblePageCountInPaginator() - 1));
     $maxPage = min($paginator->getTotalPageCount(), $minPage + ($paginatorConfig->getVisiblePageCountInPaginator() - 1));
     $paginator->setMinPage($minPage);
     $paginator->setMaxPage($maxPage);
     // calculate previousButton
     if ($paginator->getCurrentPage() == 1) {
         $paginator->setPreviousButtonPage(null);
     } else {
         $paginator->setPreviousButtonPage($paginator->getCurrentPage() - 1);
     }
     // calculate nextButton
     if ($paginator->getCurrentPage() == $paginator->getTotalPageCount()) {
         $paginator->setNextButtonPage(null);
     } else {
         $paginator->setNextButtonPage($paginator->getCurrentPage() + 1);
     }
     return $paginator;
 }